【问题标题】:Can't specify the exact range in Excel vba macro无法在 Excel vba 宏中指定确切范围
【发布时间】:2014-08-19 12:38:07
【问题描述】:

今天是我在 Excel 中与 VBA 宏作斗争的第一天。我要做的就是指定一列,从中获取不同的值并将它们复制到另一列中,在不同的工作表上找到。我读了很多书,这就是我想出的:

Sub TestS()
    Dim lastRow As Long
    lastRow = Worksheets(3).Range("A" & Rows.count).End(xlUp).Row
    Worksheets(3).Range(Cells(3, 1), Cells(lastRow, 1)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Worksheets(2).Range("A3"), Unique:=True
End Sub

lastRow 当前指向正确的位置,但出现错误:

运行时错误 1004 提取范围的字段名称缺失或无效。

显然语法有问题,但我尝试了许多不同的方法,但都没有奏效。

【问题讨论】:

  • 对我来说没问题 - 究竟是什么错误?
  • Run-time error 1004 The extract range has a missing or invalid field name.
  • 顺便说一句,CopyToRange:=Worksheets(2).Range("A3") 意味着它将从 A3 开始,它将复制所有唯一元素,程序在指定列中找到了吗?
  • 否 - 这意味着它会将工作表 3 A 列中的唯一项目复制到工作表 2 中的 A3
  • 在这种情况下,如何指定从 A3 开始将它们复制到 sheet2 的 A 列中,以便第一个元素在 A3 中,第二个在 A4 中,依此类推?

标签: excel vba


【解决方案1】:

只需限定Cells():

Sub TestS()
    Dim lastRow As Long
    With Worksheets(3)
        lastRow = .Range("A" & Rows.Count).End(xlUp).Row
        .Range(.Cells(1, 1), .Cells(lastRow, 1)).AdvancedFilter _
            Action:=xlFilterCopy, _
            CopyToRange:=Worksheets(2).Range("A3"), Unique:=True
    End With
End Sub

【讨论】:

  • 确保我们引用了正确的工作表
  • 是的,在调试时我可以看到列的值并且是正确的。
【解决方案2】:

我建议使用简单的 SQL 查询来完成此类任务。通过这种方式,您可以建立与可以随时刷新的源工作表(如数据透视表)的连接,并且代码更加简单和灵活。查询:

SELECT DISTINCT * FROM [Sheet1$]

如何在 Excel 中使用 SQL?在“数据”功能区的“外部数据”部分中查找“Microsoft Query”。或者直接在这里下载我的 Excel 插件:http://blog.tkacprow.pl/?page_id=130

【讨论】:

  • 我正在从数据库中导出数据,因此我可以在那里完成所有操作,但我想学习如何在 vba 中编写宏。
猜你喜欢
  • 2019-08-13
  • 2020-07-21
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多