2017-09-26 76 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