2013-11-15 2 views
1

Моей Prob это:макрос: если переключатель на то скопировать формулу вниз диапазон

Я хочу, чтобы иметь возможность использовать макрос для копирования & CALCulate формулы вниз диапазона ячеек, если переключатель включен.
Но я не знаю, как установить переменную внутри формулы. Макрос ниже должен скопировать формулу в показанные диапазоны (I12: I252, K12: K252, M12: M252).
Сама формула включает вычитание двух ячеек в диапазоне C12: C252 & B12: B252. Кажется, я не могу ссылаться на эти клетки. Я думаю, что проблема ...

В любом случае, это не сработает. Любая помощь будет принята с благодарностью.

Спасибо!

Dim shp1 As Shape 
Dim shp2 As Shape 
Dim i As Long 

On Error Resume Next 
Set shp1 = Worksheets("Worksheet").Shapes("Button 1") 
Set shp2 = Worksheets("Worksheet").Shapes("Button 2") 

If shp1.ControlFormat.Value = xlOn Then 
    MsgBox "Auto Calculating" 
    For i = 12 To 252 
     Range("I" & i).Formula = "=IFERROR(((C & i)-(B & i))*I6/(E7-E6);"")" 
     Range("K" & i).Formula = "=IFERROR(((C & i)-(B & i))*J6/(E7-E6);"")" 
     Range("M" & i).Formula = "=IFERROR(((C & i)-(B & i))*K6/(E7-E6);"")" 
    Next i 

Else 

    If shp2.ControlFormat.Value = xlOn Then 
     MsgBox "Manually insert calculation" 

    End If 
End If 
+0

Заменить ',' в формулах с ''. ';' является вашей локальной настройкой, но '.Formula' использует английскую настройку! –

+0

хотя, вероятно, хороший момент (не уверен), это не проблема ... Еще ничего. – user2995483

+0

См. Мой ответ ниже - он работает сейчас? –

ответ

2

Несколько улучшений:

  1. Заменить ; в формулах с ,. ; - ваш местный настройка, но .Formula использует английскую настройку!
  2. Если вы хотите обратиться к каждому столбцу, необходимо поместить i вне quoatation знаков, т.е. вместо =IFERROR(((C & i)... записи =IFERROR(((C" & i & ")...
  3. Нет необходимости в цикле каждый элемент и установить формулу. Если вы правильно используете $ в своей формуле, вы можете заменить все на одну формулу: =IFERROR(($C12-$B12)*I$6/($E$7-$E$6),"")
  4. Лучше использовать .FormulaR1C1 - таким образом ваша формула также будет работать, когда вы применили ее к другому диапазону. Чтобы легко преобразовать формулу, введите ее обычно в ячейку и запустите ? Selection.FormulaR1C1 в окне VBA Immediate. Вышеприведенная формула переводится в =IFERROR((RC3-RC2)*R6C/(R7C5-R6C5),"")
  5. Не используйте ссылки на ячейку с твердым кодом (в вашем случае I12:K252). Лучше назначьте этот диапазон именованному диапазону и используйте это как ссылку. Таким образом, ваш код также будет работать, если вы позже добавите/удалите строки или столбцы.
  6. Не используйте On Error Resume Next! Это приглашение наблюдать за ошибкой, которая должна быть исправлена.
  7. Дополнительно: В качестве альтернативы для доступа к элементам управления непосредственно в VBA вы также можете назначить каждую ячейку, назовите эту ячейку, как на шаге 4, и обратитесь к этому имени под этим именем , Делает ваш код более гибким/менее сложным!

Так что в целом, я в конечном итоге с:

Public Sub YourSub() 
    If Range("SwitchOne") Then 
     Range("YourRange").FormulaR1C1 = _ 
      "=IFERROR((RC3-RC2)*R6C/(R7C5-R6C5),"""")" 
    Else 
     If Range("SwitchTwo") Then 
      MsgBox "Manually insert calculation" 
     End If 
    End If 
End Sub 
+0

+ 1 Для получения дополнительной мили и предоставления отличных предложений :) –

+0

Отлично! Я не мог это решить, потому что использовал формулу IFERROR из ваших комментариев, но затем я заметил четвертую цитату в конце формулы. Вот и все. Эффективный и быстрый. Престижность! – user2995483

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