在两个表中都有共同的列但行号不同

我有不同的excel表中的一组数据。

两张纸都有一个共同的列。 列名:表1中的名称和表2中的名称(类))

表1:列名称:

  • 姓名,class级,性别

表2:列名称:

  • 姓名(class级),学科,年级

我希望能够点击任何表格中的单元格,并指引我到表单3,其中显示与所选单元格相关的相关数据。 例如,如果我要在工作表1中单击一个名称,该名称和与该名称相关的数据将显示在工作表3中。工作表1和工作表2中的名称行号是不同的。

码:

DetailsUsedRange = ThisWorkbook.Sheets("Sheet1").UsedRange.Rows.Count With ActiveCell Name = ThisWorkbook.Sheets("Sheet1").Cells(.Row, 9) NoName = InStr(1, "(" & ThisWorkbook.Sheets("Sheet2").Cells(.Row, 1) & ")", (Name)) MsgBox NoName MsgBox Name For i = DetailsUsedRows To 1 Step -1 If (NoName <> 0) Then ThisWorkbook.Sheets("Student Viewer").Cells(2, 3).Value = ThisWorkbook.Sheets("Sheet1").Cells(.Row, 1).Value ..... end if next i 

我希望它能像这样显示。 但名字(IC)阻止我得到同名和不同的数据

我的想法是在vba中使用dynamic范围的vlookup。

 Dim i As Long, k As Long i = Sheets("sheet2").UsedRange.Rows.Count k = 1 With ActiveCell Sheets("Sheet3").Range("A2") = ActiveCell & "(" & ActiveCell.Offset(0, 1) & ")" For J = 2 To i k = WorksheetFunction.Match(Sheets("Sheet3").Range("A2"), Sheets("sheet2").Range("A2:A9"), 0) + k If k > i Then Exit For End If Sheets("sheet3").Range("A" & J) = Sheets("Sheet3").Range("A2") Sheets("Sheet3").Range("B" & J) = WorksheetFunction.VLookup(Sheets("sheet3").Range("A2"), Sheets("Sheet2").Range("A" & k & ":C" & i), 2, 0) Sheets("Sheet3").Range("C" & J) = WorksheetFunction.VLookup(Sheets("sheet3").Range("A2"), Sheets("Sheet2").Range("A" & k & ":C" & i), 3, 0) Next End With Sheets("sheet3").activate 

您将需要更改对工作表的引用和可能的范围。 但是,我的代码是做什么的,它会采取活动单元。 把名字和类别放在“名称(类别)”格式中,然后粘贴到表格3(“A2”)上。 然后,在sheet2上进行vlookup查找与名称匹配的任何匹配,然后在Sheet3的下一列中给出主题和等级。

编辑更新的代码来解决计数问题

假设:

  1. Sheet1和Sheet2从行3(标题)开始,实际数据从行4开始。
  2. 输出在Sheet3第一行(A1)中传输。

这转到一个常规模块(例如Module1

 Sub Get_Data(val As String, source1 As Worksheet, _ source2 As Worksheet, dest As Worksheet) Dim lr As Long With source1 lr = .Range("A" & .Rows.Count).End(xlUp).Row With .Range("A3:C" & lr) .AutoFilter 1, val .SpecialCells(xlCellTypeVisible).Copy dest.Range("A1") End With .AutoFilterMode = False End With With source2 lr = .Range("A" & .Rows.Count).End(xlUp).Row With .Range("A3:C" & lr) .AutoFilter 1, val .Offset(0, 1).Resize(, 2).SpecialCells( _ xlCellTypeVisible).Copy dest.Range("D1") End With .AutoFilterMode = False End With End Sub 

这转到您的Sheet1代码模块。

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) On Error GoTo halt Application.EnableEvents = False Dim r As Range, lr As Long With Me lr = .Range("A" & .Rows.Count).End(xlUp).Row Set r = .Range("A4:A" & lr) Sheet3.Cells.ClearContents If Not Intersect(Target, r) Is Nothing _ And Len(Target.Value2) <> 0 Then Get_Data Target.Value2, Me, Sheet2, Sheet3 Sheet3.Activate ' Just to view Sheet3 End If End With moveon: Application.EnableEvents = True Exit Sub halt: MsgBox Err.Description Resume moveon End Sub 

现在,如果您想在Sheet2中使用相同的效果,则还需要在其中添加相同的事件。
注意你需要在Get_Data子目录中添加这样的参数:

 Get_Data Target.Value2, Sheet1, Me, Sheet3 

顺便说一句, Sheet1, Sheet2 and Sheet3是表单代号。
这是您创build新工作簿时的默认值。
现在检查你是否使用了正确的代号,你需要在属性窗口中检查它。

在这里输入图像说明

所以只要select一个名字就会发生这种情况 如果您想要进行更多控制,则可以在Double_Click事件中传输Selection_Change代码。 所以如果你双击这个名字,你只会查看logging。