Поначалу этот код может показаться более сложным, но это «более 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