Вопрос

VBA newbie here. I have a dynamic list of multiple groups. Each group lists the leader of the group at the top with the members of the group below. There is a primary key in Column A next to each listed person. I want to take the leader's key # and apply it to Column F for the leader and each member of the group, such that each member has their own primary key # in Column A and is associated with their leader's primary key # in Column F. Here are two images of what I need for the before and after:

Before Before:

After After:

Here is the code I am playing around with conceptually:

Sub Apply_Leader_Code()

Dim wSht As Worksheet
Dim lStart As Long, lEnd As Long, lLdrID As Long

Set wSht = ThisWorkbook.Sheets("Upload")

With wSht.Range("A1:G" & Range("A" & Rows.Count).End(xlUp).Row)
    lStart = .Rows.Find("78") 'Find the first row for each group
    lEnd = .Rows.FindNext("78") - 1 'Find the last row for each group
If .Range("G" & lStart & ":G" & lEnd).Value = "" Then 
        'If there is no leader ID yet, then continue...
    lLdrID = .Cells(lStart, 1).Value 'Assign leader's primary key to the variable
    .Cells(lStart, 7).Value = lLdrID 'Place lLdrID value into Column G
    .Range("F" & lStart & ":F" & lEnd).FillDown 'Fill value to end of group range
Else
        '..otherwise, set start/end rows for next group.
    lStart = .Rows.FindNext("Leader")
    lEnd = .Rows.FindNext("Leader") - 1
End If
End With
End Sub

The above code isn't actually applicable, but I hope represents what I think is a reasonable way to solve this problem. I can (maybe?) figure out how to do this for the first group, but how do I then perform the same .FillDown function for each subsequent group?

--EDIT--

In regards to Siddarth Rout's answer below, here is my newer code:

Range("G2").Select
ActiveCell.FormulaR1C1 = "=RC[-6]"
Range("G3").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-1]=78,RC[-6],R[-1]C)"
Range("G3").Select
Selection.AutoFill Destination:=Range("G3:G" & Range("G" & Rows.Count).End(xlUp).Row)

I used the Macro creator in Excel and then edited it to what I thought would enable it to have a dynamic range instead of a set range. Now I'm getting a 400 error. Any ideas why? Any ideas on how to input the formulas w/o "selecting" the range? I am gathering that many programmers think that selecting cells is bad programming...

Это было полезно?

Решение

Do you need VBA for this? This can be achieved using excel formulas

Formula in Cell G2

=A2

Formula in Cell G3

=IF(F3=78,A3,G2)

now simply copy the formula from G3 down to G14

enter image description here

If you still need VBA then simply record a macro for the above steps and amend it :)

FOLLOWUP (From Comments)

Yes .Select should be avoided. INTERESTING READ

Also no need to use R1C1 format. You can directly specify the formula

And one more thing. You don't need to use Autofill. You can skip that step by directly filling all the relevant cells with the relevant formula in ONE GO

Is this what you are trying?

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim lRow As Long

    '~~> Change this to the relevant sheet
    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        '~~> Find the last cell in Col A which has data
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        '~~> Enter first formula
        .Range("G2").Formula = "=A2"

        '~~> Enter 2nd formula in all the
        '~~> cells in one go rather than autofill
        .Range("G3:G" & lRow).Formula = "=IF(F3=78,A3,G2)"
    End With
End Sub
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top