使用SUM和OFFSET反对循环引用(涉及VLOOKUP& VBA)

时间:2015-01-23 06:34:25

标签: excel excel-vba excel-formula vba

为您提供电子表格的详细信息:

我有一个主电子表格,可以从另一个电子表格中提取数据(每天生成),将其放入下一个空列并将之前保存公式的列转换为值。这是通过以下公式和VBA代码的组合实现的:

=IF(ISNA(VLOOKUP("Row 1",'N:\Reports\[data.xls]Sheet1'!$A$2:$B$40,2,FALSE)),0,(VLOOKUP("Row 1",'N:\Reports\[data.xls]Sheet1'!$A$2:$B$40,2,FALSE)))

Sub Test()

Dim ws As Worksheet
Set ws = ActiveSheet
Dim rLastCell As Range
Dim LastCol As Integer

Set rLastCell = ws.Cells.Find(what:="*", After:=ws.Cells(1, 1), LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)

LastCol = rLastCell.Column

ws.Columns(LastCol).Copy ws.Columns(LastCol + 1)

With ws.Columns(LastCol)
.Copy .Offset(0, 1)
.Value = .Value
End With

End Sub

目的是使B列成为总数'列,当公式/ VBA组合提取新条目并添加到第一个空白列时,它会动态汇总相关行中的所有值。不幸的是,我还需要从公式返回的值中减去该行的总数 - 但是,这样做会创建一个循环引用。

我的解决方案是从总数中排除行中的最后一个单元格(具有公式),其中包含:

=SUM(C2:OFFSET(I$2,0,-1))

但是,动态范围并非全部动态显示。在添加新记录时,它不会扩展到包含下一列,而且我真的不足以找出解决这个问题的原因或方法。

预先感谢您对此提供任何帮助,请不要犹豫,要求澄清!

1 个答案:

答案 0 :(得分:0)

使用命名范围可能最简单。如果您在每月总计说LastDay之前命名该列,则可以使用:

=SUM(C2:INDEX(LastDay,ROW())

作为您的公式,然后您的代码变为:

Sub Test()

Dim ws As Worksheet
Set ws = ActiveSheet
Dim rLastCell As Range
Dim LastCol As Integer

Set rLastCell = ws.Cells.Find(what:="*", After:=ws.Cells(1, 1), LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)

LastCol = rLastCell.Column

With ws.Columns(LastCol)
.Copy .Offset(0, 1)
.Value = .Value
.Name = "LastDay"
End With

End Sub

假设我已正确理解你的布局。