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