在多个后续范围中查找值和.filldown?

时间:2013-12-10 18:54:07

标签: excel-vba fill vba excel

VBA新手在这里。我有一个包含多个组的动态列表。每个组都会在顶部列出该组的领导者,并在下面列出该组的成员。列A中的每个列出的人旁边都有一个主键。我想取领导者的#键并将其应用于F组的领导者和组的每个成员,这样每个成员在A列中都有自己的主键#是与列F中的 leader 主键#相关联。以下是我需要的前后两个图像:

之前 Before:

After:

以下是我在概念上玩的代码:

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

上述代码实际上并不适用,但我希望代表我认为解决此问题的合理方法。我可以(可能?)弄清楚如何为第一组执行此操作,但如何为每个后续组执行相同的.FillDown功能?

- 的修改 -

关于下面的Siddarth Rout的回答,这是我的新代码:

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)

我在Excel中使用了宏创建器,然后将其编辑为我认为可以使其具有动态范围而不是设定范围。现在我收到了400错误。有什么想法吗?关于如何输入公式的任何想法没有"选择"范围?我在收集许多程序员认为选择单元格是错误的编程......

1 个答案:

答案 0 :(得分:1)

你需要VBA吗?这可以使用excel公式

来实现

单元格中的公式G2

=A2

单元格中的公式G3

=IF(F3=78,A3,G2)

现在只需将公式从G3复制到G14

即可

enter image description here

如果你仍然需要VBA,那么只需为上述步骤录制一个宏并修改它:)

关注(来自评论)

应避免使用.SelectINTERESTING READ

也无需使用R1C1格式。您可以直接指定公式

还有一件事。您无需使用Autofill。您可以通过在 ONE GO

中使用相关公式直接填充所有相关单元格来跳过该步骤

这是你在尝试的吗?

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