Reputation:
I am currently writing a macro that literally compares line-by-line values between Excel and another program. 99% of the time, when there is a discrepancy it is because a transaction was never added. So while this macro is comparing these values, upon a discrepancy finding, I would like it to add a new "row" (however, not an entire row, only from A_:K_
, where the _
is whatever row number the active cell is). This will allow me to simply go into Excel, type in the transaction, then press OK on the macro and carry on. My macro is actually pretty simple and short & to the point, so I can just go ahead and post the entire thing here so to possibly provide a better understanding of what is happening. And I am not doing this in Excel's VBA, I am doing this in the other program's VBA, and appXL
is Excel's object as a function:
Function appXL As Object
Set appXL = GetObject(, "Excel.Application")
End Function
Sub FeeBrdVerifier
On Error Resume Next
With InitSession
Dim iComm As Currency ' Compare this with Excel's data
Dim sComm As String ' Needed string to allow app to stop at end of report
Dim xL As Currency ' Compare this with Host's data
Dim Counter As Byte ' Counter for the loop (need to do a new page)
Dim r As Byte ' Row # on the page
Dim Page As Byte
Page = 1
Debug.Print "Page # " & Page & vbNewLine & "========="
Counter = 0 ' 19 unique lines in transaction board per page
appXL.Workbooks("2016 FEE BOARD.xlsx").Activate
appXL.Range("J2").Select 'Starting point of the transaction amounts
r = 3
Do
Counter = Counter + 1
.Copy 69, r, 78, r ' This copies text from host app, consider it a 'cell'
sComm = Clipboard
iComm = CCur(sComm)
xL = appXL.ActiveCell.Value
appXL.ActiveCell.Offset("1", "0").Select
Debug.Print "# [" & Format(Counter,"00") & "].. sComm = [" & sComm & "] ... Excel Value = [" & xL & "]"
If iComm <> xL Then
.SetSelection 0, r, 80, r 'Highlights the row in host app that doesnt match
' appXL. '<<<< where I need assistance, insert line and shift down
MsgBox "Did not match..."
.ClearSelection 'Get rid of highlight after msgbox cleared
End If
r = r + 1 ' This allows the loop to copy the next line
If Counter = 19 Then
Page = Page + 1
Counter = 0
.Output E ' E is a function I use for the Return Key
Sleep 250 ' Waiting for next page to load
r = 3 ' On a new page now, go back to the top
Debug.Print vbNewLine & "Page # " & Page & vbNewLine & "========="
End If
Loop Until sComm = "" ' Reached last transaction
End With
End Sub
So, to recap, if the active cell was J495
, manually what I would do is select the range of A495:K495
, right-click selection, click Insert
, then click Shift Cells Down
. Now I just need this to be automated. Eventually I plan to also automate filling in the missing data, but this part is what comes first (or else I would just continue to manually do this myself).
As an added bonus, I would appreciate if someone could also explain how to grab the current row number where the line was inserted to so I can add this line number to the debugger window - but I can live without if necessary
Upvotes: 1
Views: 1350
Reputation: 22185
Per the comments above, I'd take @cyboashu's answer and run with it a little bit. Converting the code from using the Active*
objects and using Activate
and Select
will make the code much easier to maintain and extend. Here's a sample refactoring to use absolute references instead (to give you an idea). This is obviously untested - I don't even know what application it's running under. :-P
Sub FeeBrdVerifier()
On Error Resume Next
With InitSession
Dim iComm As Currency ' Compare this with Excel's data
Dim sComm As String ' Needed string to allow app to stop at end of report
Dim xL As Currency ' Compare this with Host's data
Dim Counter As Byte ' Counter for the loop (need to do a new page)
Dim r As Byte ' Row # on the page
Dim Page As Byte
Page = 1
Debug.Print "Page # " & Page & vbNewLine & "========="
Counter = 0 ' 19 unique lines in transaction board per page
'Get a reference to the ActiveSheet
Dim sheet As Object
Set sheet = appXL.Workbooks("2016 FEE BOARD.xlsx").ActiveSheet
r = 3
Dim currentRow As Long
currentRow = 2 'Starting point of the transaction amounts in Column J (ordinal is 10)
Do
Counter = Counter + 1
.Copy 69, r, 78, r ' This copies text from host app, consider it a 'cell'
sComm = Clipboard
iComm = CCur(sComm)
xL = sheet.Cells(currentRow, 10).Value
currentRow = currentRow + 1
Debug.Print "# [" & Format(Counter, "00") & "].. sComm = [" & sComm & "] ... Excel Value = [" & xL & "]"
If iComm <> xL Then
.SetSelection 0, r, 80, r 'Highlights the row in host app that doesnt match
sheet.Range(sheet.Cells(currentRow, 1), sheet.Cells(currentRow, 11)).Insert
MsgBox "Did not match..."
.ClearSelection 'Get rid of highlight after msgbox cleared
End If
r = r + 1 ' This allows the loop to copy the next line
If Counter = 19 Then
Page = Page + 1
Counter = 0
.Output E ' E is a function I use for the Return Key
Sleep 250 ' Waiting for next page to load
r = 3 ' On a new page now, go back to the top
Debug.Print vbNewLine & "Page # " & Page & vbNewLine & "========="
End If
Loop Until sComm = vbNullString ' Reached last transaction
End With
End Sub
Upvotes: 1
Reputation: 10433
This should work for what you are trying to do
.SetSelection 0, r, 80, r
appXL.ActiveSheet.Range(appXL.cells(appXL.activecell.Row,1),appXL.cells(appXL.activecell.Row,11)).Insert Shift:=xlDown
MsgBox "Did not match..." & " the current row number is : " & appXL.ActiveCell.Row()
'Then move to next row to continue the loop
appXL.ActiveCell.Offset(1)
Upvotes: 1