2015-11-18 2 views
0

Я уже некоторое время борется с этим. У меня есть этот код:Применить формулу из флажка в VBA

Private Sub CheckBox1_Click() 
If OptionButton1.Value = True Then 
Sheets("Sheet1").Select 
Range("J4").Select 
Selection.FormulaArray = "=IFERROR(INDEX(C$2:C$14, SMALL(IF($B$2:$B$14=1, ROW($B$2:$B$14)-1),ROWS(G$2:G2))),"")" 
Selection.Columns.AutoFit 

ElseIf OptionButton1.Value = False Then 
Range("J4").Value = " " 
End If 

End Sub 

Где я пытаюсь получить формулу, выполненную в ячейке J4. Это просто не будет! И я действительно не понимаю почему!

+0

дает формула работы при добавлении само по себе к листу как формулу массива? –

+0

Да, это то, что я хочу точно! Просто не так гладко или гибко. – jap7675

ответ

0

Массивная формула must be R1C1 format not A1.

Итак:

Private Sub CheckBox1_Click() 
If OptionButton1.Value = True Then 
    Sheets("Sheet1").Range("J4").FormulaArray = "=IFERROR(INDEX(R2C[-9]:R14C[-9], SMALL(IF(R2C2:R14C2=1, ROW(R2C2:R14C2)-1),ROWS(R2C[-5]:R[-2]C[-5]))),"""")" 
    Sheets("Sheet1").Range("J4").Columns().AutoFit 
    Sheets("Sheet1").Range("J4:J40").AutoFill 
ElseIf OptionButton1.Value = False Then 
    Range("J4").Value = " " 
End If 

End Sub 
+0

Привет, Большое спасибо за ваш hel-im, который очень близок к решению моей проблемы. Private Sub CheckBox1_Click() Если CheckBox1.Value = True Then Sheets ("Лист1") Диапазон ("J4: J40"). FormulaArray = «= IFERROR (INDEX (C $ 2:. C $ 14, МАЛЫЙ (IF ($ B $ 2: $ B $ 14 = 1, ROW ($ B $ 2: $ B $ 14) -1), ROWS (G $ 2: G2))), "" "") " Листы (" Sheet1 ") .Range ("J4: J40") Столбцы() Автоподбор ElseIf CheckBox1.Value = False Тогда Range ("J4: J40")... Value = "" End If End Sub I просто нужно, чтобы (G $ 2: G2) происходил последовательно (например, ((G $ 2: G3), (G $ 2: G4)), (G $ 2: G5)) и т. Д.}, Когда формула повторяется через рану. Это возможно? – jap7675

+1

Не требует ли формула массива диапазона, в который входят значения? то есть изменить «.Range (« J4 »).« FormulaArray »в массив, необходимый как« .Range («J4: P23»). FormulaArray « – area9

+0

@ jap7675 извините за задержку, я пропустил ваш последний комментарий. Я отредактировал ответ. Надеюсь, вы нашли ответ еще где. –

0

Не уверен, если это единственная проблема, но рассмотреть вопрос об изменении этой линии:

Selection.FormulaArray = "=IFERROR(INDEX(C$2:C$14, SMALL(IF($B$2:$B$14=1, ROW($B$2:$B$14)-1),ROWS(G$2:G2))),"")" 

к этому:

Selection.FormulaArray = "=IFERROR(INDEX(C$2:C$14, SMALL(IF($B$2:$B$14=1, ROW($B$2:$B$14)-1),ROWS(G$2:G2))),"""")" 
+0

Привет, Большое спасибо за ваш hel-im, который очень близок к решению моей проблемы. Private Sub CheckBox1_Click() Если CheckBox1.Value = True Then Sheets ("Лист1") Диапазон ("J4: J40"). FormulaArray = «= IFERROR (INDEX (C $ 2:. C $ 14, МАЛЫЙ (IF ($ B $ 2: $ B $ 14 = 1, ROW ($ B $ 2: $ B $ 14) -1), ROWS (G $ 2: G2))), "" "") " Листы (" Sheet1 ") .Range ("J4: J40") Столбцы() Автоподбор ElseIf CheckBox1.Value = False Тогда Range ("J4: J40")... Value = "" End If End Sub I просто нужно, чтобы (G $ 2: G2) происходил последовательно (например, ((G $ 2: G3), (G $ 2: G4)), (G $ 2: G5)) и т. Д.}, Когда формула повторяется через рану. Это возможно? – jap7675

+0

Как вы думаете, вы могли бы объяснить словами, что вы пытаетесь сделать? Я играю с вашей формулой, и это действительно потрясающе. Я не уверен, например, почему вы вообще обращаетесь к столбцу G. Возможно, это моя возможность узнать что-то, но похоже, что ROWS (G $ 2: Gn) даст вам количество строк в текущей строке. Именно это дает вам ROW ($ B $ 2: $ B $ 14) -1. Кроме того, если одно из значений в столбце B не равно 1, «IF» возвращает FALSE, что приводит к ошибке SMALL. Только, я наблюдаю, что в качестве формулы массива это не ошибка, но, похоже, сдвигает строки вверх. Смешение. – StoneGiant

Смежные вопросы