简体   繁体   English

具有动态范围的 VBA VLOOKUP

[英]VBA VLOOKUP with dynamic range

I am brand-new to VBA.我是 VBA 的新手。

I have two worksheets in the same workbook.我在同一个工作簿中有两个工作表。 The first worksheet, shStudentInfo, contains all of the information for each of my students, one row per StudentID (B4 in the code).第一个工作表 shStudentInfo 包含我每个学生的所有信息,每个 StudentID 一行(代码中的 B4)。 The second worksheet, shSchedData, contains their schedules where there may be 0-14 rows per StudentID, depending on how many courses each student is taking.第二个工作表 shSchedData 包含他们的时间表,其中每个 StudentID 可能有 0-14 行,具体取决于每个学生参加的课程数量。

I am attempting to use a loop and VLOOKUP with a dynamic range to extract the course name from each row of shSchedData and copy it to the appropriate cell in shStudentInfo, then move down one row.我正在尝试使用具有动态范围的循环和 VLOOKUP 从 shSchedData 的每一行中提取课程名称并将其复制到 shStudentInfo 中的相应单元格,然后向下移动一行。 Currently I've hardcoded cell "CO4" as the appropriate cell although I will also need to make that reference move one cell to the right for each pass through the loop.目前,我已将单元格“CO4”硬编码为适当的单元格,尽管我还需要使该引用在每次通过循环时向右移动一个单元格。

Here is my inelegant code:这是我不雅的代码:

Option Explicit
Dim MyRow As Long

Sub StudentSchedules()

Dim EndRow As Long
Dim MyRng As Range

shSchedData.Activate

'hard code first row of data set
MyRow = 3
'dynamic code last row of data set
EndRow = shSchedData.Range("A1048575").End(xlUp).Row

'create a dynamic range, a single row from shSchedData
Set MyRng = ActiveSheet.Range(Cells(MyRow, 1), Cells(MyRow, 9))

'Loop through entire data set one line at a time
Do While MyRow <= EndRow

    shSchedData.Select
    MyRng = ActiveSheet.Range(Cells(MyRow,1),Cells(MyRow,9))

    shStudentInfo.Select

   'Import course name from shSchedData worksheet
    Range("CO4").Select                                                                                         
    ActiveCell.Clear

    ActiveCell.Formula = "=VLOOKUP(B4,'Schedule Data'!& MyRng,6,0)"    
    'The above line results in a #NAME? error in CO4 of shStudentInfo

    'Also tried:
    'ActiveCell.Formula = "=VLOOKUP(B4,'Schedule Data'!& MyRng.Address,6,0)" 

    'increment counter
    MyRow = MyRow + 1

Loop
End Sub

The following rewrite will get your code working to the extent that its purpose can be determined.以下重写将使您的代码在其目的可以确定的范围内工作。

The VLOOKUP formula does not appear correct and in any event, there might be a better method of retrieving the data. VLOOKUP 公式看起来不正确,无论如何,可能有更好的方法来检索数据。 However, I cannot determine your end purpose from your narrative or code.但是,我无法从您的叙述或代码中确定您的最终目的。 Sample data together with expected results would help.样本数据和预期结果会有所帮助。

Option Explicit

'I see no reason to put this here
'dim myRow As Long

Sub StudentSchedules()

    Dim myRow, endRow As Long, myRng As Range

    'no need to activate, just With ... End With block it
    With shSchedData

        'assigned a strarting value
        myRow = 3
        'dynamic code last row of data set
        endRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        'Loop through entire data set one line at a time
        Do While myRow <= endRow

            'create a dynamic range, a single row from shSchedData
            Set myRng = .Range(.Cells(myRow, 1), .Cells(myRow, 9))

           'Import course name from shSchedData worksheet
            shStudentInfo.Range("CO4").Offset(0, myRow - 3).Formula = _
              "=VLOOKUP(B4, " & myRng.Address(external:=True) & ", 6, false)"

            'increment counter
            myRow = myRow + 1

        Loop
    End With

End Sub

I came up with this, see if it fits you我想出了这个,看看它是否适合你

Dim a As Double
Dim b As Double
Dim ml As Worksheet
Dim arrayrng As Variant
Dim i As Integer
Dim x As String
Dim y As String
Set ml = Worksheets("Master Data")

a = ml.Cells(Rows.Count, 11).End(xlUp).Row
b = ml.Cells(Rows.Count, 1).End(xlUp).Row

For i = a To b - 1
a = ml.Cells(Rows.Count, 11).End(xlUp).Row
b = ml.Cells(Rows.Count, 1).End(xlUp).Row
arrayrng = "E" & a + 1

x = "=VLOOKUP(" & arrayrng
y = ",'Data Base'!I:J,2,0)"enter code here

Range("K" & a + 1) = x + y
Next

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM