-1

我尝试通过 VBA 问题寻找 XLookup 的解决方案,但找不到。我有以下数据集:

数据集

在数据集中,如果C2:C6范围内的任何单元格为空白,我想=IF(ISBLANK(B2),"",XLOOKUP(B2,A:A,IF(ISBLANK(D:D),"",D:D)))在这些单元格中使用此公式。B2的行号是可变的,具体取决于我们通过 VBA 放置此公式的行。

如果C2:C6范围内的任何单元格具有值,我想使用该值而不使用任何公式。如果有人删除了该值并且单元格变为空白,VBA 会将上述公式添加到该单元格。

目前在上面的屏幕截图中,C2:C6范围内的所有单元格都有上述公式。

我希望我是有道理的。如果这不可行,没关系。我总是可以使用辅助列。但我认为 VBA 对我的仪表板来说是一种更清洁的方式。

提前谢谢了。

4

2 回答 2

0

在工作表的类模块中,把这段代码

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim rCell As Range
    
    For Each rCell In Me.Range("C2:C6").Cells
        If IsEmpty(rCell.Value) Then
            Application.EnableEvents = False
            rCell.FormulaR1C1 = "=IF(ISBLANK(RC[-1]),"""",xlookup(RC[-1],C[-2],IF(ISBLANK(C[1]),"""",C[1])))"
            Application.EnableEvents = True
        End If
    Next rCell
    
End Sub

每当工作表上的某些内容发生变化时,这将运行。这不会减慢速度,因此您不想在 Change 事件中尝试做太多事情。但是,它不会在计算时触发。

于 2020-09-03T13:36:11.237 回答
-1

这似乎适用于任何一组数据。感谢大家的帮助:

Private Sub InsertFormula()

Dim mwRng As Range
    Set mwRng = Range("C2:C250")
    Dim d As Range
    For Each d In mwRng
        If d.Value = "" Then
      d.Formula = "=IF(RC[-1]="""",""-"",INDEX(C[1],MATCH(RC[-1],C[-2],0)))"
    End If
Next d

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("C2:C250")) Is Nothing Then
        Application.EnableEvents = False
        Call InsertFormula
        Application.EnableEvents = True
    End If
End Sub
于 2020-09-07T13:14:30.943 回答