2017-09-26 103 views
0

將單元格從一個表格複製到另一個表格,找到並匹配列標題名稱並粘貼到正確的單元格。這些列標題名稱在每張表中略有不同,儘管它們包含相同的數據。我的工作代碼有很多重複的:VBA-excel詞典

' sub that finds head in a specified worksheet and sets rngCol variable 
Sub rngByHead(Sheet As Worksheet, head As String) 
' sub for copying data 
With Source1 
    ' find and set producer, note name difference) 
    Call rngByHead(Source1, "bedrijfsnaam") 
    Dim producent As String 
    producent = .Cells(docSource1.Row, rngCol).Value 
    ' find and set Fase 
    Call rngByHead(Source1, "Fase") 
    Dim fase As String 
    fase = .Cells(docSource1.Row, rngCol).Value 
    ' find and set Status 
    Call rngByHead(Source1, "Status") 
    Dim status As String 
    status = .Cells(docSource1.Row, rngCol).Value 
    ' find and set versionnumber, note name difference 
    Call rngByHead(Source1, "Wijziging") 
    Dim versienummer As String 
    versienummer = .Cells(docSource1.Row, rngCol).Value 
End With 
With Target 
    ' find and write all variables to uploadlijst 
    Call rngByHead(Target, "bestandsnaam") 
    .Cells(cell.Row, rngCol).Value = bestand 
    Call rngByHead(Target, "producent") 
    .Cells(cell.Row, rngCol).Value = producent 
    Call rngByHead(Target, "fase") 
    .Cells(cell.Row, rngCol).Value = LCase(fase) 
    Call rngByHead(Target, "status") 
    .Cells(cell.Row, rngCol).Value = LCase(status) 
    Call rngByHead(Target, "versienummer") 
    .Cells(cell.Row, rngCol).Value = versienummer 
End With 

我試圖用字典匹配目標和數據表不同的頭名一個更清潔的選擇。我還創建了一個secong字典來將這些值存儲在特定的鍵下。我不斷收到此代碼的錯誤,這兩個對象因爲ByRef參數類型不匹配而丟失。

' Create dict 
Dim dict As Scripting.Dictionary 
' Create dictValues 
Dim dictValues As Scripting.Dictionary 
Dim key As Object 
    ' Add keys to dict 
    dict("producent") = "Bedrijfsnaam" 
    dict("fase") = "Fase" 
    dict("status") = "Status" 
    dict("versienummer") = "Wijziging" 
    dict("documentdatum") = "Datum" 
    dict("omschrijving1") = "Omschrijving 1" 
    dict("omschrijving2") = "Omschrijving 2" 
    dict("omschrijving3") = "Omschrijving 3" 
    dict("discipline") = "Discipline" 
    dict("bouwdeel") = "Bouwdeel" 
    dict("labels") = "Labels" 
' store values of sheet Source 1 
With Source1 
    ' create second dictValues to store values for each key 
    Set dictValues = New Scripting.Dictionary 
    ' loop through keys in dict, this line gives error 424 
    For Each key In dict.Keys 
      ' use dict to pass right value to rngByHead sub 
      Call rngByHead(Target, dict(key)) 
      ' store value of cell to dictValues under same key 
      dictValues(key) = .Cells(cell.Row, rngCol).Value 
    Next key 
End With 
' set values to sheet Target 
With Target 
    ' loop through keys in dict 
    For Each key In dict.Keys 
      ' use dict to pass value of key item to rngByHead sub 
      Call rngByHead(Target, key) 
      ' set value of cell to dictValues 
      .Cells(cell.Row, rngCol).Value = dictValues(key) 
    Next key 
End With 

我在做什麼錯?我是vba字典的新手,無法弄清楚這一點。謝謝你的幫助!

回答

0

嘗試這樣的:

Dim dict As New Scripting.Dictionary 
Dim dictValues As New Scripting.Dictionary 

關鍵字NewScripting.Dicitionary型初始化的對象。如果沒有它,則不會初始化新對象,只會聲明Scripting.Dictionary類型的對象。這在VBA中稱爲早期綁定。看到這裏有點 - What is the difference between Early and Late Binding?

+0

仍然給在'呼叫rngByHead(目標,關鍵)的可變密鑰錯誤_ByRef參數類型不匹配:' – thomascs

0

我修好了!將代碼發佈到Stackoverflow以供將來參考。結果很簡單,我的字典工作正常。 keyk變量被設置爲VariantObject,所以它沒有正確地將它的值作爲String傳遞給rngByHead子。將k轉換爲str作爲String的竅門。

'sub that finds head in a specified worksheet and sets rngCol variable 
Sub rngByHead(Sheet As Worksheet, head As String) 
'setting up dictionary 
Dim dict As New Scripting.Dictionary 
Dim dictValues As New Scripting.Dictionary 
Dim k As Variant 
Dim str As String 
'create dictionary 
Set dictValues = New Scripting.Dictionary 
Set dict = New Scripting.Dictionary 
    'add keys to dict 
    dict("producent") = "Bedrijfsnaam" 
    dict("fase") = "Fase" 
    dict("status") = "Status" 
    dict("versienummer") = "Wijziging" 
    dict("documentdatum") = "Datum" 
    dict("omschrijving1") = "Omschrijving" 
    dict("omschrijving2") = "Omschrijving 2" 
    dict("omschrijving3") = "Omschrijving 3" 
    dict("discipline") = "Discipline" 
    dict("bouwdeel") = "Bouwdeel" 
    dict("labels") = "Labels" 
'store values of sheet Source 1 
With Source1 
    'find and set variables using dictionary 
    'creating array of keys 
    keys = dict.keys 
    For Each k In keys 
     Call rngByHead(Source1, dict(k)) 
     dictValues(k) = .Cells(docSource1.Row, rngCol).Value 
    Next 
End With 
With Target 
    'find and write variables using dictionary 
    For Each k In keys 
     'converting k as Variant to str as String 
     str = k 
     Call rngByHead(Target, str) 
     .Cells(cell.Row, rngCol).Value = dictValues(k) 
    Next 
End With 

另注:你有Tools>References下的Microsoft Visual Basic代碼編輯器,使Microsoft Scripting Runtime

提供的用戶已啓用該選項Trust Access to the VBA Project object modelFile - >Options - >Trust Center - >Trust Center Setttings - >Macro Settings。你可以運行該代碼,並啓用Microsoft Scripting Runtime參考:

Sub Test() 
    Dim Ref As Object, CheckRefEnabled% 
    CheckRefEnabled = 0 
    With ThisWorkbook 
     For Each Ref In .VBProject.References 
      If Ref.Name = "Scripting" Then 
       CheckRefEnabled = 1 
       Exit For 
      End If 
     Next Ref 
     If CheckRefEnabled = 0 Then 
      .VBProject.References.AddFromGUID "{420B2830-E718-11CF-893D-00A0C9054228}", 1, 0 
     End If 
    End With 
End Sub