使用Vlookup将数据复制并粘贴到使用VBA的单独工作表中

时间:2015-09-24 15:10:31

标签: excel vba excel-vba vlookup

好吧,我是VBA的初学者,所以我需要一些帮助。假设这是非常基本的,但以下是我正在寻找代码的步骤:

- 使用Vlookup查找值" Rec"在Sheet1的C列中,选择该行在D列中的对应值

- 然后从Sheet1中的D列复制该值并将其粘贴到另一个名为Sheet2的工作表B列的第一个空白单元格中

我有一个基本代码,使用Vlookup查找Rec以及它在D列中的相应值,然后显示一个消息。代码工作正常,如下:

Sub BasicFindGSV()
Dim movement_type_code As Variant
Dim total_gsv As Variant
movement_type_code = "Rec"
total_gsv = Application.WorksheetFunction.VLookup(movement_type_code,Sheet1.Range("C2:H25"), 2, False)
MsgBox "GSV is :$" & total_gsv
End Sub

我还有另一个会找到B列Sheet2中的下一个空白单元格,它也有效:

Sub SelectFirstBlankCell()
Dim Sheet2 As Worksheet
Set Sheet2 = ActiveSheet
For Each cell In Sheet2.Columns(2).Cells
If IsEmpty(cell) = True Then cell.Select: Exit For
Next cell
End Sub

不确定如何集成这两者,我不知道如何使代码粘贴Sheet2中的Vlookup结果。非常感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:1)

因此,作为初学者,您可以通过设计两个独立的子程序来确定工作,然后进行整合。当事情变得更加复杂时,这是在头痛之后为您节省头痛的基本方法。因此,要回答关于如何整合这两者的直接问题,我建议做类似的事情

Sub BasicFindGSV()
    Dim movement_type_code As Variant
    Dim total_gsv As Variant
    movement_type_code = "Rec"
    total_gsv = Application.WorksheetFunction.VLookup(movement_type_code, Sheet1.Range("C2:H25"), 2, False)
    AssignValueToBlankCell (total_gsv)
End Sub
Sub AssignValueToBlankCell(ByVal v As Variant)
    Dim Sheet2 As Worksheet
    Set Sheet2 = ActiveSheet
    For Each cell In Sheet2.Columns(2).Cells
        If IsEmpty(cell) = True Then cell.Value2 = v
    Next cell
End Sub

话虽如此,正如Macro Man指出的那样,你可以用一个衬垫击败你要求的完全相同的功能。保持操作步骤分开(现在实际上是两个衬管)看起来像这样。

Sub FindGSV()
    AssignValueToBlankCell WorksheetFunction.VLookup("Rec", Sheet1.Range("C2:H25"), 2, False)
End Sub
Sub AssignValueToBlankCell(ByVal v As Variant)
    Sheet3.Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Value2 = v
End Sub

就像我说的那样,如果你计划继续开发,那么以你已经开始的方式设计具有独立操作的代码通常是一个好主意。您可以通过将工作表,范围,列或其他有用参数作为参数传递给预定义任务或子例程来构建此功能。

另外,请注意我使用Value2 instead of Value。我注意到你正在检索一个货币值,所以实际上两者之间的差别很小。 Value2为您提供货币格式化值后面更准确的数字(虽然可能是不必要的),并且速度也更快(尽管在这种情况下可能忽略不计)。但是要注意一些事情。

另外,我注意到你对工作表对象的使用有点奇怪,所以我认为它有助于提到你可以通过它的对象名称选择一个工作表对象,它的名称属性(使用sheet()或工作表()),索引号(带有sheet()或工作表()),或者" Active"字首。请务必注意,您在一个子例程中执行的操作是将Sheet2对象的引用重新分配给活动工作表,这意味着它可能最终成为任何工作表。这证明了这个问题:

Sub SheetSelectDemo()
    Dim Sheet2 As Worksheet
    Set Sheet2 = Sheets(1)
    MsgBox "The sheet object named Sheet2 has a name property equal to " & Worksheets(Sheet2.Name).Name & " and has an index of " & Worksheets(Sheet2.Index).Index & "."
End Sub

您可以在此处查看和更改工作表对象的名称及其名称属性(不同)...

enter image description here

name属性是您在Excel中的工作表选项卡中看到和更改的内容,但这又与对象名称不同。您也可以通过编程方式更改这些内容。

答案 1 :(得分:0)

试试这个:

Sub MacroMan()

    Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Value = _
        WorksheetFunction.VLookup("Rec", Sheet1.Range("C2:H25"), 2, False)

End Sub

Range("B" & Rows.Count).End(xlUp)命令相当于转到B列的最后一个单元格并按 Ctrl +

然后我们使用.Offset(1, 0)在之后获取单元格(下一个空格)并将vlookup的值直接写入此单元格。

答案 2 :(得分:0)

如果两者都工作,那么很好,你有两个工作潜艇,你想要整合它们。您可能希望保留它们,以便以后可能对其他一些工作有用。集成它们意味着在第三个例程中调用它们。

由于许多原因,肯定会更好并建议尽可能避免在VBA中使用(选择,复制,粘贴),并使用直接复制方法(range1.copy range2)。

你需要将你的例程作为返回范围对象的函数,然后在第三个例程中调用它们

Function total_gsv() as range
    Dim movement_type_code As Variant:  movement_type_code = "Rec"
    Set total_gsv = Application.WorksheetFunction.VLookup(movement_type_code,Sheet1.Range("C2:H25"), 2, False)
End Sub

Function FindFirstBlankCell() as Range
    Dim Sheet2 As Worksheet: Set Sheet2 = ActiveSheet
    For Each cell In Sheet2.Columns(2).Cells
      If IsEmpty(cell) Then Set FindFirstBlankCell= cell: exit For
    Next cell
End Sub

Sub FindAndMoveGsv()
       total_gsv.copy FindFirstBlankCell
   ... 'some other work 
End Sub