时间:2015-04-28 09:12:59

标签: excel vba excel-vba

我在不同的Excel工作表中有一组数据。

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

表1:列名:

  • 姓名,班级,性别

表2:列名:

  • 姓名(班级),科目,年级

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

CODES:

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)阻止我以相同的名称和ic

获取各种数据

2 个答案:

答案 0 :(得分:0)

我的想法是在动态范围的vba中使用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

您需要更改对工作表的引用和可能使用的范围。但是我的代码是做什么的,它将采用activecell。取名称和班级,并将其格式化为&#34;名称(班级)&#34;然后粘贴到sheet3上(&#34; A2&#34;)。然后在sheet2上执行vlookup以找到与该名称匹配的任何内容,然后在Sheet3的下一列中给出主题和成绩。

编辑更新代码以修复计数问题

答案 1 :(得分:0)

假设:

  1. Sheet1和Sheet2都从第3行(标题)开始,实际数据从第4行开始。
  2. 输出在Sheet3第一行(A1)中传输。
  3. 这是一个常规模块(例如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 sub中的参数,如下所示:

    Get_Data Target.Value2, Sheet1, Me, Sheet3
    

    顺便说一下,Sheet1, Sheet2 and Sheet3是工作表代号 这是您创建新工作簿时的默认设置 现在要检查您是否使用了正确的代号,您需要在属性窗口中进行检查。

    enter image description here

    每当选择名称时都会发生这种情况。如果您想要进行更多控制,可以在Selection_Change事件中转移Double_Click代码。因此,只有双击名称才能查看记录。