VBA 循环填写 table 使用 DataBodyRange.Formula 覆盖前一行
VBA Loop to fill out a table using DataBodyRange.Formula overrides previous row
我在 2 个不同的工作簿中有 2 个 table。示例:
Table 1:
第 1 栏
第 2 栏
第 3 栏
第 4 栏
1
1
1
1
2
2
2
2
3
3
3
3
4
4
4
4
我正在尝试用第一个 table 的 link 填写第二个 table。我想要得到的:
Table2:
第 1 栏
第 2 栏
第 3 栏
第 4 栏
=link 到 table 1(1,1)
link 到 table 1(1,2)
link 到 table 1(1,3)
link 到 table 1(1,4)
=link 到 table 1(2,1)
link 到 table 1(2,2)
link 到 table 1(2,3)
link 到 table 1(2,4)
=link 到 table 1(3,1)
link 到 table 1(3,2)
link 到 table 1(3,3)
link 到 table 1(3,4)
=link 到 table 1(4,1)
link 到 table 1(4,2)
link 到 table 1(4,3)
link 到 table 1(4,4)
我的部分代码:
for i=1 to RowCount 'table1
Dest_row = DestTbl.ListRows.Count
Dest_column= DestTbl.Range.Columns.Count
Source_Column=1
for column=1 to Dest_column
Cell_addr=cells(i,Source_Column).address
table2.DataBodyRange(Dest_row,Column).Formula= "='[" & File_path & "]Sheet1'!" & Cell_addr
Source_Column= Source_Column+1
Next
Table2.listrows.add
Next
而不是 table 2 中的预期结果我得到以下 table:
第 1 栏
第 2 栏
第 3 栏
第 4 栏
=link 到 table 1(4,1)
link 到 table 1(4,2)
link 到 table 1(4,3)
link 到 table 1(4,4)
=link 到 table 1(4,1)
link 到 table 1(4,2)
link 到 table 1(4,3)
link 到 table 1(4,4)
=link 到 table 1(4,1)
link 到 table 1(4,2)
link 到 table 1(4,3)
link 到 table 1(4,4)
=link 到 table 1(4,1)
link 到 table 1(4,2)
link 到 table 1(4,3)
link 到 table 1(4,4)
当循环运行时,我可以看到最初 VBA 连续插入正确的 link,但是一旦循环进入第二行,第一行就会被第二行的信息覆盖排。然后当循环转到第 3 行时,前 2 行更改为第 3 行中的 link。
我已经想了一个星期了,所以我尝试插入一个单元格地址从第一个 table 到第二个 table 只是为了看看循环是否正常工作.它确实如此,但是当我添加“=”时,最后一行会覆盖所有前面的行。我完全迷路了。任何人都知道什么可能是一个问题?谢谢。
新答案
尝试替换此行:
table2.DataBodyRange(Dest_row,Column).Formula= "='[" & File_path & "]Sheet1'!" & Cell_addr
有:
table2.DataBodyRange(i,Column).Formula= "='[" & File_path & "]Sheet1'!" & Cell_addr
旧答案
(保留是因为我花了一些精力来弄清楚哪些部分不适合您。)
试试这个:
在你的第四行:
Source_Column=1
改为
Source_Column = i
或者,如果这不是您的问题,请检查您在内部循环中名为 column
的变量是否在顶部启动,然后与标题大小写一起使用 Column
,如果您将它们都设置为Columnn
或两者 column
,然后会发生什么。
我认为在这种情况下您不需要循环:
Sub FillTable2()
Dim Table1 As ListObject, Table2 As ListObject
' dummy data; the source workbook needs to be open
File_path = "source.xlsx"
Set Table1 = Workbooks(File_path).Sheets(1).ListObjects(1) 'get the source table
Set Table2 = ThisWorkbook.Sheets(1).ListObjects(1) 'get the destination table
If Not Table2.DataBodyRange Is Nothing Then Table2.DataBodyRange.Delete ' clear the destination table
'make the formula with the **external** relative address of the first cell in the Table1.DataBodyRange
frm = "=" & Table1.DataBodyRange(1).Address(external:=True, rowabsolute:=False, ColumnAbsolute:=False)
'insert formula to the whole target range; the table size will be automatically the size of the table will be automatically enlarged if necessary
Table2.InsertRowRange(1).Resize(Table1.ListRows.Count, Table1.ListColumns.Count).Formula = frm
End Sub
我在 2 个不同的工作簿中有 2 个 table。示例:
Table 1:
第 1 栏 | 第 2 栏 | 第 3 栏 | 第 4 栏 |
---|---|---|---|
1 | 1 | 1 | 1 |
2 | 2 | 2 | 2 |
3 | 3 | 3 | 3 |
4 | 4 | 4 | 4 |
我正在尝试用第一个 table 的 link 填写第二个 table。我想要得到的: Table2:
第 1 栏 | 第 2 栏 | 第 3 栏 | 第 4 栏 |
---|---|---|---|
=link 到 table 1(1,1) | link 到 table 1(1,2) | link 到 table 1(1,3) | link 到 table 1(1,4) |
=link 到 table 1(2,1) | link 到 table 1(2,2) | link 到 table 1(2,3) | link 到 table 1(2,4) |
=link 到 table 1(3,1) | link 到 table 1(3,2) | link 到 table 1(3,3) | link 到 table 1(3,4) |
=link 到 table 1(4,1) | link 到 table 1(4,2) | link 到 table 1(4,3) | link 到 table 1(4,4) |
我的部分代码:
for i=1 to RowCount 'table1
Dest_row = DestTbl.ListRows.Count
Dest_column= DestTbl.Range.Columns.Count
Source_Column=1
for column=1 to Dest_column
Cell_addr=cells(i,Source_Column).address
table2.DataBodyRange(Dest_row,Column).Formula= "='[" & File_path & "]Sheet1'!" & Cell_addr
Source_Column= Source_Column+1
Next
Table2.listrows.add
Next
而不是 table 2 中的预期结果我得到以下 table:
第 1 栏 | 第 2 栏 | 第 3 栏 | 第 4 栏 |
---|---|---|---|
=link 到 table 1(4,1) | link 到 table 1(4,2) | link 到 table 1(4,3) | link 到 table 1(4,4) |
=link 到 table 1(4,1) | link 到 table 1(4,2) | link 到 table 1(4,3) | link 到 table 1(4,4) |
=link 到 table 1(4,1) | link 到 table 1(4,2) | link 到 table 1(4,3) | link 到 table 1(4,4) |
=link 到 table 1(4,1) | link 到 table 1(4,2) | link 到 table 1(4,3) | link 到 table 1(4,4) |
当循环运行时,我可以看到最初 VBA 连续插入正确的 link,但是一旦循环进入第二行,第一行就会被第二行的信息覆盖排。然后当循环转到第 3 行时,前 2 行更改为第 3 行中的 link。
我已经想了一个星期了,所以我尝试插入一个单元格地址从第一个 table 到第二个 table 只是为了看看循环是否正常工作.它确实如此,但是当我添加“=”时,最后一行会覆盖所有前面的行。我完全迷路了。任何人都知道什么可能是一个问题?谢谢。
新答案
尝试替换此行:
table2.DataBodyRange(Dest_row,Column).Formula= "='[" & File_path & "]Sheet1'!" & Cell_addr
有:
table2.DataBodyRange(i,Column).Formula= "='[" & File_path & "]Sheet1'!" & Cell_addr
旧答案
(保留是因为我花了一些精力来弄清楚哪些部分不适合您。)
试试这个:
在你的第四行:
Source_Column=1
改为
Source_Column = i
或者,如果这不是您的问题,请检查您在内部循环中名为 column
的变量是否在顶部启动,然后与标题大小写一起使用 Column
,如果您将它们都设置为Columnn
或两者 column
,然后会发生什么。
我认为在这种情况下您不需要循环:
Sub FillTable2()
Dim Table1 As ListObject, Table2 As ListObject
' dummy data; the source workbook needs to be open
File_path = "source.xlsx"
Set Table1 = Workbooks(File_path).Sheets(1).ListObjects(1) 'get the source table
Set Table2 = ThisWorkbook.Sheets(1).ListObjects(1) 'get the destination table
If Not Table2.DataBodyRange Is Nothing Then Table2.DataBodyRange.Delete ' clear the destination table
'make the formula with the **external** relative address of the first cell in the Table1.DataBodyRange
frm = "=" & Table1.DataBodyRange(1).Address(external:=True, rowabsolute:=False, ColumnAbsolute:=False)
'insert formula to the whole target range; the table size will be automatically the size of the table will be automatically enlarged if necessary
Table2.InsertRowRange(1).Resize(Table1.ListRows.Count, Table1.ListColumns.Count).Formula = frm
End Sub