Excel Vba:使用表名作为变量

时间:2018-02-10 19:07:41

标签: excel excel-vba vba

我正在尝试将一个表的内容复制到另一个表中。在这个过程中我只复制一些列。很抱歉,如果我的问题太基础了,我不熟悉Excel VBA

Dim tableName As ListObject
Set tableName = Worksheets("DataSource").ListObjects(1)
[Table1[TaskUID]].Copy [tableName[TaskUID]]

第3行抛出错误" Object Required"

任何人都可以请求语法

2 个答案:

答案 0 :(得分:1)

它不起作用的原因是因为使用括号Application.Evaluate()就像在括号内的表达式上调用tableName一样,所以你不能在那里使用你的局部变量名,因为将评估表达式不知道他们。它找不到名为Dim tableName As ListObject Set tableName = Worksheets("DataSource").ListObjects(1) ListObjects("Table1").ListColumns("TaskUID").DataBodyRange.Copy tableName.ListColumns("TaskUID").DataBodyRange 的列表对象。

你可以避开括号(可以说,你总是应该):

fact:
slti $t0, $a0, 1        # test for n < 1
beq $t0, $zero, L1      # if n >= 1, go to L1
li  $v0, 1              # return 1
jr  $ra                 # return to instruction after jal

L1: 
addi    $sp, $sp, -8    # adjust stack for 2 items
sw  $ra, 4($sp) # save the return address
sw  $a0, 0($sp) # save the argument n

addi    $a0, $a0, -1    # n >= 1; argument gets (n – 1)
jal fact        # call fact with (n – 1)

lw  $a0, 0($sp) # return from jal: restore argument n
lw  $ra, 4($sp) # restore the return address
addi    $sp, $sp, 8 # adjust stack pointer to pop 2 items

mul $v0, $a0, $v0   # return n * fact (n – 1)

jr  $ra     # return to the caller

.text
main: 

la $a0, greet       # display greetings
li $v0, 3 
syscall         # syscall on print greetings

dri:    
la $a0, enter       # display message that asks reader 
li $v0, 3 
syscall         # system call on print question

li $v0, 6       # value of n is read
syscall         # system call

slt $t0, $v0, $zero     # condition of program end
bne $t0, $zero, close   # if user types a number less than zero it closes           
move $s0, $v0       # save value of n move $a0, $v0 # place value of n in $a0
jal fact        # call fact function
move $s1, $v0       # fact value is saved
move $a0, $s0       # result is displayed
li $v0, 1       # value of n is printed
syscall         # system call

la $a0, answer      # displays the textual portion of the answers
li $v0, 3               
syscall         # system call
move $a0, $s1       # print factorial
li $v0, 1 
syscall         # system call
la $a0, newline     # display newline
li $v0, 3 
syscall         # system call
j dri           # process is repeated until user decides

close: 
la $a0, bye     # farewell message
li $v0, 3 
syscall         # system call
li $v0, 10      # exit from the program 
syscall
.data
greet: .asciiz "Welcome to the factorial tester!\n"
enter: .asciiz "Enter a value for n (or a negative value to exit): "
answer: .asciiz "! is "
newline: .asciiz "\n"
bye: .asciiz "Come back soon!\n"

# end fact.s

答案 1 :(得分:0)

使用实际的表名:

您可以使用Range进行换行并使用实际表名称。您正在有效地调用命名范围上的.Copy方法。因此,如果他们在同一张纸上,例如:

With ActiveSheet

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

End With

如果目标位于另一个工作表中,您始终可以使用工作表名称限定目标。

或(按表变量的列号):

由于您需要一个范围用于复制目标,如果您知道要粘贴的表变量的列号,您还可以使用表变量名称来编写如下内容:

.Range("Table1[TaskUID]").Copy  tableName.DataBodyRange.Columns(2) 'or which ever column

或(按表变量的列名称):

.Range("Table1[TaskUID]").Copy tableName.ListColumns("TaskUID").DataBodyRange

您可以将tableName.ListColumns("TaskUID").DataBodyRange放在自己的变量中,然后参考它。例如。

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

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

编辑:正如GSerg指出的那样,你不能在里面使用变量名。 “Range将无法找到名为tableName的表,因为这是变量的名称,而不是表的名称”