簡體   English   中英

使用Vlookup使用VBA復制數據並將其粘貼到單獨的工作表中

[英]Using Vlookup to copy and paste data into a separate worksheet using VBA

好吧,我是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中。 任何幫助將不勝感激,謝謝!

因此,對於初學者來說,您可以通過設計兩個可以確認工作然后進行集成的獨立子例程來開始一個良好的開端。 這是基本的方法,可以在事情變得更加復雜時為您省去頭痛。 因此,要回答您有關如何將兩者整合的直接問題,我建議您執行以下操作

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而不是Value 我注意到您正在檢索貨幣值,因此兩者之間實際上存在很小的差異。 Value2為您提供了比貨幣格式的值更准確的數字(雖然可能不必要),並且速度更快(盡管在這種情況下可以忽略不計)。 只是一些需要注意的事情。

另外,我注意到您對工作表對象的使用有些奇怪,因此我想提一下您可以通過對象名稱,名稱屬性(帶有sheets()或worksheets()),索引號來選擇工作表對象,這對我們很有幫助。 (帶有sheets()或worksheets()),或“ 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

您可以在此處查看和更改圖紙對象的名稱及其名稱屬性(不同)。

在此處輸入圖片說明

名稱屬性是您在Excel的工作表選項卡中看到並更改的屬性,但再次與對象名稱不同。 您還可以通過編程方式更改這些內容。

嘗試這個:

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的值直接寫入此單元格。

如果兩個都正常工作,那么很好,您有兩個工作子,並且想要將它們集成在一起。 您可能希望保留它們,以便它們在以后的其他工作中很有用。 集成它們意味着在某些第三例程中調用它們。

由於許多原因,它肯定更好,建議您盡可能避免在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM