VBA,如何插入一个.formulaArray方法的dynamic/相对单元格引用?

我有以下代码:

With Sh.Range("A1:A" & LastRow + 1).Offset(0, 4) .FormulaArray = "=MAX(IF(A2:A" & LastRow + 1 & "= ** , D2:D" & LastRow + 1 & "))" .Value = .Value End With 

在我有**的地方,我想要一个dynamic的单元格引用。 如果我使用.formulaR1C1,我会插入RC [-1],但我不能用.formulaArray。

有谁知道我可以如何插入一个相对单元格的参考,这将改变公式被粘贴在范围内?

谢谢

编辑#1

整个代码如下所示:

 Sub RemoveDuplicates_SumMarketValue() Dim Sh As Worksheet Dim LastRow As Long Dim Rng As Range Set Sh = Worksheets(1) Sh.Columns(6).Insert LastRow = Sh.Range("A65536").End(xlUp).Row With Sh.Range("A1:A" & LastRow).Offset(0, 5) .FormulaR1C1 = "=IF(COUNTIF(R1C[-5]:RC[-5],RC[-5])>1,"""",SUMIF(R1C[-5]:R[" & LastRow & "]C[-5],RC[-5],R1C[-1]:R[" & LastRow & "]C[-1]))" .Value = .Value End With Sh.Columns(5).Delete Sh.Rows(1).Insert Sh.Columns(5).Insert With Sh.Range("A1:A" & LastRow + 1).Offset(0, 4) .FormulaArray = "=MAX(IF(A2:A" & LastRow + 1 & "= A1 , D2:D" & LastRow + 1 & "))" .Value = .Value End With Set Rng = Sh.Range("E1:E" & LastRow + 1) With Rng .AutoFilter Field:=1, Criteria1:="=" .SpecialCells(xlCellTypeVisible).EntireRow.Delete End With End Sub 

这个代码的这个目的,虽然是一个数据和样本的样子

  1. find重复的
  2. 总结与重复相关的第5列中的值
  3. 删除重复的行(除了从第5列开始的那一行)

现在我也希望它在最终版本中保留所有重复项第4列中的最大值,但是我无法获得数组公式以正确引用行。

编辑:尝试粘贴在“ThisWorkbook”代码表内:

 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim Sh As Worksheet Dim LastRow As Long Dim Rng As Range Set Sh = Worksheets(1) LastRow = Sh.Range("A65536").End(xlUp).Row With Sh.Range("A1:A" & LastRow).Offset(0, 5) .FormulaR1C1 = "=IF(COUNTIF(R1C[-5]:RC[-5],RC[-5])>1,"""",SUMIF(R1C[-5]:R[" & LastRow & "]C[-5],RC[-5],R1C[-1]:R[" & LastRow & "]C[-1]))" .Value = .Value End With With Sh.Range("A1:A" & LastRow + 1).Offset(0, 4) .FormulaArray = "=MAX(IF(A2:A" & LastRow + 1 & "= A1 , D2:D" & LastRow + 1 & "))" .Value = .Value End With 'This section you might want to remove from this routine Set Rng = Sh.Range("E1:E" & LastRow + 1) With Rng .AutoFilter Field:=1, Criteria1:="=" .SpecialCells(xlCellTypeVisible).EntireRow.Delete End With End Sub 

它基本上和你的函数一样,但是它不会删除列或者添加任何行。 每当你的单元格内容发生变化时,会发生什么,这个macros将自动运行,更新单元格中的公式。


最近你可以实现这一目标,在后台有一个macros,每次对表单进行更改时都会运行。 如果你有成千上万的行,或者是一台真正的慢电脑,这可能不是理想的解决scheme。 但是,如果情况并非如此,那么您可能会发现,只需很less的更改就可以轻松获得代码。

 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 'Update your formula here with the new content/reference ' (your code + some changes to update where the last row is) End Sub 

将其粘贴到“ThisWorkbook”中,并将其放置在其中。

这是我想出来解决.formulaArray不接受RC单元格引用符号的问题。 我只是用一个循环来将数组公式引入到每个单元格中,并使用循环variablesi来引用目标行。

码:

 Sub RemoveDuplicates_SumMarketValue() Dim Sh As Worksheet Dim LastRow As Long Dim Rng As Range Dim targetcell As Range Set Sh = Worksheets(1) Sh.Columns(6).Insert LastRow = Sh.Range("A65536").End(xlUp).Row With Sh.Range("A1:A" & LastRow).Offset(0, 5) .FormulaR1C1 = "=IF(COUNTIF(R1C[-5]:RC[-5],RC[-5])>1,"""",SUMIF(R1C[-5]:R[" & LastRow & "]C[-5],RC[-5],R1C[-1]:R[" & LastRow & "]C[-1]))" .Value = .Value End With Sh.Columns(5).Delete Sh.Rows(1).Insert Sh.Columns(5).Insert For i = 2 To LastRow + 1 Cells(i, 5).FormulaArray = "=MAX(IF(A2:A" & LastRow + 1 & "= A" & i & " , D2:D" & LastRow + 1 & "))" Cells(i, 5) = Cells(i, 5).Value Next Sh.Columns(4).Delete Set Rng = Sh.Range("E1:E" & LastRow + 1) With Rng .AutoFilter Field:=1, Criteria1:="=" .SpecialCells(xlCellTypeVisible).EntireRow.Delete End With 

表(1).Cells(1,4)=“价格”表(1).Cells(1,5)=“市场价值”

结束小组

那么这个代码做了什么,在第一列中循环重复,在第五列中汇总相关的值,并在第四列中select最大的相关值。

你可以使用,填满一个单元格并复制它,

 L = LastRow + 1 With Sh.Range("A1:A" & L).Offset(0, 4) .Cells(1,1).FormulaArray = "=MAX(IF(A$2:A$" & L & "=A1,D$2:D$" & L & "))" .FillDown .Value = .Value End With 

使用Application.ConvertFormula处理A1和R1C1风格很简单

需要注意行/列吸收/相对参考。