Excel VBA故障1004:方法范围对象\u工作表失败

Excel VBA故障1004:方法范围对象\u工作表失败,excel,vba,Excel,Vba,我有一个宏,无论哪个工作表处于活动状态,它都应该运行。但是,它仅在工作表“数据”处于活动状态时运行。我一直在试图找出问题所在,但找不到解决办法。 到目前为止,我已经检查了所有声明。我还尝试过按照一些解决方案中的建议完全声明我的范围。 其他解决方案将代码放在工作表中视为问题?但我的代码在工作簿的模块1中。就像我所有的宏一样,我怀疑这是个问题 我想我没有正确地声明最后一个范围,但我不知道我做错了什么 最后的声明(rng_nw)给我带来了麻烦 Sub test() Dim rapport As Wor

我有一个宏,无论哪个工作表处于活动状态,它都应该运行。但是,它仅在工作表“数据”处于活动状态时运行。我一直在试图找出问题所在,但找不到解决办法。 到目前为止,我已经检查了所有声明。我还尝试过按照一些解决方案中的建议完全声明我的范围。 其他解决方案将代码放在工作表中视为问题?但我的代码在工作簿的模块1中。就像我所有的宏一样,我怀疑这是个问题

我想我没有正确地声明最后一个范围,但我不知道我做错了什么

最后的声明(rng_nw)给我带来了麻烦

Sub test()
Dim rapport As Worksheet
Dim data As Worksheet
Dim wb As Workbook
Dim cur_rng As Range
Dim sel_cel_2 As Range
Dim sel_cel_1 As Range
Dim rng_nw As Range

Set wb = ThisWorkbook
Set rapport = wb.Sheets("rapport")
Set data = wb.Sheets("data")
Set cur_rng = data.Range("A2").CurrentRegion
Set sel_cel_2 = Cells(cur_rng.Rows.Count, cur_rng.Columns.Count)
Set sel_cel_1 = data.Range("k2").End(xlDown).Offset(1, 0)
Set rng_nw = Sheets("data").Range(sel_cel_2, sel_cel_1)
'Set rng_nw = data.Range(sel_cel_2, sel_cel_1)

End Sub
此宏位于我的工作簿的模块1中。当然,这不是完整的宏,只是给我带来麻烦的声明。在这个小测试宏中,它们同样麻烦;)

提前感谢您的帮助

完整的宏如下所示,大多数注释都是荷兰语:

Sub Data_verversen()
'
' Data_verversen Macro
' De macro kopieert alle data uit blad rapport naar blad data en haalt vervolgens de duplicaten weg obv deal nummer'

'
Dim rapport As Worksheet
Dim data As Worksheet
Dim wb As Workbook
Dim plakpositie As Range
Dim r_sel1 As Range
Dim r_sel As Range
Dim d_sel As Range
Dim lastcol As Long
Dim lastrow As Long
Dim cur_rng As Range
Dim sel_cel_2 As Range
Dim sel_cel_1 As Range
Dim rng_nw As Range

Set wb = ThisWorkbook
Set rapport = wb.Sheets("rapport")
Set data = wb.Sheets("data")
Set plakpositie = data.Range("A1").End(xlDown).Offset(1, 0)
    'De range r_sel wijs ik in 2 stappen toe. Dat doe ik omdat de resize functie ook de range verwijzing nodig heeft en ik anders veel uit moet schrijven.
Set r_sel1 = rapport.Range("A2").CurrentRegion.Offset(1, 0)
Set r_sel = r_sel1.Resize(r_sel1.Rows.Count - 1, r_sel1.Columns.Count)

    'to import data from Salesforce   (user has to be logged in through the salesforce.com ribbon) (connection cannot be set to background refresh)
    '--------------------------------------------------------------------------------------------
    ThisWorkbook.RefreshAll

    'this makes sure all calculations for the updated data are finished before the rest of the code proceeds
    Application.Calculate

    If Not Application.CalculationState = xlDone Then
        DoEvents
    End If


    'to stop the screen from updating for all the steps in this script
    Application.ScreenUpdating = False

    'Hier kopieer ik de gegevens uit range r_sel in range plakpositie. (hij plakt waarden en getalnotaties)
    r_sel.Copy
    plakpositie.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    'Ik wijs de range om duplicaten uit te verwijderen pas toe na de plakactie. Doe je dat eerder, dan bepaal je een range zonder de nieuw geplakte data
Set d_sel = data.Range("A1").CurrentRegion
    'vervolgens laat ik uit de toegewezen range de duplicaten verwijderen
    d_sel.RemoveDuplicates Columns:=1, Header:=xlYes

    data.Columns(4).NumberFormat = "m/d/yyyy"

'onderstaande set verlengd kolom K met een formule om het segment te bepalen, vervolgens worden de uitkomsten weer in waarde omgezet.
    'de formule ziet er zo uit: =DEEL(B366;VIND.ALLES("_";B366;1)+1;((VIND.ALLES("_";B366;8)-1)-VIND.ALLES("_";B366;1)))

Set cur_rng = data.Range("A2").CurrentRegion
Set sel_cel_2 = Cells(cur_rng.Rows.Count, cur_rng.Columns.Count)
Set sel_cel_1 = data.Range("k2").End(xlDown).Offset(1, 0)
'Set rng_nw = ThisWorkbook.Sheets("data").Range(sel_cel_2, sel_cel_1)
Set rng_nw = data.Range(sel_cel_2, sel_cel_1)


    rng_nw.FormulaR1C1 = _
        "=MID(RC[-9],FIND(""_"",RC[-9],1)+1,((FIND(""_"",RC[-9],8)-1)-FIND(""_"",RC[-9],1)))"

    Application.Calculate

    If Not Application.CalculationState = xlDone Then
        DoEvents
    End If

    rng_nw.Copy
    rng_nw.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Application.ScreenUpdating = True


End Sub

设置sel\u cel\u 2=单元格(cur\u rng.Rows.Count、cur\u rng.Columns.Count)
-您不确定要引用哪个工作表。这似乎确实解决了问题!thnx。我现在已经编写了如下代码:
Set sel\u cel\u 2=data.Cells(cur\u rng.Rows.Count,cur\u rng.Columns.Count)
只有一件事我不明白。如果我使用rng_nw。复制,它可以从每一页开始工作。但是如果我使用rng_nw.Select,它只在工作表“数据”处于活动状态时工作。为什么这两个函数的行为会有所不同?要使用Select,我相信您必须在该工作表上——因此,如果您先激活data.Activate,然后再激活rng_nw.Select,它应该会工作。但是您可以在任何地方调用/使用Copy命令。这就是他们行为不同的原因。解释清楚。谢谢