Как я могу пропустить нечисловые значения при копировании и вставке с использованием цикла в VBA?

#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