将其简化为一句话
Simplify this into one sentence only
如何在 vba 中将其简化为一个句子?
If [BT12] = "a" Then
Range("AB12").ClearContents
End If
If [BT13] = "a" Then
Range("AB13").ClearContents
End If
If [BT14] = "a" Then
Range("AB14").ClearContents
End If
这是您的一句话代码:
If Not [BT12:BT14].Find("a", , xlValues, xlWhole) Is Nothing Then Range(IIf([BT12] = "a", IIf([BT13] = "a", IIf([BT14] = "a", "AB12:AB14", "AB12:AB13"), IIf([BT14] = "a", "AB12,AB14", "AB12")), IIf([BT13] = "a", IIf([BT14] = "a", "AB13:AB14", "AB13"), IIf([BT14] = "a", "AB14", "")))).ClearContents
您可以(可能)更舒适地阅读:
If Not [BT12:BT14].Find("a", , xlValues, xlWhole) Is Nothing Then Range( _
IIf([BT12] = "a", _
IIf([BT13] = "a", _
IIf([BT14] = "a", "AB12:AB14", "AB12:AB13"), _
IIf([BT14] = "a", "AB12,AB14", "AB12") _
), _
IIf([BT13] = "a", _
IIf([BT14] = "a", "AB13:AB14", "AB13"), _
IIf([BT14] = "a", "AB14", "") _
) _
) _
).ClearContents
How can I simplify this into one sentence in vba?
应该吗?您的示例代码简洁明了,易于阅读。正如 Rawrplus 指出的那样,为了更短而更短通常不是一个好主意。
可以将每一行简化为:
If [BT12] = "a" Then Range("AB12").ClearContents
If [BT13] = "a" Then Range("AB13").ClearContents
If [BT14] = "a" Then Range("AB14").ClearContents
这样更好吗?在我看来可以说没有。如果条件的操作需要更复杂,无论如何您都将被迫重构。
这是一种不好的做法,不推荐,但它是单行的。预计这将包含在包含父 sheet 引用的 With 语句中。
Dim i As Long: For i = 12 To 14: If .Cells(i, 72).Value = Chr$(97) Then .Cells(i, 28).ClearContents: Next
简单的回答是:做不到。但是,如果有人愿意,可以想出一个解决方案,尽管它相当牵强。
首先创建一个子库模块。
Sub ClearCellContent(ParamArray Args())
Dim i As Integer, J As Integer
i = UBound(Args)
For J = 0 To i Step 3
If Args(J).value = Args(J + 1) Then Args(J + 2).ClearContents
Next
End Sub
您现在可以从代码中的某处调用此子程序,如下所示:
ClearCellContent [BT12], "a", [AB12], [BT13], "a", [AB13], [BT14], "a", [AB14]
就像我说的,牵强附会,但有点单调。
为了你所要求的; IIF
函数有效,无论您是使用 True
还是 False
子句进行评估。试试这个衬垫。
For Each cel In Range("BT12:BT14"): IIf cel = "a", cel.Offset(, -44).ClearContents, True: Next
是的,可以做到:-)
只是为了好玩:假设您在 [AB11]
中提供了一个 ► 空单元格,您可以通过 Application.Index
函数使用这个衬里:
[AB11:AB14] = Application.Transpose(Application.Index([AB11:AB14], Array(1, IIf([BT12] = "a", 1, 2), IIf([BT13] = "a", 1, 3), IIf([BT14] = "a", 1, 4)), 1))
(编辑显示名称:)
对 Index
函数的放大注释
您可以在
找到对 Index
函数使用的详细说明
这是一行:
[AB12:AB14] = [IF(BT12:BT14 = "a","",AB12:AB14)]
这是另一个使用 UNION 的方法:
Union(IIf([BT12] = "a", [AB12], [AFD1040000]), IIf([BT13] = "a", [AB13], [AFD1040000]), IIf([BT14] = "a", [AB14], [AFD1040000])).ClearContents
第一个创建值数组,""
或单元格中的值。它非常简洁,可以轻松扩展以包含更大的范围。缺点是如果AB中的数据用公式填充,公式会被值替换,公式会被去掉
第二个只清除那些需要清除的,而其他的保持不变,但在较大范围内编辑起来不那么容易。
如何在 vba 中将其简化为一个句子?
If [BT12] = "a" Then
Range("AB12").ClearContents
End If
If [BT13] = "a" Then
Range("AB13").ClearContents
End If
If [BT14] = "a" Then
Range("AB14").ClearContents
End If
这是您的一句话代码:
If Not [BT12:BT14].Find("a", , xlValues, xlWhole) Is Nothing Then Range(IIf([BT12] = "a", IIf([BT13] = "a", IIf([BT14] = "a", "AB12:AB14", "AB12:AB13"), IIf([BT14] = "a", "AB12,AB14", "AB12")), IIf([BT13] = "a", IIf([BT14] = "a", "AB13:AB14", "AB13"), IIf([BT14] = "a", "AB14", "")))).ClearContents
您可以(可能)更舒适地阅读:
If Not [BT12:BT14].Find("a", , xlValues, xlWhole) Is Nothing Then Range( _
IIf([BT12] = "a", _
IIf([BT13] = "a", _
IIf([BT14] = "a", "AB12:AB14", "AB12:AB13"), _
IIf([BT14] = "a", "AB12,AB14", "AB12") _
), _
IIf([BT13] = "a", _
IIf([BT14] = "a", "AB13:AB14", "AB13"), _
IIf([BT14] = "a", "AB14", "") _
) _
) _
).ClearContents
How can I simplify this into one sentence in vba?
应该吗?您的示例代码简洁明了,易于阅读。正如 Rawrplus 指出的那样,为了更短而更短通常不是一个好主意。
可以将每一行简化为:
If [BT12] = "a" Then Range("AB12").ClearContents
If [BT13] = "a" Then Range("AB13").ClearContents
If [BT14] = "a" Then Range("AB14").ClearContents
这样更好吗?在我看来可以说没有。如果条件的操作需要更复杂,无论如何您都将被迫重构。
这是一种不好的做法,不推荐,但它是单行的。预计这将包含在包含父 sheet 引用的 With 语句中。
Dim i As Long: For i = 12 To 14: If .Cells(i, 72).Value = Chr$(97) Then .Cells(i, 28).ClearContents: Next
简单的回答是:做不到。但是,如果有人愿意,可以想出一个解决方案,尽管它相当牵强。
首先创建一个子库模块。
Sub ClearCellContent(ParamArray Args())
Dim i As Integer, J As Integer
i = UBound(Args)
For J = 0 To i Step 3
If Args(J).value = Args(J + 1) Then Args(J + 2).ClearContents
Next
End Sub
您现在可以从代码中的某处调用此子程序,如下所示:
ClearCellContent [BT12], "a", [AB12], [BT13], "a", [AB13], [BT14], "a", [AB14]
就像我说的,牵强附会,但有点单调。
为了你所要求的; IIF
函数有效,无论您是使用 True
还是 False
子句进行评估。试试这个衬垫。
For Each cel In Range("BT12:BT14"): IIf cel = "a", cel.Offset(, -44).ClearContents, True: Next
是的,可以做到:-)
只是为了好玩:假设您在 [AB11]
中提供了一个 ► 空单元格,您可以通过 Application.Index
函数使用这个衬里:
[AB11:AB14] = Application.Transpose(Application.Index([AB11:AB14], Array(1, IIf([BT12] = "a", 1, 2), IIf([BT13] = "a", 1, 3), IIf([BT14] = "a", 1, 4)), 1))
(编辑显示名称:)
对 Index
函数的放大注释
您可以在
Index
函数使用的详细说明
这是一行:
[AB12:AB14] = [IF(BT12:BT14 = "a","",AB12:AB14)]
这是另一个使用 UNION 的方法:
Union(IIf([BT12] = "a", [AB12], [AFD1040000]), IIf([BT13] = "a", [AB13], [AFD1040000]), IIf([BT14] = "a", [AB14], [AFD1040000])).ClearContents
第一个创建值数组,""
或单元格中的值。它非常简洁,可以轻松扩展以包含更大的范围。缺点是如果AB中的数据用公式填充,公式会被值替换,公式会被去掉
第二个只清除那些需要清除的,而其他的保持不变,但在较大范围内编辑起来不那么容易。