#excel #vba #loops #isnumeric
#excel #vba #циклы #isnumeric
Вопрос:
Я хотел бы скопировать и вставить формулу из столбца P в столбец C, используя цикл в VBA. Код должен копировать и вставлять только числовые значения в столбце P и ничего не делать, когда ячейка пуста.
Sub TestAll()
For i = 10 To 91
Worksheets("Hello").Range("P" amp; i).Formula = "=" amp; "MRound(" amp; Range("C" amp;
i).Value amp; " $C$7" amp; ",0.125)"
Next i
Application.CutCopyMode = False
Range("P10:P91").Select
Selection.Copy
Range("C10").Select
Selection.PasteSpecial Paste:=xlPasteFormulasAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
End Sub
Комментарии:
1. Ваша формула не имеет смысла… Я вижу 3 параметра, заданных для MRound, когда у него всего 2. Существует ли формула уже в столбце P?
2. @Damian: я не думаю, что OP передает 3 параметра
MRound
. Говоря это, Роберт, пожалуйста, посмотри, почему мы не должны использовать такие вещи, какSelect
илиActivate
в VBA
Ответ №1:
Поскольку вы уже используете for
цикл, вы можете напрямую скопировать данные туда.
Чтобы проверить, числовые ли это данные, вы можете использовать IsNumeric( Expression )
function
, и код может быть примерно таким:
Sub TestAll()
For i = 10 To 91
Worksheets("Hello").Range("P" amp; i).Formula = "=" amp; "MRound(" amp; Range("C" amp; i).Value amp; " $C$7" amp; ",0.125)"
If (IsNumeric(Worksheets("Hello").Range("P" amp; i).Value)) Then
Worksheets("Hello").Range("C" amp; i).Value = Worksheets("Hello").Range("P" amp; i).Value
End If
Next i
End Sub
Примечание: Пожалуйста, обратите внимание, что эта проверка является избыточной, поскольку формула
будет давать вам всегда один и тот же результат снова и снова.
Надеюсь, это поможет.
Комментарии:
1. Значение в
P
столбце будет равно 0 , если соответствующая ячейка в столбцеC
пуста. Который в этом случае все равно скопирует формулу в пункт назначения. Возможно, вы захотите установить флажок для пустой ячейки в столбцеC
или нечислового значения в соответствующей ячейке2. Спасибо, Луи — это помогло. С вашей помощью мне удалось составить ответ.
Ответ №2:
Sub TestAll()
For i = 10 To 91
If (IsEmpty(Worksheets("Hello").Range("C" amp; i).Value))
Then
Worksheets("Hello").Range("P" amp; i).Value = ""
ElseIf (IsNumeric(Worksheets("Hello").Range("C" amp;
i).Value)) Then
Worksheets("Hello").Range("P" amp; i).Formula = "=" amp;
"MRound(" amp; Range("C" amp; i).Value amp; " $C$7" amp; ",0.125)"
Else
Worksheets("Hello").Range("P" amp; i).Value =
"CALIBRATED"
End If
Next i
Application.CutCopyMode = False
Range("P10:P91").Select
Selection.Copy
Range("C10").Select
Selection.PasteSpecial
Paste:=xlPasteFormulasAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
End Sub