宏将公式分配给整列

时间:2017-11-23 10:58:57

标签: excel excel-vba excel-formula vba

我写了以下宏:

Sub assigningFormulas()

Dim i As Integer
Dim table1 As ListObject
Dim table2 As ListObject    

Set table1 = ActiveSheet.ListObjects("Segments")    
Set table2 = ActiveSheet.ListObjects("SegmentValues")

For i = 2 To table1.Range.Rows.count    
    Cells(i, 2).FormulaR1C1 = "=" & Cells(table2.TotalsRowRange.Row, i + 3).Address(False, False, xlR1C1, True, ActiveSheet.Cells(i, 2))        
Next i

End Sub

应该为table1的列中的单元格指定公式,使其等于table2的Totals Row上相应单元格中的值。基本上,我在table2中有一行的总数,我想在table1的列上复制它们(通过引用,而不是值)。

问题在于,每一步都会将新公式分配给table1的整列,直到当前单元格。只有当前单元格才能获得正确的值。其他单元格获取与表2中Totals Row上的当前单元格相同的列上的单元格值。

我做错了什么?

编辑:添加了截图: table2 table1

2 个答案:

答案 0 :(得分:0)

不确定table1列开始的列以及table2开始的列是什么,但是一旦你得到它们之间的 Delta列 ,您可以使用以下代码:

For i = 2 To table1.Range.Rows.Count
    table1.Range(i, 2).Formula = "=" & Cells(table2.TotalsRowRange.Row, i + 3).Address(False, False, xlA1, xlExternal)
Next i

答案 1 :(得分:0)

正如我在评论中指出的那样,问题是Excel数据表(ListObjects)中的设计计算列将应用于整个列。

有两种解决方案。 1)覆盖默认行为或2)创建一个可以在列中每一行成功完成结果的公式。

由于在这种情况下解决方案2相对容易,我将在下面进行演示。

首先手动完成图片,以便您了解。请注意表2的Allocation列中的INDEX,它使用表1的Totals Row作为Range,并匹配表1 Headers Rows上的Segment以确定要查找的列。结构化参考使这非常容易阅读和理解。

enter image description here

输入此公式的等效VBA是:

With Sheet1.ListObjects("Table2").ListColumns("Allocation").DataBodyRange
    .FormulaR1C1 = "=INDEX(Table1[#Totals],MATCH([@Segments],Table1[#Headers],0))"
End With

另一个美妙的是没有必要循环:)使用Excel的VBA内置功能非常强大

相关问题