-2

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

 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
4

7 回答 7

4

这是一行:

[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 中的数据用公式填充,公式将被值替换,公式将被删除。

第二个只清除那些需要清除的部分,而其他部分保持不变,但在较大范围内不易编辑。

于 2018-09-01T20:22:42.157 回答
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
于 2018-09-01T16:28:40.790 回答
2

这是不好的做法,不推荐,但它是单行的。预计这将包含在包含父工作表引用的 With 语句中。

Dim  i As Long: For i = 12 To 14: If .Cells(i, 72).Value = Chr$(97) Then .Cells(i, 28).ClearContents: Next
于 2018-09-01T17:33:59.407 回答
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))

(编辑 thx DisplayName :)

Index对函数的放大注释

您可以在没有循环或 API 调用的情况下在数组中插入第一列中找到使用该Index函数的详细说明

于 2018-09-01T19:17:22.020 回答
1

对于你所要求的;IIF无论您是使用TrueorFalse子句进行评估,该功能都有效。试试这个衬里。

For Each cel In Range("BT12:BT14"): IIf cel = "a", cel.Offset(, -44).ClearContents, True: Next
于 2018-09-01T18:39:34.677 回答
0

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

你应该?您的示例代码简洁明了,易于阅读。正如Rawrplus指出的那样,为了更短而更短通常不是一个好主意。

可以将每一行简化为:

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

那个更好吗?在我看来,可以说没有。如果条件的操作需要更多的复杂性,无论如何你都将被迫重构。

于 2018-09-01T16:57:24.067 回答
-1

快速的回答是:它不能完成。但是,如果人们愿意的话,可以想出一个解决方案,尽管这有点牵强。

首先创建一个 sub 放入库模块中。

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]

就像我说的那样,牵强,但有点像单线。

于 2018-09-01T18:16:42.450 回答