Упростите это только в одном предложении - PullRequest
0 голосов
/ 01 сентября 2018

Как я могу упростить это в одно предложение в ?

 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 голосов
/ 01 сентября 2018

Да, это можно сделать: -)

Просто для удовольствия: предполагая, что вы предоставляете пустую ячейку ► в [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

Вы можете найти усиливающие замечания по использованию функции Index в Вставить первый столбец в массив без циклов или вызовов API

0 голосов
/ 01 сентября 2018

Вот оно в одной строке:

[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 заполнены формулой, формула будет заменена значением, а формула будет удалена.

Второй очищает только те, которые необходимо очистить, оставляя остальные без изменений, но его не так легко редактировать с большими диапазонами.

0 голосов
/ 01 сентября 2018

За то, что вы просите; функция IIF работает независимо от того, выполняете ли вы оценку с использованием предложения True или False. Попробуйте этот лайнер.

For Each cel In Range("BT12:BT14"): IIf cel = "a", cel.Offset(, -44).ClearContents, True: Next
0 голосов
/ 01 сентября 2018

Быстрый ответ: это невозможно. Но можно найти решение, если захочешь, хотя оно будет довольно надуманным.

Сначала создайте подпрограмму для помещения в библиотечный модуль.

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]

Как я уже сказал, притянуто за уши, но в некотором роде.

0 голосов
/ 01 сентября 2018

Это плохая практика и не рекомендуется, но это одна строка. Ожидается, что это будет заключено в оператор With, содержащий ссылку на родительский лист.

Dim  i As Long: For i = 12 To 14: If .Cells(i, 72).Value = Chr$(97) Then .Cells(i, 28).ClearContents: Next
0 голосов
/ 01 сентября 2018

Как я могу упростить это в одно предложение в VBA?

Должны ли вы? Ваш пример кода является кратким и легко читаемым. Как указывает Rawrplus , короче ради того, чтобы быть короче, обычно не очень хорошая идея.

Можно упростить каждую строку до этого:

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

Это лучше? Возможно нет на мой взгляд. Если действиям условия потребуется больше сложности, вам все равно придется выполнить рефакторинг.

0 голосов
/ 01 сентября 2018

вот ваш код из одного предложения:

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
...