我想要一个宏,可以从我的样本数据中找到列B到G之间的前三个值,然后将值复制并粘贴到列Q中的另一列,其中包含来自它的行(在列A和行内(行) A)它来自。
EG。
D1 D2 D3
Seq RowA ColumnA
T1 10 20 30 After running macro: T1 D3 30
T2 11 22 2 T2 D2 22
T3 2 3 10 T4 D3 21
T4 6 19 21
Sub Top3()
Dim rng As Range
Dim i As Integer
Dim r As Integer
Range("B2").CurrentRegion.Copy
Range("Q2").PasteSpecial Paste:=xlPasteValues
Range("Q2").CurrentRegion.Sort Key1:=Range("B2"), Order1:=xlDescending
r = 5
For i = 1 To 3
Cells(r, "R") = Cells(r + 1, "A")
Cells(r, "S") = Cells(r + 1, "A")
r = r + 1
Next
Range("B2").CurrentRegion.Clear
Range("C2").Activate
End Sub
答案 0 :(得分:0)
Target
:值列表中的所有单元格Target
是3列x 4行Target.Address = $B$2:$D$5
Target(1)
指的是第一个单元格Target(Target.Cells.Count)
是最后一个单元格Target(x)
受其列绑定
Target(4)
与Target.Cells(2, 1)
Target(x)
不受其行的约束
Target
中的第一列是B列,最后一行是5. Target
范围之外的下一个单元格是B列第6行Target(Target.Cells.Count + 1).Address = $B$6
通过这些信息,我们可以创建Data
的一维数组,其索引和值与Target
的索引和值匹配。使用1D数组可以使用内置的Excel WorksheetFunctions轻松引用Target
范围内的单元格。
Sub GetTop3()
Dim Data
Dim Target As Range
Dim index As Long, x As Long
Set Target = Range("Offset(B1,1,0,Counta(B:B)-1,3)")
ReDim Data(1 To Target.Cells.Count)
For x = 1 To Target.Cells.Count
Data(x) = Target(x)
Next
For x = 2 To 4
index = WorksheetFunction.Match(WorksheetFunction.Max(Data), Data, 0)
With Target(index)
Cells(x, "R") = Rows(.Row).Columns("A")
Cells(x, "S") = Cells(1, .Column)
Cells(x, "T") = .Value
End With
Data(index) = vbNullString
Next
End Sub
此博客显示了如何使用Offset
工作表功能来调整范围:Advanced Excel Dynamic Named Ranges