Репликация функции Excel в VBA - PullRequest
1 голос
/ 04 октября 2019

У меня есть функция Excel следующим образом -

IF(B3="","",IF(AND(G3="NA",F3="Qualified"),"New to Qualified",
IF(AND(G3="NA",F3<>"Qualified"),CONCATENATE("New to Qualified and ",F3),
IF(AND(G3<>"NA",F3="Qualified"),IF(H3<>G3,"TCV Change","Same"),
IF(AND(G3<>"NA",F3<>"Qualified"),IF(H3="NA","TCV Change",IF(H3<>G3,CONCATENATE("TCV Change and ",F3),F3)))))))

Я пытаюсь повторить то же самое в VBA, как -

Sub CC()

Dim str1 As String
Dim str2 As String

str1 = "New to Qualified and" & Range("F3:F100")
str2 = "TCV Change and" & Range("F3:F100")


Range("J3:J100").Value = IIf(Application.WorksheetFunction.And(Range("G3:G100") = "NA", Range("F3:F100") = "Qualified"), "New to Qualified", _
IIf(Application.WorksheetFunction.And(Range("G3:G100") = "NA", Range("F3:F100") <> "Qualified"), str1, _
IIf(Application.WorksheetFunction.And(Range("G3:G100") <> "NA", Range("F3:F100") = "Qualified"), IIf(Range("H3:H100") <> Range("G3:G100"), "TCV Change", "Same"), _
IIf(Application.WorksheetFunction.And(Range("G3:G100") <> "NA", Range("F3:F100") <> "Qualified"), IIf(Range("H3:H100") = "NA", "TCV Change", IIf(Range("H3:H100") <> Range("G3:G100"), str2, Range("F3:F100")))))))


End Sub

Однако я получаю сообщение об ошибке в последнийСтрока - «Ошибка компиляции - Аргумент не является обязательным»

Пожалуйста, помогите с тем же.

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Поначалу этот код может показаться более сложным, но это «более VBA-способ». Делая это в VBA, вам понадобится цикл, поскольку вы не можете просто скопировать ячейки, как в рабочем листе. Я обычно избегаю использования WorksheetFunction. Следующий код поместит все ваши значения в массив и создаст массив arrJ, заполненный результатами. Вам не нужно подходить к этому с массивами, но я бы порекомендовал использовать структуру If - ElseIf - Else, которую я предоставил ниже, так как это делает код намного проще для чтения, понимания и изменения.

Sub CC()

Dim str1 As String, str2 As String
str1 = "New to Qualified and "
str2 = "TCV Change and "

Dim arrB As Variant, arrF As Variant, arrG As Variant, arrH As Variant 'rename these to describe your data instead of columns
arrB = ActiveSheet.Range("B3:B100").Value2
arrF = ActiveSheet.Range("F3:F100").Value2
arrG = ActiveSheet.Range("G3:G100").Value2
arrH = ActiveSheet.Range("H3:H100").Value2

Dim rngJ As Range
Set rngJ = ActiveSheet.Range("J3:J100")

Dim strResult As String
Dim arrJ As Variant
ReDim arrJ(LBound(arrB) To UBound(arrB), 1 To 1)

For i = LBound(arrB) To UBound(arrB)
    If arrB(i, 1) = vbNullString Then
        strResult = vbNullString 
    Else
        If arrG(i, 1) = "NA" And arrF(i, 1) = "Qualified" Then
            strResult = "New to Qualified"
        ElseIf arrG(i, 1) = "NA" And arrF(i, 1) <> "Qualified" Then
            strResult = str1 & arrF(i, 1)
        ElseIf arrG(i, 1) <> "NA" And arrF(i, 1) = "Qualified" Then
            If arrH(i, 1) <> arrG(i, 1) Then
                strResult = "TCV Change"
            Else
                strResult = "Same"
            End If
        ElseIf arrG(i, 1) <> "NA" And arrF(i, 1) <> "Qualified" Then
            If arrH(i, 1) = "NA" Then
                strResult = "TCV Change"
            ElseIf arrH(i, 1) <> arrG(i, 1) Then
                strResult = str2 & arrF(i, 1)
            Else
                strResult = arrF(i, 1)
            End If
        End If
    End If

    arrJ(i, 1) = strResult
Next i

rngJ.Value2 = arrJ

End Sub

Также яЯ считаю полезным научиться делать такие вещи в VBA «правильным способом» (хотя я уверен, что есть более элегантные способы решения этой проблемы). Это в конечном счете, конечно, для быстрого решения вы можете использовать что-то похожее на код, который вы разместили.

Несколько более простым и медленным способом будет следующий код. Опять же, обратите внимание, что вам нужно будет использовать цикл для достижения того, что вы пытаетесь сделать.

Sub CC()

Dim str1 As String, str2 As String
str1 = "New to Qualified and "
str2 = "TCV Change and "

Dim i As Long
Dim strB As String, strF As String, strG As String, strH As String 'rename to describe your data
Dim strResult As String

For i = 3 To 100
    With ActiveSheet
        strB = .Cells(i, 2).Value2
        strF = .Cells(i, 6).Value2
        strG = .Cells(i, 7).Value2
        strH = .Cells(i, 8).Value2
    End With

    If strB = vbNullString Then
        strResult = vbNullString
    Else
        If strG = "NA" And strF = "Qualified" Then
            strResult = "New to Qualified"
        ElseIf strG = "NA" And strF <> "Qualified" Then
            strResult = str1 & strF
        ElseIf strG <> "NA" And strF = "Qualified" Then
            If strH <> strG Then
                strResult = "TCV Change"
            Else
                strResult = "Same"
            End If
        ElseIf strG <> "NA" And strF <> "Qualified" Then
            If strH = "NA" Then
                strResult = "TCV Change"
            ElseIf strH <> strG Then
                strResult = str2 & strF
            Else
                strResult = strF
            End If
        End If
    End If

    ActiveSheet.Cells(i, 10).Value2 = strResult
Next i
End Sub
0 голосов
/ 04 октября 2019

не уверен, как именно это должно работать с диапазонами, но я попытался исправить ваш код на уровне ячейки

попробуйте использовать это:

str1 = "New to Qualified and" & Range("F7")
str2 = "TCV Change and" & Range("F7")

...

With Application.WorksheetFunction
    Range("J7").Value = _
    IIf(.And(Range("G7") = "NA", Range("F7") = "Qualified"), "New to Qualified", _
    IIf(.And(Range("G7") = "NA", Range("F7") <> "Qualified"), str1, _
    IIf(.And(Range("G7") <> "NA", Range("F7") = "Qualified"), IIf(.And(Range("H7") <> Range("G7")), "TCV Change", "Same"), _
    IIf(.And(Range("G7") <> "NA", Range("F7") <> "Qualified"), IIf(Range("H7") = "NA", "TCV Change", IIf(Range("H7") <> Range("G7"), str2, Range("F7"))), ""))))
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...