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

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

– 使用Vlookup在Sheet1的列C中查找值“Rec”,并在列D中select该行的相应值

然后从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 

我也有另外一个能findB 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结果。 任何帮助将不胜感激,谢谢!

尝试这个:

 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)我们使用.Offset(1, 0)来获取这个单元格(下一个空白单元格),并将你的vlookup的值直接写入这个单元格。

因此,作为初学者,您可以通过devise两个独立的子例程来开始工作,然后进行集成。 当事情变得更加复杂时,这是一个让你头痛头痛的基本方法。 因此,要回答你如何整合这两个问题的直接问题,我build议做这样的事情

 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 

话虽如此,正如macros观指出的那样,你可以通过一个class轮来敲出完全相同的function。 保持操作步骤是分开的(现在实际上是两个class轮),看起来像这样。

 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 

就像我说的,如果你打算继续开发,通常是一个好主意,用你已经开始的方式,用独立的操作来devise你的代码。 您可以通过将工作表,范围,列或其他有用的参数作为parameter passing给预定义的任务或子例程来构build。

此外,请注意,我使用Value2而不是Value 。 我注意到你正在检索货币价值,所以两者之间实际上有一个小的差异。 Value2为您提供货币格式化值后面更准确的数字(虽然可能不必要),也更快(尽pipe在这种情况下可能可以忽略不计)。 只是要注意的事情。

另外,我注意到你使用的工作表对象有点奇怪,所以我认为它可以帮助你提到你可以通过它的对象名来select一个工作表对象,它的名字属性(使用sheets()或工作表()),索引号(使用表单()或工作表())或“活动”前缀。 重要的是要注意,你在一个子程序中所做的是将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 

您可以查看和更改图表对象的名称,以及它的名称属性(这是不同的)在这里…

在这里输入图像说明

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

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

出于许多原因,build议尽可能避免在VBA中使用(select,复制,粘贴),并使用相当直接的复制方法(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