0
\$\begingroup\$

I have the code such as this for opposite conditions.

For Each iCell In Range("A2:A6").Cells
 If iCell.EntireRow.Range("H1").Value = "" Then
 BOM = InputBox("The current BoM Code is...", "BoM Calculator v1.1", (iCell.Value))
 scrUpdt = Application.ScreenUpdating
 Application.ScreenUpdating = False
 Set WsOut = ThisWorkbook.Worksheets("SUMMARY")
 WsOut.UsedRange.Delete 'Clearing out previous records (very important!!!)
 summRow = 1
 'sheet names to scan
 'arrWs = Array("Civils Work Order", "Cable Work Order", "BoM")
 arrWs = Array("Cable Work Order")
 WsOut.Cells(summRow, 1).Resize(1, 6).Value = Array("Workbook", "Worksheet", _
 "Cell", "Text in Cell", "Values corresponding", "Uplift Code")
 For Each f In colFiles
 xBol = (f.Path = pathMainWb) 'file already open?
 If xBol Then
 Set wb = wbAct
 Else
 Set wb = Workbooks.Open(Filename:=f.Path, UpdateLinks:=0, _
 ReadOnly:=True, AddToMRU:=False)
 End If
 
 For Each ws In wb.Worksheets
 'are we interested in this sheet?
 If Not IsError(Application.Match(ws.Name, arrWs, 0)) Then
 Set matchedCells = FindAll(ws.UsedRange, BOM) 'get all cells with bom
 If matchedCells.Count > 0 Then
 For Each Cell In matchedCells
 If Cell.EntireRow.Range("H1").Value = "" Then
 summRow = summRow + 1
 WsOut.Cells(summRow, 1).Resize(1, 6).Value = _
 Array(wb.Name, ws.Name, Cell.Address, Cell.Value, _
 Cell.EntireRow.Range("F1").Value, 
 Cell.EntireRow.Range("H1").Value)
 
 numHits = numHits + 1
 End If
 Next Cell 'next match
 End If 'any bom matches
 End If 'matched sheet name
 Next ws
 If Not xBol Then wb.Close False 'need to close this workbook?
 Next f
 With WsOut
 Dim lastrow As Long
 .Columns("A:E").EntireColumn.AutoFit
 lastrow = WsOut.Cells(WsOut.Rows.Count, "E").End(xlUp).Row 'AutoSum all values
 
 .Range("E" & lastrow + 1).Value = WorksheetFunction.Sum(WsOut.Range("E2:E" & 
 lastrow + 1))
 End With
 With ThisWorkbook.Worksheets("Cable Work Order").Range("O1")
 .Font.Color = RGB(240, 240, 240)
 .Value = WsOut.Range("E" & lastrow + 1).Value
 End With
 For i = 2 To Excel.WorksheetFunction.CountA(Range("A:A")) 
 'Autocopy sum value
 If Range("A" & i).Value = BOM Then
 If Range("H" & i).Value = "" Then
 Range("O1").Copy
 With Range("F" & i)
 .PasteSpecial xlPasteValues
 .Font.Bold = True
 .Font.Color = vbBlue
 End With
 End If
 End If
 Next i
 MsgBox numHits & " cells have been found", , "BoM Calculator for VM Greenfield"
 Else '----------------OPPOSITE CONDITIONS---------------------'
 BOM = InputBox("The current Uplift BoM Code is...", "BoM Calculator v1.1", (iCell.Value))
 scrUpdt = Application.ScreenUpdating
 Application.ScreenUpdating = False
 Set WsOut = ThisWorkbook.Worksheets("SUMMARY")
 WsOut.UsedRange.Delete 'Clearing out previous records (very important!!!)
 summRow = 1
 'sheet names to scan
 'arrWs = Array("Civils Work Order", "Cable Work Order", "BoM")
 arrWs = Array("Cable Work Order")
 WsOut.Cells(summRow, 1).Resize(1, 6).Value = Array("Workbook", "Worksheet", _
 "Cell", "Text in Cell", "Values corresponding", "Uplift Code")
 For Each f In colFiles
 xBol = (f.Path = pathMainWb) 'file already open?
 If xBol Then
 Set wb = wbAct
 Else
 Set wb = Workbooks.Open(Filename:=f.Path, UpdateLinks:=0, _
 ReadOnly:=True, AddToMRU:=False)
 End If
 
 For Each ws In wb.Worksheets
 'are we interested in this sheet?
 If Not IsError(Application.Match(ws.Name, arrWs, 0)) Then
 Set matchedCells = FindAll(ws.UsedRange, BOM) 'get all cells with bom
 If matchedCells.Count > 0 Then
 For Each Cell In matchedCells
 If Cell.EntireRow.Range("H1").Value <> "" Then
 summRow = summRow + 1
 WsOut.Cells(summRow, 1).Resize(1, 6).Value = _
 Array(wb.Name, ws.Name, Cell.Address, Cell.Value, _
 Cell.EntireRow.Range("F1").Value, Cell.EntireRow.Range("H1").Value)
 
 numHits = numHits + 1
 End If
 Next Cell 'next match
 End If 'any bom matches
 End If 'matched sheet name
 Next ws
 If Not xBol Then wb.Close False 'need to close this workbook?
 Next f
 With WsOut
 Dim lastrow2 As Long
 .Columns("A:E").EntireColumn.AutoFit
 lastrow2 = WsOut.Cells(WsOut.Rows.Count, "E").End(xlUp).Row 'AutoSum all values
 
 .Range("E" & lastrow2 + 1).Value = WorksheetFunction.Sum(WsOut.Range("E2:E" & lastrow + 1))
 End With
 With ThisWorkbook.Worksheets("Cable Work Order").Range("O1")
 .Font.Color = RGB(240, 240, 240)
 .Value = WsOut.Range("E" & lastrow2 + 1).Value
 End With
 For i = 2 To Excel.WorksheetFunction.CountA(Range("A:A")) 'Autocopy sum value
 If Range("A" & i).Value = BOM Then
 If Range("H" & i).Value <> "" Then
 Range("O1").Copy
 With Range("F" & i)
 .PasteSpecial xlPasteValues
 .Font.Bold = True
 .Font.Color = vbRed
 End With
 End If
 End If
 Next i
'ThisWorkbook.Worksheets("Civils Work Order").Columns("O").Font.Color = RGB(10, 10, 10)
 MsgBox numHits & " cells have been found", , "BoM Calculator for VM Greenfield"
 'Const Timeout = 2
 End If
 Next iCell

Is it a chance for some compression?

asked Feb 9, 2023 at 14:20
\$\endgroup\$

1 Answer 1

2
\$\begingroup\$

The first optimization would be to combine those two identical paths into one with boolean logic.

I did this by loading each half of the top level If statement in a side by side comparison. Then I used logic to account for the differences in each path, of which there are only a few. rowIsBlank hold the answer to that initial top level If you are concerned with. It's then used to account for the differences.

 For Each iCell In Range("A2:A6").Cells
 Dim rowIsBlank As Boolean
 rowIsBlank = iCell.EntireRow.Range("H1").Value = ""
 Dim inputMessage As String
 inputMessage = "The current"
 If rowIsBlank Then inputMessage = inputMessage & " Uplift"
 inputMessage = inputMessage & " BoM Code is..."
 BOM = InputBox(inputMessage, "BoM Calculator v1.1", (iCell.Value))
 scrUpdt = Application.ScreenUpdating
 Application.ScreenUpdating = False
 Set WsOut = ThisWorkbook.Worksheets("SUMMARY")
 WsOut.UsedRange.Delete 'Clearing out previous records (very important!!!)
 summRow = 1
 'sheet names to scan
 'arrWs = Array("Civils Work Order", "Cable Work Order", "BoM")
 arrWs = Array("Cable Work Order")
 WsOut.Cells(summRow, 1).Resize(1, 6).Value = Array("Workbook", "Worksheet", _
 "Cell", "Text in Cell", "Values corresponding", "Uplift Code")
 For Each f In colFiles
 xBol = (f.Path = pathMainWb) 'file already open?
 If xBol Then
 Set wb = wbAct
 Else
 Set wb = Workbooks.Open(Filename:=f.Path, UpdateLinks:=0, _
 ReadOnly:=True, AddToMRU:=False)
 End If
 
 For Each ws In wb.Worksheets
 'are we interested in this sheet?
 If Not IsError(Application.Match(ws.Name, arrWs, 0)) Then
 Set matchedCells = FindAll(ws.UsedRange, BOM) 'get all cells with bom
 If matchedCells.Count > 0 Then
 For Each Cell In matchedCells
 If rowIsBlank = (Cell.EntireRow.Range("H1").Value = "") Then
 summRow = summRow + 1
 WsOut.Cells(summRow, 1).Resize(1, 6).Value = _
 Array(wb.Name, ws.Name, Cell.Address, Cell.Value, _
 Cell.EntireRow.Range("F1").Value, Cell.EntireRow.Range("H1").Value)
 
 numHits = numHits + 1
 End If
 Next Cell 'next match
 End If 'any bom matches
 End If 'matched sheet name
 Next ws
 
 If Not xBol Then wb.Close False 'need to close this workbook?
 Next f
 With WsOut
 Dim lastrow As Long
 .Columns("A:E").EntireColumn.AutoFit
 lastrow = WsOut.Cells(WsOut.Rows.Count, "E").End(xlUp).Row 'AutoSum all values
 
 .Range("E" & lastrow + 1).Value = WorksheetFunction.Sum(WsOut.Range("E2:E" & lastrow + 1))
 End With
 With ThisWorkbook.Worksheets("Cable Work Order").Range("O1")
 .Font.Color = RGB(240, 240, 240)
 .Value = WsOut.Range("E" & lastrow + 1).Value
 End With
 For i = 2 To Excel.WorksheetFunction.CountA(Range("A:A")) 'Autocopy sum value
 If Range("A" & i).Value = BOM Then
 If rowIsBlank = (Range("H" & i).Value = "") Then
 Range("O1").Copy
 With Range("F" & i)
 .PasteSpecial xlPasteValues
 .Font.Bold = True
 .Font.Color = IIf(rowIsBlank, vbBlue, vbRed)
 End With
 End If
 End If
 Next i
 MsgBox numHits & " cells have been found", , "BoM Calculator for VM Greenfield"
 Next iCell
answered Feb 9, 2023 at 17:51
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.