试试这个代码:
Sub test()
Dim wb As Workbook
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim lastrow As Long
Dim rng As Range
'if workbook2 is already opened
Set wb = Workbooks("Book2") ' change Book2 to suit
'if workbook2 is not opened
'Set wb = Workbooks.Open("C:\Book2.xlsx")
'change sheet1 to suit
Set ws1 = ThisWorkbook.Worksheets("Sheet1")
'change sheet2 to suit
Set ws2 = wb.Worksheets("Sheet2")
With ws1
'change column B to column with your values "PDC", "SR3" and so on
lastrow = .Cells(.Rows.Count, "B").End(xlUp).Row
'change to address of range you wnat to sort
Set rng = .Range("A1:B" & lastrow)
With rng.Offset(, rng.Columns.Count).Resize(, 1)
.EntireColumn.Insert
.Offset(, -1).FormulaR1C1 = "=MATCH(RC[-1],'[" & wb.Name & "]" & ws2.Name & "'!C1:C1,0)"
.Offset(, -1).Value = .Offset(, -1).Value
End With
With rng.Resize(, rng.Columns.Count + 1)
.Sort Key1:=.Cells(1, .Columns.Count), Order1:=xlAscending, Header:=xlGuess
.Cells(1, .Columns.Count).EntireColumn.Delete
End With
End With
wb.Close
End Sub
说明:
- 有两个工作簿。代码应该放在第一个工作簿中(您要对范围进行排序的地方)
- 主要思想是使用
=MATCH(B1,[Book2]Sheet2!A:A,0) 之类的公式添加临时列,以从 A 列 (workbook2) 中的 B 列 (workbook1) 中获取值的行数。
- 根据此数字对范围进行排序。
- 删除临时列
注意事项:
下一行假设带有“PDC”、“SR3”的列(在工作簿 1 中)位于所选范围的最后一个(Set rng = .Range("A1:B" & lastrow)):
.Offset(, -1).FormulaR1C1 = "=MATCH(RC[-1],'[" & wb.Name & "]" & ws2.Name & "'!C1:C1,0)"
如果不正确,请将RC[-1] 更改为,如果此列是最后一列,则说RC[-2],依此类推。
C1:C1 部分公式表示在workbook2 的“PDC”列中,“SR3”是A 列(第1 列)。如果不正确,请将其更改为 C5:C5,这意味着该列是 E(第 5 列)。