Умножить несколько столбцов на основе if then logic
Я пытаюсь сформулировать логику vba, которая будет умножать ячейки в одном столбце на другие столбцы на основе имени заголовка. Например, если у меня есть данные ниже:
В столбце I я пытаюсь умножить диапазон ячеек A2: A11 на B2: B11 на D2: D11. Так как значение в A1 такое же, как два левых двух символа в D1, а B1 совпадает с двумя правыми двумя символами в D1. В столбце J это будет диапазон ячеек A2: A11 умножить на E2: E11 и так далее. Результат должен выглядеть следующим образом:
Макрос пытается это сделать, сравнивая значения ячеек в ядре ячеек A1: B1-D1: G1, но то, что я не могу понять, состоит в том, как умножать 3 диапазона ячеек вместе.
- Оператор SQL IF для уникальных строк
- Ячейки цветового кода на основе демографических и тестовых оценок (несколько условий)
- Написание нескольких функций IF / AND
- В то время как цикл вложен в оператор if, vba выводит только первое значение «TRUE» и останавливается
- Как я могу сделать инструкцию типа IF ELSE в строке формул excel?
Vba:
Sub IfThenLogic2() Dim SrchRng1 As Range, cel1 As Range Dim SrchRng2 As Range, cel2 As Range Set SrchRng1 = Sheets("Sheet2").Range("A1:B1") Set SrchRng2 = Sheets("Sheet2").Range("F1:G1") c = 13 For Each cel1 In SrchRng1 For Each cel2 In SrchRng2 If (cel1.Value = Left(cel2.Value, 2) Or cel1.Value = Right(cel2.Value, 2)) Then 'If cel1.Value = cel2.Value Then For r = 2 To 11 Cells(r, c).FormulaR1C1 = "=" & cel1.Offset(r - 1, 0).Address(ReferenceStyle:=xlR1C1) & "*" & cel2.Offset(r - 1, 0).Address(ReferenceStyle:=xlR1C1) & "" Next r c = c + 1 End If Next cel2 Next cel1 End Sub
Оператор OR
производит (как и ожидалось):
Может быть, лучший способ сделать это, не используя for each loops
? Спасибо за любые предложения!
- Написание логических вопросов в Excel
- Устанавливается IF (NOT (ISBLANK)) Заявление?
- Использование функции If в коде VBA для форматирования диаграмм
- если инструкции для просмотра разных листов и ячеек
- Сравните ells A3 и A2, если они равны, ничто иное, как цветная строка 3 ячейки A, хотя F. Повторите следующую строку
- Записывать значения из if Statement в текущую ячейку Excel
- Excell autofill sheet 2 с листом 1 информация
- Использование подстановочного знака в заявлении If с ссылкой на ячейку
если вы хотите его в VBA:
Sub IfThenLogic2() Dim SrchRng1 As Range, cel1 As Range Dim SrchRng2 As Range, cel2 As Range Dim i As Integer Dim sht As Worksheet Set sht = Sheets("Sheet2") Set SrchRng1 = sht.Range("A1:B1") Set SrchRng2 = sht.Range("D1:G1") Dim title() As String c = 13 For Each cel1 In SrchRng1 For Each cel2 In SrchRng2 title = Split(cel2, "_") For i = LBound(title) To UBound(title) If title(i) = cel1.Value Then 'If cel1.Value = cel2.Value Then For r = 2 To 11 If sht.Cells(r, c).HasFormula Then sht.Cells(r, c).Formula = sht.Cells(r, c).Formula & "*" & cel1.Offset(r - 1, 0).Address Else sht.Cells(r, c).Formula = "=" & cel1.Offset(r - 1, 0).Address & "*" & cel2.Offset(r - 1, 0).Address End If Next r End If Next i c = c + 1 Next cel2 c = 13 Next cel1 End Sub
Вот нормальная (не массивная) формула для этого. Просто введите его в ячейку I2
и скопируйте по мере необходимости:
=INDEX($D2:$G2,MATCH(I$1,$D$1:$G$1,)) * IFERROR(INDEX($A2:$B2,MATCH(LEFT(I$1,2),$A$1:$B$1,)),1) * IFERROR(INDEX($A2:$B2,MATCH(RIGHT(I$1,2),$A$1:$B$1,)),1)
Если вы хотите автоматизировать это, вы можете использовать этот VBA:
Public Sub excelhero() [i2].Formula = "=INDEX($D2:$G2,MATCH(I$1,$D$1:$G$1,)) * IFERROR(INDEX($A2:$B2,MATCH(LEFT(I$1,2),$A$1:$B$1,)),1) * IFERROR(INDEX($A2:$B2,MATCH(RIGHT(I$1,2),$A$1:$B$1,)),1)" [i2].Copy [i2:L11] [i2:L11].Value = [i2:L1].Value '<-- replaces formulas with literal values End Sub
Если вы не возражаете против формулы, я получаю Формулу Array, которая работает.
Вот как выкладываются данные (вам может потребоваться настроить формулу, если она отличается от вас):
Формула для ввода в I2
: =IF(AND(COUNTIF($A$1:$G$1,LEFT(I$1,2)),COUNTIF($A$1:$G$1,RIGHT(I$1,2))),INDEX($A2:$G2,,MATCH(LEFT(I$1,2),$A$1:$B$1,0))*INDEX($A2:$G2,,MATCH(RIGHT(I$1,2),$A$1:$B$1,0))*INDEX($A2:$G2,,MATCH(I$1,$A$1:$G$1,0)),INDEX($A2:$G2,,MATCH(RIGHT(I$1,2),$A$1:$B$1,0))*INDEX($A2:$G2,,MATCH(I$1,$A$1:$G$1,0)))
и подтвердите с помощью Просто нажмите CTRL+SHIFT+ENTER
.ENTER
.
Это в основном три формулы индекс / матч, умноженные вместе. Index / Matching использует левый и правый 2 символа вашего заголовка, чтобы найти столбец с соответствующим номером.
PS: Просто для кого-то еще, вот таблица информации в текстовой форме (чтобы вы могли копировать / вставлять). Скобки представляют собой пустой столбец, разделяющий остальные.
A1 A5 [] A1_A5 A3_A1 A3_A5 A9_A5 [] A1_A5 A3_A1 A3_A5 A9_A5 16 16 61 17 38 46 41 6 6 58 22 95 39 38 19 37 92 14 98 99 64 74 53 88 14 35 92 47 34 58 18 76 93 20 54 25 94 47 78 37 96 44 32 25 61 61 66 39 9 74 31 43 75 22 8 19 14 83 9 89