仅将其简化为一个句子

时间:2018-09-01 16:13:32

标签: vba excel-vba if-statement simplify

如何在中将其简化为一个句子?

 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

7 个答案:

答案 0 :(得分:4)

这里是一行:

@JsonProperty("entry.messaging.message.text")

这是另一个使用UNION的方法:

[AB12:AB14] = [IF(BT12:BT14 = "a","",AB12:AB14)]

第一个创建值数组,Union(IIf([BT12] = "a", [AB12], [AFD1040000]), IIf([BT13] = "a", [AB13], [AFD1040000]), IIf([BT14] = "a", [AB14], [AFD1040000])).ClearContents 或单元格中的值。它非常简洁,可以轻松扩展到更大范围。缺点是,如果用公式填充AB中的数据,则该公式将替换为该值并删除该公式。

第二个仅清除那些需要清除的内容,而其他内容则保持不变,但是在较大范围内不那么容易编辑。

答案 1 :(得分:2)

这是您的一句话代码:

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

答案 2 :(得分:2)

这是一种不好的做法,不建议使用,但是它是单行的。预计这将被包装在保存父表引用的With语句中。

Dim  i As Long: For i = 12 To 14: If .Cells(i, 72).Value = Chr$(97) Then .Cells(i, 28).ClearContents: Next

答案 3 :(得分:2)

是的,可以完成:-)

只是为了好玩:假设您在[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功能的说明

您可以在Insert first column in array without Loops or API calls找到有关使用Index函数的放大说明

答案 4 :(得分:1)

对于您的要求;无论您正在使用IIF还是True子句进行评估,False函数均有效。试试这个衬里。

For Each cel In Range("BT12:BT14"): IIf cel = "a", cel.Offset(, -44).ClearContents, True: Next

答案 5 :(得分:0)

  

如何在vba中将其简化为一个句子?

可以吗?您的示例代码简洁明了,易于阅读。正如Rawrplus所指出的,为了短小而短小通常不是一个好主意。

可以将每一行简化为:

If [BT12] = "a" Then Range("AB12").ClearContents
If [BT13] = "a" Then Range("AB13").ClearContents
If [BT14] = "a" Then Range("AB14").ClearContents

那好吗?我认为可以说没有。如果条件的动作需要更多的复杂性,那么无论如何您都将不得不重构。

答案 6 :(得分:-1)

快速的答案是:无法完成。但是,即使有人愿意,也可以想出一个解决方案。

首先创建一个要放入库模块的子项。

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]

就像我说的那样,牵强附会,但种类繁多。