Speed up vba loop - excel

Every week in work I have a file of around 15000 customers that I need to break up into two categories based on their names. My current code works but it loops through every row taking almost 3 minutes to run. What would be the best way to improve the speed - I'm assuming there are much more efficient methods than the lengthy if statement I've used?
Option Compare Text
Private Sub CommandButton1_Click()
Dim i As Long
Application.ScreenUpdating = False
For i = 2 To Rows.Count
If Cells(i, 33).Value = "Business" Then
Cells(i, 32).Value = "B"
ElseIf Cells(i, 33).Value = "Personal" Then
Cells(i, 32).Value = "P"
ElseIf Cells(i, 12).Value = "N" Then
Cells(i, 32).Value = "B"
ElseIf Cells(i, 12).Value = "Y" Then
Cells(i, 32).Value = "P"
ElseIf Cells(i, 20).Value = "PREMIER" Then
Cells(i, 32).Value = "P"
ElseIf InStr(1, Cells(i, 4), "LTD") <> 0 Then 'Finds each word in customer name, column D, and enters it as business customer
Cells(i, 32).Value = "B"
ElseIf InStr(1, Cells(i, 4), "LIMITED") <> 0 Then
Cells(i, 32).Value = "B"
ElseIf InStr(1, Cells(i, 4), "MANAGE") <> 0 Then
Cells(i, 32).Value = "B"
ElseIf InStr(1, Cells(i, 4), "BUSINESS") <> 0 Then
Cells(i, 32).Value = "B"
ElseIf InStr(1, Cells(i, 4), "CONSULT") <> 0 Then
Cells(i, 32).Value = "B"
ElseIf InStr(1, Cells(i, 4), "INTERNATIONAL") <> 0 Then
Cells(i, 32).Value = "B"
ElseIf InStr(1, Cells(i, 4), "T/A") <> 0 Then
Cells(i, 32).Value = "B"
ElseIf InStr(1, Cells(i, 4), "TECH") <> 0 Then
Cells(i, 32).Value = "B"
ElseIf InStr(1, Cells(i, 4), "CLUB") <> 0 Then
Cells(i, 32).Value = "B"
ElseIf InStr(1, Cells(i, 4), "OIL") <> 0 Then
Cells(i, 32).Value = "B"
ElseIf InStr(1, Cells(i, 4), "SERVICE") <> 0 Then
Cells(i, 32).Value = "B"
ElseIf InStr(1, Cells(i, 4), "SOLICITOR") <> 0 Then
Cells(i, 32).Value = "B"
ElseIf Cells(i, 4).Value = "UIT" Then
Cells(i, 32).Value = "B"
Else
Cells(i, 32).Value = ""
End If
Next i
Application.ScreenUpdating = True
End Sub

If you want to speed up the process, I'd stop using VBA, but write a formula instead.
Example: for finding if a cell equals "Business" or "N", you can use something like this:
=IF(OR(A1="Business";A2="N");"B";"P")
For finding if a cell contains "Business", you can use something like this:
=IF(FIND("Business";A1);"B";"P")
Combining all of this using the OR() worksheet function, you can get the whole thing. Obviously you'll need to drag your formula over your the entire column within your worksheet.

Try
Private Sub CommandButton1_Click()
Dim i As Long, r As Long
Dim vDB As Variant
Dim Ws As Worksheet
Dim rngDB As Range
Set Ws = ActiveSheet
Set rngDB = Ws.UsedRange
vDB = rngDB
r = UBound(vDB, 1)
For i = 2 To r
If vDB(i, 33) = "Business" Then
vDB(i, 32) = "B"
ElseIf vDB(i, 33) = "Personal" Then
vDB(i, 32) = "P"
ElseIf vDB(i, 12) = "N" Then
vDB(i, 32) = "B"
ElseIf vDB(i, 12) = "Y" Then
vDB(i, 32) = "P"
ElseIf vDB(i, 20) = "PREMIER" Then
vDB(i, 32) = "P"
ElseIf InStr(1, vDB(i, 4), "LTD") <> 0 Then 'Finds each word in customer name, column D, and enters it as business customer
vDB(i, 32) = "B"
ElseIf InStr(1, vDB(i, 4), "LIMITED") <> 0 Then
vDB(i, 32) = "B"
ElseIf InStr(1, vDB(i, 4), "MANAGE") <> 0 Then
vDB(i, 32) = "B"
ElseIf InStr(1, vDB(i, 4), "BUSINESS") <> 0 Then
vDB(i, 32) = "B"
ElseIf InStr(1, vDB(i, 4), "CONSULT") <> 0 Then
vDB(i, 32) = "B"
ElseIf InStr(1, vDB(i, 4), "INTERNATIONAL") <> 0 Then
vDB(i, 32) = "B"
ElseIf InStr(1, vDB(i, 4), "T/A") <> 0 Then
vDB(i, 32) = "B"
ElseIf InStr(1, vDB(i, 4), "TECH") <> 0 Then
vDB(i, 32) = "B"
ElseIf InStr(1, vDB(i, 4), "CLUB") <> 0 Then
vDB(i, 32) = "B"
ElseIf InStr(1, vDB(i, 4), "OIL") <> 0 Then
vDB(i, 32) = "B"
ElseIf InStr(1, vDB(i, 4), "SERVICE") <> 0 Then
vDB(i, 32) = "B"
ElseIf InStr(1, vDB(i, 4), "SOLICITOR") <> 0 Then
vDB(i, 32) = "B"
ElseIf vDB(i, 4) = "UIT" Then
vDB(i, 32) = "B"
Else
vDB(i, 32) = ""
End If
Next i
rngDB = vDB
End Sub

Related

Comparative Macro ending with a "next without for" error

I keep getting an error at the end of my macro. It says Next without for but am not sure how to fix it! This exact macro worked in another sheet so there lies my confusion. Thanks for the help! I have reviewed other threads and just cannot seem to come up with the right solution for my specific macro.
Sub Run()
Cells.Interior.ColorIndex = 0
For i = 1 To 10
Worksheets("Sheet0").Activate
D0 = Cells(i, 1)
For j = 1 To 10
Worksheets("Sheet1").Activate
D1 = Cells(j, 1)
If (D0 = D1) Then
'Prefix
'Worksheets("Sheet0").Activate
'H0 = Cells(i, 2)
'Worksheets("Sheet1").Activate
'H1 = Cells(j, 2)
'If (H0 <> H1) Then
'Worksheets("Sheet0").Activate
'Cells(i, 2).Interior.ColorIndex = 6
'Else
'End If
'First Name
'Worksheets("Sheet0").Activate
'H0 = Cells(i, 2)
'Worksheets("Sheet1").Activate
'H1 = Cells(j, 3)
'If (H0 <> H1) Then
'Worksheets("Sheet0").Activate
'Cells(i, 2).Interior.ColorIndex = 6
'Else
'End If
'Middle Name
Worksheets("Sheet0").Activate
H0 = Cells(i, 3)
Worksheets("Sheet1").Activate
H1 = Cells(j, 4)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 3).Interior.ColorIndex = 6
Else
End If
'Last Name
Worksheets("Sheet0").Activate
H0 = Cells(i, 4)
Worksheets("Sheet1").Activate
H1 = Cells(j, 5)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 4).Interior.ColorIndex = 6
Else
End If
'Suffix
'Worksheets("Sheet0").Activate
'H0 = Cells(i, 6)
'Worksheets("Sheet1").Activate
'H1 = Cells(j, 6)
'If (H0 <> H1) Then
'Worksheets("Sheet0").Activate
'Cells(i, 6).Interior.ColorIndex = 6
'Else
'End If
'Maiden Name
Worksheets("Sheet0").Activate
H0 = Cells(i, 5)
Worksheets("Sheet1").Activate
H1 = Cells(j, 6)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 5).Interior.ColorIndex = 6
Else
End If
'Preferred Name
Worksheets("Sheet0").Activate
H0 = Cells(i, 2)
Worksheets("Sheet1").Activate
H1 = Cells(j, 3)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 2).Interior.ColorIndex = 6
Worksheets("Sheet0").Activate
If Not IsEmpty(Cells(i, 3)) Then
Cells(i, 8).Interior.ColorIndex = 6
Else
End If
'Date of Birth
Worksheets("Sheet0").Activate
H0 = Cells(i, 6)
Worksheets("Sheet1").Activate
H1 = Cells(j, 7)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 6).Interior.ColorIndex = 6
Else
End If
'Email 1 vs 1
Worksheets("Sheet0").Activate
H0 = Cells(i, 7)
Worksheets("Sheet1").Activate
H1 = Cells(j, 8)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 7).Interior.ColorIndex = 6
Else
End If
'Email 1 vs 2
Worksheets("Sheet0").Activate
H0 = Cells(i, 7)
Worksheets("Sheet1").Activate
H1 = Cells(j, 9)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 8).Interior.ColorIndex = 6
Else
End If
'Email 1 vs 3
Worksheets("Sheet0").Activate
H0 = Cells(i, 7)
Worksheets("Sheet1").Activate
H1 = Cells(j, 10)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 9).Interior.ColorIndex = 6
Else
End If
'Email 1 vs 4
Worksheets("Sheet0").Activate
H0 = Cells(i, 7)
Worksheets("Sheet1").Activate
H1 = Cells(j, 11)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 10).Interior.ColorIndex = 6
Else
End If
'Email 1 vs 5
Worksheets("Sheet0").Activate
H0 = Cells(i, 7)
Worksheets("Sheet1").Activate
H1 = Cells(j, 12)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 11).Interior.ColorIndex = 6
Else
End If
'Phone Number 1 vs 1
Worksheets("Sheet0").Activate
H0 = Cells(i, 12)
Worksheets("Sheet1").Activate
H1 = Cells(j, 13)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 12).Interior.ColorIndex = 6
Else
End If
'Phone Number 1 vs 2
Worksheets("Sheet0").Activate
H0 = Cells(i, 12)
Worksheets("Sheet1").Activate
H1 = Cells(j, 14)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 13).Interior.ColorIndex = 6
Else
End If
'Phone Number 1 vs 3
Worksheets("Sheet0").Activate
H0 = Cells(i, 12)
Worksheets("Sheet1").Activate
H1 = Cells(j, 15)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 14).Interior.ColorIndex = 6
Else
End If
'Phone Number 1 vs 4
Worksheets("Sheet0").Activate
H0 = Cells(i, 12)
Worksheets("Sheet1").Activate
H1 = Cells(j, 16)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 15).Interior.ColorIndex = 6
Else
End If
'Address
Worksheets("Sheet0").Activate
H0 = Cells(i, 16)
Worksheets("Sheet1").Activate
H1 = Cells(j, 17)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 16).Interior.ColorIndex = 6
Else
End If
'Address2
'Worksheets("Sheet0").Activate
'H0 = Cells(i, 26)
'Worksheets("Sheet1").Activate
'H1 = Cells(j, 11)
'If (H0 <> H1) Then
'Worksheets("Sheet0").Activate
'Cells(i, 26).Interior.ColorIndex = 6
'Else
'End If
'Address3
'Worksheets("Sheet0").Activate
'H0 = Cells(i, 27)
'Worksheets("Sheet1").Activate
'H1 = Cells(j, 12)
'If (H0 <> H1) Then
'Worksheets("Sheet0").Activate
'Cells(i, 27).Interior.ColorIndex = 6
'Else
'End If
'City
Worksheets("Sheet0").Activate
H0 = Cells(i, 17)
Worksheets("Sheet1").Activate
H1 = Cells(j, 19)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 17).Interior.ColorIndex = 6
Else
End If
'State
Worksheets("Sheet0").Activate
H0 = Cells(i, 18)
Worksheets("Sheet1").Activate
H1 = Cells(j, 20)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 18).Interior.ColorIndex = 6
Else
End If
'ZIP
Worksheets("Sheet0").Activate
H0 = Cells(i, 19)
Worksheets("Sheet1").Activate
H1 = Cells(j, 21)
If (H0 <> H1) Then
Worksheets("Sheet0").Activate
Cells(i, 19).Interior.ColorIndex = 6
Else
End If
Else
End If
Next j
Next i
Worksheets("Sheet0").Select
End Sub

after "on error goto" errorhandler, how do I resume to desired code line instead of resume next

How do I resume to my desired code line instead of resume next.
Let's say I want to resume back to:
cells(i,1),value = Mid(cells(i,1).value,16,Len(cells(i,1))-16)
How would you code it?
Thanks !!
Sub testing()
Dim i As Integer
Dim lastrow As Integer
lastrow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lastrow - 1
Cells(i, 1).Value = Mid(Cells(i, 1).Value, 16, Len(Cells(i, 1)) - 16)
On Error GoTo errhandler_2
Cells(i, 2).Value = Left(Cells(i, 2), Len(Cells(i, 2)) - 1)
Cells(i, 3).Value = Left(Cells(i, 3), Len(Cells(i, 3)) - 1)
Cells(i, 4).Value = Left(Cells(i, 4), Len(Cells(i, 4)) - 1)
Next
errhandler_2: Cells(i, 2).Value = "#NA"
errhandler_3: Cells(i, 3).Value = "#NA"
errhandler_4: Cells(i, 4).Value = "#NA"
Resume Next
End Sub
Sub testing()
Dim i As Integer
Dim lastrow As Integer
lastrow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lastrow
letsdothis:
Cells(i, 1).Value = Mid(Cells(i, 1).Value, 16, Len(Cells(i, 1)) - 16)
On Error GoTo errhandler
Cells(i, 2).Value = Left(Cells(i, 2), Len(Cells(i, 2)) - 1)
Cells(i, 3).Value = Left(Cells(i, 3), Len(Cells(i, 3)) - 1)
Cells(i, 4).Value = Left(Cells(i, 4), Len(Cells(i, 4)) - 1)
Next
Exit Sub
errhandler: Cells(i, 2).Value = "#NA"
Cells(i, 3).Value = "#NA"
Cells(i, 4).Value = "#NA"
i = i + 1 'TO PREVENT TRAP IN THE LOOP
Resume letsdothis:
End Sub

Excel based tracking database

I have a code which Sheet "RAW" is updated each day with more rows and updates the existing rows, I'm trying to get the number in Column B to match Column A in sheet data, then depending on what information is in other columns add 1 to a value in a column (17 different options)
It's basically going to be used as a tracker to check how many days something is on a specific status and I need to keep it for historical Measuring indefintely. here is what I have so far which doesn't seem to work.
Additionally I would also like it to measure an 18th catagory if it is missing from the data list if this is possibble?
'status tracking
Sub Status_Track()
Dim a As Long 'topic number
Dim Z As Long
Dim R As Long
Dim i As Long
Dim S As Long
Dim D As Long
Worksheets("RAW").Activate
R = Cells(Rows.Count, 2).End(xlUp).Row
C = Cells(1, Columns.Count).End(xlToLeft).Column
Z = 0
i = 2
Do Until i > R
'ident
If Cells(i, 2) = Worksheets("Data").Cells(i, 1) And (Cells(i, 13) = "ERKA") Then
Z = Worksheets("Data").Cells(i, 6) + 1
Worksheets("Data").Cells(i, 6).Value = Z
ElseIf Cells(i, 2) = Worksheets("Data").Cells(i, 1) And (Cells(i, 13) = "INBA") Then
'Inba
Z = Worksheets("Data").Cells(i, 7) + 1
Worksheets("Data").Cells(i, 7).Value = Z
ElseIf Cells(i, 2) = Worksheets("Data").Cells(i, 1) And (Cells(i, 13) = "ABGE") Then
'Abge
Z = Worksheets("Data").Cells(i, 8) + 1
Worksheets("Data").Cells(i, 8).Value = Z
ElseIf Cells(i, 2) = Worksheets("Data").Cells(i, 1) And (Cells(i, 13) = "GELO") Then
'Gelo
Z = Worksheets("Data").Cells(i, 5) + 1
Worksheets("Data").Cells(i, 5).Value = Z
ElseIf Cells(i, 2) = Worksheets("Data").Cells(i, 1) And (Cells(i, 13) = "UEBE") And (Cells(i, 11) = 0) Then
'UEBE
Z = Worksheets("Data").Cells(i, 9) + 1
Worksheets("Data").Cells(i, 9).Value = Z
ElseIf Cells(i, 11) = 1 And (Cells(i, 28) = "<1") Then
'1
Z = Worksheets("Data").Cells(i, 10) + 1
Worksheets("Data").Cells(i, 10).Value = Z
ElseIf Cells(i, 11) = 1 And (Cells(i, 28) = "6") Then
'6
Z = Worksheets("Data").Cells(i, 11) + 1
Worksheets("Data").Cells(i, 11).Value = Z
ElseIf Cells(i, 11) = 1 And (Cells(i, 28) = "9") Then
'9
Z = Worksheets("Data").Cells(i, 12) + 1
Worksheets("Data").Cells(i, 12).Value = Z
ElseIf Cells(i, 11) = 1 And (Cells(i, 28) = "10") Then
'10
Z = Worksheets("Data").Cells(i, 13) + 1
Worksheets("Data").Cells(i, 13).Value = Z
ElseIf Cells(i, 11) = 1 And (Cells(i, 28) = "15") Then
'15
Z = Worksheets("Data").Cells(i, 14) + 1
Worksheets("Data").Cells(i, 14).Value = Z
ElseIf Cells(i, 11) = 1 And (Cells(i, 28) = "30") Then
'30
Z = Worksheets("Data").Cells(i, 15) + 1
Worksheets("Data").Cells(i, 15).Value = Z
ElseIf Cells(i, 11) = 1 And (Cells(i, 28) = "50") Then
'50
Z = Worksheets("Data").Cells(i, 16) + 1
Worksheets("Data").Cells(i, 16).Value = Z
ElseIf Cells(i, 11) = 1 And (Cells(i, 28) = "60") Then
'60
Z = Worksheets("Data").Cells(i, 17) + 1
Worksheets("Data").Cells(i, 17).Value = Z
ElseIf Cells(i, 11) = 1 And (Cells(i, 28) = "70") Then
'70
Z = Worksheets("Data").Cells(i, 18) + 1
Worksheets("Data").Cells(i, 18).Value = Z
ElseIf Cells(i, 11) = 1 And (Cells(i, 28) = "80") Then
'80
Z = Worksheets("Data").Cells(i, 19) + 1
Worksheets("Data").Cells(i, 19).Value = Z
ElseIf Cells(i, 11) = 1 And (Cells(i, 28) = "90") Then
'90
Z = Worksheets("Data").Cells(i, 20) + 1
Worksheets("Data").Cells(i, 20).Value = Z
ElseIf Cells(i, 11) = 1 And (Cells(i, 28) = "97") Then
'97
Z = Worksheets("Data").Cells(i, 21) + 1
Worksheets("Data").Cells(i, 21).Value = Z
ElseIf Cells(i, 11) = 1 And (Cells(i, 28) = "100") Then
'100
Z = Worksheets("Data").Cells(i, 22) + 1
Worksheets("Data").Cells(i, 22).Value = Z
End If
Loop
End Sub
It could look something like that to find the corresponding identifier
Option Explicit 'must be the first line in a module: forces you to declare any variables before use
'status tracking
Sub Status_Track_Extended()
Dim wsRaw As Worksheet, wsData As Worksheet
Set wsRaw = ThisWorkbook.Worksheets("RAW")
Set wsData = ThisWorkbook.Worksheets("Data")
Dim LastRow As Long
LastRow = wsRaw.Cells(wsRaw.Rows.Count, 2).End(xlUp).Row 'find last row in sheet RAW
Dim FoundCell As Range, FoundRow As Long
Dim DataCol As Long
Dim i As Long
For i = 2 To LastRow 'start at row 2 up to last used row
'find corresponding row by identifier (column 2) in sheet Data
Set FoundCell = wsData.Columns(1).Find(wsRaw.Cells(i, 2))
If Not FoundCell Is Nothing Then 'only do the follwing if the identifier was found in sheet Data
FoundRow = FoundCell.Row
'ident
If wsRaw.Cells(i, 13) = "ERKA" Then
wsData.Cells(FoundRow, 6).Value = wsData.Cells(FoundRow, 6).Value + 1
ElseIf wsRaw.Cells(i, 13) = "INBA" Then
'Inba
wsData.Cells(FoundRow, 7).Value = wsData.Cells(FoundRow, 7).Value + 1
ElseIf wsRaw.Cells(i, 13) = "ABGE" Then
'Abge
wsData.Cells(FoundRow, 8).Value = wsData.Cells(FoundRow, 8).Value + 1
ElseIf wsRaw.Cells(i, 13) = "GELO" Then
'Gelo
wsData.Cells(FoundRow, 5).Value = wsData.Cells(FoundRow, 5).Value + 1
ElseIf wsRaw.Cells(i, 13) = "UEBE" And wsRaw.Cells(i, 11) = 0 Then
'UEBE
wsData.Cells(FoundRow, 9).Value = wsData.Cells(FoundRow, 9).Value + 1
ElseIf wsRaw.Cells(i, 11) = 1 Then
Select Case wsRaw.Cells(i, 28)
Case "<1"
wsData.Cells(FoundRow, 10).Value = wsData.Cells(FoundRow, 10).Value + 1
Case "6"
wsData.Cells(FoundRow, 11).Value = wsData.Cells(FoundRow, 11).Value + 1
Case "9"
wsData.Cells(FoundRow, 12).Value = wsData.Cells(FoundRow, 12).Value + 1
Case "10"
wsData.Cells(FoundRow, 13).Value = wsData.Cells(FoundRow, 13).Value + 1
Case "15"
wsData.Cells(FoundRow, 14).Value = wsData.Cells(FoundRow, 14).Value + 1
Case "30"
wsData.Cells(FoundRow, 15).Value = wsData.Cells(FoundRow, 15).Value + 1
Case "50"
wsData.Cells(FoundRow, 16).Value = wsData.Cells(FoundRow, 16).Value + 1
Case "60"
wsData.Cells(FoundRow, 17).Value = wsData.Cells(FoundRow, 17).Value + 1
Case "70"
wsData.Cells(FoundRow, 18).Value = wsData.Cells(FoundRow, 18).Value + 1
Case "80"
wsData.Cells(FoundRow, 19).Value = wsData.Cells(FoundRow, 19).Value + 1
Case "90"
wsData.Cells(FoundRow, 20).Value = wsData.Cells(FoundRow, 20).Value + 1
Case "97"
wsData.Cells(FoundRow, 21).Value = wsData.Cells(FoundRow, 21).Value + 1
Case "100"
wsData.Cells(FoundRow, 22).Value = wsData.Cells(FoundRow, 22).Value + 1
End Select
End If
Else 'error if identifier was not found
MsgBox "Identifier '" & wsRaw.Cells(i, 2) & "' could not be found in sheet 'Data'.", vbExclamation + vbOKOnly
End If
Next i
End Sub

Range wrong number of arguments or invalid property assignment

I'm trying to copy selected cells to another sheet, but I'm always getting error message: Wrong number of arguments or invalid property assignment
This code checks if "Cells(i, 20)" is less or greater than "Cells (i, 4)" by 10%. If it's not, it deletes the row, if it is it should copy selected cells to another sheet starting 48 row.
Maybe someone could point out, what I'm doing wrong here? Here's how my code looks like:
Sub CopyHighLow()
Sheets("ProductionHighLow").Select
i = 2
j = 48
produced = 0
While Cells(i, 1) <> "" Or Cells(i + 1, 1) <> ""
produced = Cells(i, 20)
ordered = Cells(i, 4)
If Cells(i, 20) > Cells(i, 4) * 0.9 And Cells(i, 20) < Cells(i, 4) * 1.1 Then
Cells(i, 22).Delete Shift:=xlUp
i = i - 1
Else
Range(Cells(i, 1), Cells(i, 2), Cells(i, 3), Cells(i, 4), Cells(i, 20)).Select
Selection.Copy Destination:=Sheets("Rytinis").Range(Cells(j, 1), Cells(j, 2), Cells(j, 3), Cells(j, 4), Cells(j, 5))
j = j + 1
End If
i = i + 1
Wend
End Sub
UPDATE here is working modified version:
Sub CopyHighLow()
Sheets("ProductionHighLow").Select
i = 2
j = 48
produced = 0
While Cells(i, 1) <> "" Or Cells(i + 1, 1) <> ""
produced = Cells(i, 20)
ordered = Cells(i, 4)
If Cells(i, 20) > Cells(i, 4) * 0.9 And Cells(i, 20) < Cells(i, 4) * 1.1 Then
Cells(i, 22).Delete Shift:=xlUp
i = i - 1
Else
Set RangeUnionCopy = Union(Cells(i, 1), Cells(i, 2), Cells(i, 3), Cells(i, 4), Cells(i, 20))
Set RangeUnionPaste = Union(Cells(j, 1), Cells(j, 2), Cells(j, 3), Cells(j, 4), Cells(j, 5))
RangeUnionCopy.Copy Destination:=Sheets("Rytinis").Range(RangeUnionPaste.Address)
j = j + 1
End If
i = i + 1
Wend
End Sub
Problem Explanation
Your problem relies in this line
Range(Cells(j, 1), Cells(j, 2), Cells(j, 3), Cells(j, 4), Cells(j, 5))
The Range object cannot handle more than 2 named cells (this way). You may see it directly in the compiler.
More info at its official documentation
Approach solution:
I would use Union prior to this, like so:
Set RangeUnion = Union(Cells(i, 1), Cells(i, 2), Cells(i, 3), Cells(i, 4), Cells(i, 20))
RangeUnion.Copy Destination:=Sheets("Rytinis").Range(RangeUnion.Address)
This should work for what you are aiming for.
Corrected code using Union:
Sub CopyHighLow()
Dim i, j, produced, ordered
Sheets("ProductionHighLow").Select
i = 2
j = 48
produced = 0
While Cells(i, 1) <> "" Or Cells(i + 1, 1) <> ""
produced = Cells(i, 20)
ordered = Cells(i, 4)
If Cells(i, 20) > Cells(i, 4) * 0.9 And Cells(i, 20) < Cells(i, 4) * 1.1 Then
Cells(i, 22).Delete Shift:=xlUp
i = i - 1
Else
Union(Cells(i, 1), Cells(i, 2), Cells(i, 3), Cells(i, 4), Cells(i, 20)).Select
Selection.Copy Destination:=Sheets("Rytinis").Cells(j, 1)
j = j + 1
End If
i = i + 1
Wend
End Sub
You need to tell it what sheet it copies from.
Sub CopyHighLow()
Sheets("ProductionHighLow").Select
i = 2
j = 48
produced = 0
While Cells(i, 1) <> "" Or Cells(i + 1, 1) <> ""
produced = Cells(i, 20)
ordered = Cells(i, 4)
If Cells(i, 20) > Cells(i, 4) * 0.9 And Cells(i, 20) < Cells(i, 4) * 1.1 Then
Cells(i, 22).Delete Shift:=xlUp
i = i - 1
Else
ActiveSheet.Range(Cells(i, 1), Cells(i, 2), Cells(i, 3), Cells(i, 4), Cells(i, 20)).Select
Selection.Copy Destination:=Sheets("Rytinis").Range(Cells(j, 1), Cells(j, 2), Cells(j, 3), Cells(j, 4), Cells(j, 5))
j = j + 1
End If
i = i + 1
Wend
End Sub

How to extract text after second space in VBA

Example value: Becky G Smith
I can already get the first name of everybody in Column A and put the result in Column B with this:
For i = 2 To lastrow
x = InStr(1, Cells(i, "A").Value, " ")
y = InStr(1, Cells(i, "A").Value, "#")
If InStr(1, Cells(i, "A").Value, " ") > 0 Then
Cells(i, "B").Value = Left(Cells(i, "A"), x - 1)
ElseIf InStr(1, Cells(i, "A").Value, "#") > 0 Then
Cells(i, "B").Value = Left(Cells(i, "A"), y - 1)
End If
Next i
The ElseIf InStr(1, Cells(i, "A").Value, "#") > 0 Then statement is there because sometimes I'm dealing with emails, like Becky#gmail.com
The problem is getting "Smith" as her last name. I don't want the middle initial. I've tried this for getting the last name:
For i = 2 To lastrow
w = InStr(1, Cells(i, "A").Value, " ")
x = InStr(w, Cells(i, "A").Value, " ")
y = InStr(1, Cells(i, "A").Value, "#")
Z = Len(Cells(i, "A").Value)
If InStr(1, Cells(i, "A").Value, " ") > 0 Then
Cells(i, "C").Value = Right(Cells(i, "A"), Z - x)
ElseIf InStr(1, Cells(i, "A").Value, "#") > 0 Then
Cells(i, "C").Value = Right(Cells(i, "A"), Z - y)
End If
Next i
But ultimately the w in x = InStr(w, Cells(i, "A").Value, " ") brings up a bug. Apparently VBA considers w to equal 0. So I need a way of extracting the text after the second space.
Try this:
Public Function GetLastName(sName As String) As String
Dim aWords() As String
aWords = Split(sName, " ")
GetLastName = aWords(UBound(aWords))
End Function
You can just use it in your sheet

Resources