VBA VLOOKUP具有动态范围

时间:2018-07-15 12:30:31

标签: excel-vba dynamic vlookup do-while named-ranges

我是VBA的新手。

我在同一工作簿中有两个工作表。第一个工作表shStudentInfo包含每个学生的所有信息,每个StudentID(代码中的B4)一行。第二个工作表shSchedData包含时间表,其中每个StudentID可能有0-14行,具体取决于每个学生参加的课程数。

我正在尝试使用具有动态范围的循环和VLOOKUP从shSchedData的每一行中提取课程名称,并将其复制到shStudentInfo中的相应单元格中,然后向下移动一行。目前,我已经将“ CO4”单元格硬编码为适当的单元格,尽管对于循环中的每一遍,我还需要使该引用向右移动一个单元格。

这是我的优雅代码:

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

2 个答案:

答案 0 :(得分:0)

以下重写将使您的代码在可以确定其目的的范围内工作。

VLOOKUP公式显示不正确,无论如何,可能有更好的方法来检索数据。但是,我无法从您的叙述或代码中确定您的最终目的。样本数据以及预期结果将有所帮助。

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

答案 1 :(得分:-1)

我想到了这个,看它是否适合你

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