anon
anon

Reputation:

Excel VBA: Locating Current Row Number and Inserting a Row on Condition

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

The Main Macro:

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

Answers (2)

Comintern
Comintern

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

cyboashu
cyboashu

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

Related Questions