Excel Vba:使用表名作为变量

Excel Vba:使用表名作为变量,excel,vba,Excel,Vba,我正在尝试将一个表的内容复制到另一个表。在这个过程中,我只复制了一些列。抱歉,如果我的问题太基本,因为我是Excel VBA新手 Dim tableName As ListObject Set tableName = Worksheets("DataSource").ListObjects(1) [Table1[TaskUID]].Copy [tableName[TaskUID]] 第3行正在抛出所需的错误对象 任何人都可以帮助使用实际表名的语法: 可以使用范围换行并使用实际的表名。您实际上是

我正在尝试将一个表的内容复制到另一个表。在这个过程中,我只复制了一些列。抱歉,如果我的问题太基本,因为我是Excel VBA新手

Dim tableName As ListObject
Set tableName = Worksheets("DataSource").ListObjects(1)
[Table1[TaskUID]].Copy [tableName[TaskUID]]
第3行正在抛出所需的错误对象

任何人都可以帮助使用实际表名的语法

可以使用范围换行并使用实际的表名。您实际上是在命名范围上调用.Copy方法。因此,如果它们在同一张表中,例如:

With ActiveSheet

    .Range("Table1[TaskUID]").Copy .Range("Table2[TaskUID]")

End With
如果目标位于其他图纸中,则始终可以使用图纸名称限定目标

或按表变量的列数:

由于需要用于复制目标的范围,如果您知道要粘贴到的表变量的列号,也可以使用表变量名称进行写入,例如:

.Range("Table1[TaskUID]").Copy  tableName.DataBodyRange.Columns(2) 'or which ever column
或按表变量的列名:

您可以将tableName.ListColumnsTaskUID.DataBodyRange放在它自己的变量中,然后引用它,例如

Dim rng As Range
Set rng = tableName.ListColumns("TaskUID").DataBodyRange

.Range("Table1[TaskUID]").Copy rng

编辑:正如GSerg指出的,您不能在内部使用变量名。Range将无法找到名为tableName的表,因为该表是变量的名称,而不是表的名称

该表不起作用的原因是,使用方括号[]类似于调用应用程序。请对方括号内的表达式求值,因此不能在其中使用局部变量名,因为要计算表达式的对象不知道它们。它找不到名为tableName的列表对象

可以避免使用括号,但始终应:

Dim tableName As ListObject
Set tableName = Worksheets("DataSource").ListObjects(1)

ListObjects("Table1").ListColumns("TaskUID").DataBodyRange.Copy tableName.ListColumns("TaskUID").DataBodyRange

是否尝试将Table1列TaskUID复制到tableName TaskUID列?另外,在设置tableName时,您是否可以使用表的实际名称而不是索引来明确您使用的对象?它们是否在同一张表中?否,它们在不同的表中。但是,如果我用实际的表名替换表名,它就会工作。我只是想看看如何使用局部变量。请看下面的答案。请看第二个示例sheetName。RangetableName[TaskUID]与原始OP的代码不起作用的原因相同。Range将无法找到名为tableName的表,因为这是变量的名称,而不是表的名称。您的第一个示例可以使用,但这只是因为您使用的是硬编码的表名Table1和Table2,而不是变量名,此时它将作为[Table1[TaskUID]]使用。也可以复制[Table2[TaskUID].@GSerg这是一个很好的例子。感谢各种各样的场景,它确实帮助我找到最终的queryNo。当我找到解决方案时,它教会了我一些东西:-谢谢你的回答,看起来不错,但是当我使用listObjects时,我在运行时得到一个错误、子或函数未定义。你知道怎么解决吗it@PrashantBalasubramanyan显然,您是从常规模块调用它。然后将工作表放入包含表1的工作表中。在它前面。
Dim tableName As ListObject
Set tableName = Worksheets("DataSource").ListObjects(1)

ListObjects("Table1").ListColumns("TaskUID").DataBodyRange.Copy tableName.ListColumns("TaskUID").DataBodyRange