2013-09-05 22 views
0

OK等數值,這個問題聽起來很模糊,但我會盡量解釋。複製值在Excel中另一個工作表的基礎上,在片

我想某些單元格的值從一個表複製到另一個工作表。它應該將其複製到的位置由同一張表中的另一個值確定。例如:

Sheet 1中

4040-5056 ----- 4040-5056v1.7

3409-5793 ----- 3409-5793v4.3

Sheet 2中

4040-5056

3409-5793

根據你看到的,第一個值應將sheet1中第二列的值複製到sheet2中的相應單元格中。

我不知道如何做到這一點,任何幫助,將不勝感激!

預先感謝

編輯:

Sheet 1中包含具有要被複制到另一片材對應的nvalues所有值。 它必須符合的值分佈在30張左右,但都在同一份文件中。在每張表中,代碼必須查找的值都在同一列中,因此在每張表中都應該查看列A中的值是否相同。VLOOKUP的工作原理是,但仍然是一個緩慢的選項, 36.000行。如果列A的值與另一個表中列A的值相對應,代碼應該執行的操作是將B列的值複製到另一個表中。

我希望大家都能理解這個解釋。

+1

你試過VLOOKUP嗎?如果Sheet1中只有一個「ID號」出現,您應該可以使用它。 – Jaycal

+0

請編輯您的問題以使其更加精確。你的問題並沒有說它應該是純粹的VBA;也沒有幾張紙。您應該具體描述數據如何排列在幾張紙上(是固定的範圍?動態?) –

+0

我編輯它,我希望我的問題更清晰,像這樣 – user2750501

回答

0

可以使用VLOOKUP功能。無需爲此使用VBA。

表1:

 A   B   C 
1  4040-5056 4040-5056v1.7 
2  3409-5793 3409-5793V4.3 
3 

表2:

 A   B   C 
1  4040-5056 =VLOOKUP(A1;Sheet1!$A$1:$B$2;2;FALSE) 
2  3409-5793 =VLOOKUP(A2;Sheet1!$A$1:$B$2;2;FALSE) 
3 

細胞B1會顯示 「4040-5056v1.7」,細胞B2 「3409-5793V4.3」

VLOOKUP(這裏是FALSE)的最後一個參數對於你的情況很重要,因爲數據是未排序的。

+0

我已經使用過,作爲測試,不幸的是數據傳播在多張紙上,所以我正在尋找能解決所有紙張的代碼。另外,我不是唯一一個在這張工作表上工作的人,因爲其他用戶非常重要,它不涉及編寫公式或不需要複製東西。感謝您的答案,但我真的很喜歡vba的vba解決方案。 – user2750501

0

另一種解決方案,採用純VBA:

由於是性能的強烈需求,我建議使用一個字典對象,如this SO question暗示。使用字典的優勢在於,一旦建立,查找速度非常快。所以我希望我的代碼在查找中很快。另一方面,訪問單個單元(通過循環)比內置的VLOOKUP慢。

性能比較,使用參考片FOF 30'000條目,以及3片查找與每個30'000行:

  • VLOOKUP:600秒
  • VBA /字典:3秒

因此,在這種情況下,VBA字典的性能會提高200倍。

注意:你要(從VBA窗口的工具 - >參考菜單)

注意添加到「Microsoft腳本運行」的引用:該解決方案將不如果數據工作參考表不是連續的,或者是重複的。

Sub FillReferences() 

    Dim dict As New Scripting.Dictionary 
    Dim myRow As Range 
    Dim mySheet As Worksheet 

    Const RefSheetName As String = "sheet1" 
    ' 1. Build a dictionnary 
    Set mySheet = Worksheets(RefSheetName) 
    For Each myRow In mySheet.Range(mySheet.Range("A1").End(xlDown), mySheet.Range("A" & mySheet.Rows.Count).End(xlUp)) 
    ' Append A : B to dictionnary 
    dict.Add myRow.Value, myRow.Offset(0, 1).Value 
    Next myRow 

    ' 2. Use it over all sheets 
    For Each mySheet In Worksheets 
    If mySheet.Name <> RefSheetName Then 
     ' Check all cells in col A 
     For Each myRow In mySheet.Range(mySheet.Range("A1").End(xlDown), mySheet.Range("A" & mySheet.Rows.Count).End(xlUp)) 
     ' Value exists in ref sheet ? 
     If dict.exists(myRow.Value) Then 
      ' Put value in col B 
      myRow.Offset(0, 1).Value = dict(myRow.Value) 
     End If 
     Next myRow 
    End If 
    Next mySheet 

End Sub 
相關問題