【问题标题】:Using Vlookup to copy and paste data into a separate worksheet using VBA使用 Vlookup 将数据复制并粘贴到使用 VBA 的单独工作表中
【发布时间】:2015-09-24 15:10:31
【问题描述】:

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

-使用Vlookup在Sheet1的C列中查找“Rec”值,并在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

不知道如何整合两者,也不知道如何让代码将Vlookup结果粘贴到Sheet2中。任何帮助将不胜感激,谢谢!

【问题讨论】:

  • Worksheets("sheet2").Range("B" & Rows.count).End(xlUp).Offset (1) = total_gsv 替换第一个宏上的 msgbox 它将找到下一个空单元格并将 tota_gsv 的值放入该单元格。
  • @ScottCraner 你没有答案
  • @AndréNeves Bom Dia,这是一个简单的修复工作。我觉得这并不能证明一个完整的答案是合理的。但我喜欢宏人花时间清理所有多余代码的方式。

标签: vba excel vlookup


【解决方案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() 或 worksheets())选择工作表对象会有所帮助、索引号(使用 sheet() 或 worksheets())或“活动”前缀。请务必注意,您在一个子例程中所做的是将 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

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

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

【讨论】:

    【解决方案2】:

    试试这个:

    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 值直接写入此单元格。

    【讨论】:

    • 巨大的帮助,感谢您清理它——效果很好!代码的下一步是查找 C 列中的所有“Rec”值,并将它们在 D 列中的所有对应值相加,然后像之前一样将总和放入 Sheet2。我猜我应该使用某种 Do Until 循环,但我不完全确定如何格式化它......本质上它需要为我们在其中看到“Rec”的每个实例添加 D 列中的每个值C 栏。如果您有任何建议,请告诉我。谢谢
    • @Willarci3 您可以使用循环或 sumif 来执行此操作,但听起来您正在寻找数据透视表,您尝试过吗?
    【解决方案3】:

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

    由于许多原因,在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多