即时得到的对象变量或带块变量使用Excel VBA

问题描述:

进出口试图从我WeeklyDiet片到我DietStats片复制范围从一个片复制范围时到另一未设置错误。即时得到的对象变量或带块变量使用Excel VBA

在细胞WeeklyDiet的A1我进入周数如下例如WK1,WK2等

我要粘贴数据在A1当周美国DietStats.Range(无论行B4:B55 ),其中包含相当于周数的数据,例如,如果Wk2在A1中,我希望将数据粘贴到DietStats工作表的范围(B4:B55)中的任何行中包含Wk2。

即时得到一个对象变量或With块变量未设置错误消息。

Sub SaveDietMacrosForWeek() 

        Dim Ws1 As Worksheet 
        Dim Ws2 As Worksheet 
        Dim NR As Long 

        Set Ws1 = ActiveWorkbook.Sheets("WeeklyDiet") 
        Set Ws2 = ActiveWorkbook.Sheets("DietStats") 

        Dim Week As String 
        Week = Ws1.Range("A1") 
        NR = Ws2.Range("B4:B55").Find(Week).Row 

         Ws1.Range("E75:I75").Copy 
         Ws2.Range("K" & NR).PasteSpecial (xlPasteValues) 

         Ws1.Range("L75:P75").Copy 
         Ws2.Range("R" & NR).PasteSpecial (xlPasteValues) 

         Ws1.Range("S75:W75").Copy 
         Ws2.Range("Y" & NR).PasteSpecial (xlPasteValues) 

         Ws1.Range("Z75:AD75").Copy 
         Ws2.Range("AF" & NR).PasteSpecial (xlPasteValues) 

         Ws1.Range("AG75:AK75").Copy 
         Ws2.Range("AM" & NR).PasteSpecial (xlPasteValues) 

         Ws1.Range("AN75:AR75").Copy 
         Ws2.Range("AT" & NR).PasteSpecial (xlPasteValues) 

         Ws1.Range("AU75:AY75").Copy 
         Ws2.Range("BA" & NR).PasteSpecial (xlPasteValues) 

        ActiveWorkbook.Save 

        End Sub 
+1

,如果你说你在哪里得到的错误这将有助于。 – SJR

+0

会做。我忘了that.NR = Ws2.Range。( “B4:B55”)查找(周).Row – frustrationmultiplied

+0

最有可能的,'.Find(周)'没有找到周。 –

使用Applicatiopn.Match整列B对获得的行号。通过将返回值传递给变体,您将获得真正的行号或错误值。

Sub SaveDietMacrosForWeek() 

    Dim Ws1 As Worksheet 
    Dim Ws2 As Worksheet 
    Dim NR As Variant 

    Set Ws1 = ActiveWorkbook.Sheets("WeeklyDiet") 
    Set Ws2 = ActiveWorkbook.Sheets("DietStats") 

    Dim Week As String 
    Week = Ws1.Range("A1") 

    NR = Application.Match(Week, Ws2.Range("B:B"), 0) 

    If Not IsError(NR) Then 

     Ws2.Range("K" & NR).Resize(1, 5) = Ws1.Range("E75:I75").Value 
     Ws2.Range("R" & NR).Resize(1, 5) = Ws1.Range("L75:P75").Value 
     Ws2.Range("Y" & NR).Resize(1, 5) = Ws1.Range("S75:W75").Value 
     Ws2.Range("AF" & NR).Resize(1, 5) = Ws1.Range("Z75:AD75").Value 
     Ws2.Range("AM" & NR).Resize(1, 5) = Ws1.Range("AG75:AK75").Value 
     Ws2.Range("AT" & NR).Resize(1, 5) = Ws1.Range("AN75:AR75").Value 
     Ws2.Range("BA" & NR).Resize(1, 5) = Ws1.Range("AU75:AY75").Value 

    End If 
    ActiveWorkbook.Save 

End Sub 

我已经使用直接值转移而不是复制,粘贴特殊值。直接价值转移更有效,但需要与来源大小相同的目标。

+1

您是否想要将NR声明为Variant? – SJR

+0

是的,我做过。很好的接收和感谢! – Jeeped

+0

这工作完美。我不明白为什么Resize被使用。你能解释一下Application.Match如何使搜索工作。非常感谢你们帮助解决问题 – frustrationmultiplied

不知道周是什么,所以可能需要一些调整。

Sub SaveDietMacrosForWeek() 

Dim Ws1 As Worksheet 
Dim Ws2 As Worksheet 
Dim r As Range 
Dim NR As Long 
Dim Week As String 

Set Ws1 = ActiveWorkbook.Sheets("WeeklyDiet") 
Set Ws2 = ActiveWorkbook.Sheets("DietStats") 

Week = Ws1.Range("A1") 
Set r = Ws2.Range("B4:B55").Find(What:=Week, LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False) 

If Not r Is Nothing Then 
    NR = r.Row 
    'rest of code 
End If 

End Sub 
+0

我试过了代码,但它不起作用。在尝试之前我没有改变它。我不太清楚上面代码中其余代码的含义。与此同时,Jeeped的代码在下面工作。非常感谢您花时间帮忙 – frustrationmultiplied