VBA新手在这里。我有一个包含多个组的动态列表。每个组都会在顶部列出该组的领导者,并在下面列出该组的成员。列A中的每个列出的人旁边都有一个主键。我想取领导者的#键并将其应用于F组的领导者和组的每个成员,这样每个成员在A列中都有自己的主键#和是与列F中的 leader 主键#相关联。以下是我需要的前后两个图像:
之前
后
以下是我在概念上玩的代码:
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错误。有什么想法吗?关于如何输入公式的任何想法没有"选择"范围?我在收集许多程序员认为选择单元格是错误的编程......
答案 0 :(得分:1)
你需要VBA吗?这可以使用excel公式
来实现单元格中的公式G2
=A2
单元格中的公式G3
=IF(F3=78,A3,G2)
现在只需将公式从G3
复制到G14
如果你仍然需要VBA,那么只需为上述步骤录制一个宏并修改它:)
关注(来自评论)
应避免使用.Select
。
INTERESTING 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