【问题标题】:Excel VBA Macro with run-time error '1004'带有运行时错误“1004”的 Excel VBA 宏
【发布时间】:2018-05-13 07:14:47
【问题描述】:

谁能帮我解决这个问题?对于这个特定的功能,它得到运行时错误 1004 为 "sheet1.Range("a1:a" & RowNbr).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=sheet1.Range("J1"), Unique:=True "

这是完整的代码:

Sub stock_exercise()
Dim RowNbr As Long
Dim uniqueticker As Long
Dim totalvolume As String
Dim r As Long
Dim sheet1 As Worksheet

Set sheet1 = ThisWorkbook.Sheets("A")'determine row count
RowNbr = sheet1.Range("A1", sheet1.Range("A1").End(xlDown)).Rows.Count

'copy and past unique ticker from column a to column j
sheet1.Range("a1:a" & RowNbr).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=sheet1.Range("J1"), Unique:=True

sheet1.Range("J1").Value = "ticker"
uniqueticker = sheet1.Range("j1", Range("j1").End(xlDown)).Rows.Count

'sumif of each ticker
For r = 2 To uniqueticker
    totalvolume = Application.SumIf(sheet1.Range("a1:a" & RowNbr),     sheet1.Cells(r, 10), sheet1.Range("g1:g" & RowNbr))
    sheet1.Cells(r, 11).Value = totalvolume
Next r
End Sub

【问题讨论】:

  • fwiw,它为我运行;生成一个唯一列表,包括从 a 列到 j 列的列标题标签。 (顺便说一句,edit 你的问题,选择你的代码并点击 ctrl+k)
  • 如果失败,RowNbr 有什么价值?
  • Excel 还将工作表CodeName 保持相同的格式。我会使用wksOne 之类的东西来代替sheet1。不过可能无法解决您的问题。

标签: vba excel runtime-error


【解决方案1】:

尝试清除正在复制高级过滤器值的目标单元格的内容,看看它是否有效。

Sub stock_exercise()
Dim RowNbr As Long
Dim uniqueticker As Long
Dim totalvolume As String
Dim r As Long
Dim wksOne As Worksheet

Set wksOne = ThisWorkbook.Sheets("A") 'determine row count
RowNbr = wksOne.Range("A1", wksOne.Range("A1").End(xlDown)).Rows.Count

'clear contents of destination cell before running the code
wksOne.Range("J1").CurrentRegion.ClearContents

'copy and past unique ticker from column a to column j
wksOne.Range("a1:a" & RowNbr).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=wksOne.Range("J1"), Unique:=True

wksOne.Range("J1").Value = "ticker"
uniqueticker = wksOne.Range("j1", Range("j1").End(xlDown)).Rows.Count

'sumif of each ticker
For r = 2 To uniqueticker
    totalvolume = Application.SumIf(wksOne.Range("a1:a" & RowNbr), wksOne.Cells(r, 10), wksOne.Range("g1:g" & RowNbr))
    wksOne.Cells(r, 11).Value = totalvolume
Next r
End Sub

【讨论】:

    【解决方案2】:

    当它失败时,选择调试并查看“立即窗口”。在即时窗口中,键入 ?RowNbr 并按 Enter。您将看到 RowNbr 的值...它可能为空(导致错误)。如果是,您可以在“立即”窗口中备份代码,例如在每一行中依次粘贴 ?在前。您可以检查范围是否符合您的预期、工作表甚至工作簿,例如?sheet1.name?thisworkbook.name

    您还可以粘贴每行的段,以检查其值是否符合预期,例如?sheet1.Range("a1:a" & RowNbr).address

    【讨论】:

      【解决方案3】:

      做了一些代码清理,下面的代码对我有用。我只测试了空标准范围,这意味着 K 列(代码中的第 11 列)填充了零值,因此如果您使用此代码再次出现 run-time error 1004,则表明问题出在此处。在这种情况下,请确保 SumIf 函数的条件范围内的所有值都有效。

      Sub stock_exercise()
          Dim r As Long, RowNbr As Long
          Dim uniqueticker As Long
          Dim rng As Range
          Dim sheet1 As Worksheet
      
          Application.ScreenUpdating = False
      
          Set sheet1 = ThisWorkbook.Sheets("A")
      
          With sheet1
      
              'determine row count
              RowNbr = .Range("A1", .Range("A1").End(xlDown)).Rows.Count
      
              Set rng = .Range("a1:a" & RowNbr)
      
              'copy and paste unique ticker from column a to column j
              rng.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("J2"), Unique:=True
      
              .Range("J1").Value = "ticker"
              uniqueticker = .Range("j1", Range("j1").End(xlDown)).Rows.Count - 1 ' minus one, since we insert from row two
      
              'sumif of each ticker
              For r = 2 To uniqueticker + 1
      
                  ' insert total volume
                  .Cells(r, 11).Value = Application.SumIf(rng, .Cells(r, 10), .Range("g1:g" & RowNbr))
              Next r
      
          End With
      
          Application.ScreenUpdating = True
      
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-18
        相关资源
        最近更新 更多