2016-07-20 17 views
1

Ich versuche, Werte von einem Blatt in ein anderes zu kopieren, die Schlüsselwerte (Spalten A & C) zu vergleichen und entweder einen Wert (Spalte E) in das Zielblatt einzufügen oder eine Zeile einzufügen und alle drei Werte in A einzufügen. C, F.Nicht zusammenhängende Spalten in ein multidimensionales Array kopieren?

Hier ist ein Beispiel der Daten:

SOURCE TABLE 
A  B  C  D  E 
Name Ext  Dept Days w22Hrs 
------- ------- ------- ------- ------- 
Alan x101 Level1 MTWTF 8 
Brian x102 Level1 MTWTF 30 
Claire x103 Level1 MTWTF 40 
Denise x104 Level2 MTWTF 16 
Denise x105 Level1 MTWTF 24 

TARGET TABLE 
A  B  C  D  E  F 
Name Ext  Dept Days w21Hrs w22Hrs 
------- ------- ------- ------- ------- ------- 
Brian x102 Level1 MTWTF 32  
Denise x104 Level2 MTWTF 16  
Denise x105 Level1 MTWTF 8  
Eric x106 Level1 MTWTF 36  

DESIRED RESULT 
A  B  C  D  E  F 
Name Ext  Dept Days w21Hrs w22Hrs 
------- ------- ------- ------- ------- ------- 
Alan   Level1   0  8 
Brian x102 Level1 MTWTF 32  30 
Claire   Level1   0  40 
Denise x104 Level2 MTWTF 16  16 
Denise x105 Level1 MTWTF 8  24 
Eric x106 Level1 MTWTF 36  0 

ich habe versucht, die Quelldaten in ein Array mit diesem Code zu kopieren:

set rng = union(range("A2:A6"), range("C2:C6"), range("E2:E6")) 
arrTemp = rng.value2 
arr = application.transpose(arrTemp) 

Aber alles, was ich bekommen ist sind Werte, von A2: A6. Wie auch immer das funktioniert:

1 - Gibt es keine einfache Möglichkeit, nur die gewünschten Spalten in das Array zu setzen? (Iteration durch Zellbereiche scheint mir unelegant.)

2 - Gibt es eine einfachere Möglichkeit, das Gesamtziel der Aktualisierung des Zielblattes zu erreichen? (Denken Sie daran, ich möchte w ## Hrs für bestehende Zeilen aktualisieren und neue Zeilen bei Bedarf hinzufügen.) Oder sind Arrays am besten geeignet? (Wäre eine Sammlung besser?)

Wenn es die Dinge einfacher macht, kann ich A: D in das Ziel einfügen, aber source.E muss noch in target.F gehen.

Danke!

+1

Nehmen Sie den gesamten Eingabebereich in ein Array auf und ignorieren Sie einfach die Teile, die Sie nicht benötigen. –

+0

Das scheint einfacher zu sein mit PivotTable/PowerPivot oder Power Query – Slai

Antwort

0

Eine Sammlung würde funktionieren, aber ich bevorzuge ein Skriptwörterbuch. Skriptwörterbücher verfügen über eine Exists-Methode, mit der Sie feststellen können, ob bereits ein Schlüssel vorhanden ist, Sammlungen nicht. Wenn Sie Schlüssel zu einer Sammlung hinzufügen, müssen Sie alle Fehler umgehen, die durch das Hinzufügen eines doppelten Schlüssels verursacht werden.

Sub UpdateTargetTable() 
    Dim k As String 
    Dim lastRow As Long, x As Long 
    Dim dict As Object 
    Dim arr 

    Set dict = CreateObject("Scripting.Dictionary") 

    With Worksheets("Source") 
     lastRow = .Range("A" & Rows.Count).End(xlUp).Row 

     For x = 2 To lastRow 
      k = .Cells(x, 1) & .Cells(x, 2) 

      If Not dict.Exists(k) Then 
       dict.Add k, .Range(.Cells(x, 3), .Cells(x, 5)).Value 
      End If 

     Next 

    End With 

    With Worksheets("Target") 
     lastRow = .Range("A" & Rows.Count).End(xlUp).Row 

     For x = 2 To lastRow 
      k = .Cells(x, 1) & .Cells(x, 2) 

      If dict.Exists(k) Then 
       arr = dict(k) 

       .Cells(x, 3) = arr(1, 1) 
       .Cells(x, 4) = arr(1, 2) 
       .Cells(x, 6) = arr(1, 3) 

      End If 

     Next 

    End With 

End Sub 
+0

Ich dachte nicht, dass ein Wörterbuch für dieses Problem gut funktionieren würde, weil ich nicht nach Schlüssel sortieren kann, aber ich fand ein Skript, das das macht, ein Wörterbuch das perfekte Maß. Ich habe ein paar Verbesserungen vorgenommen, die ich später veröffentlichen möchte, wenn es die Zeit erlaubt. – MJA

+1

Sie könnten eine SortedList anstelle eines Wörterbuchs verwenden. Wie ein Dictionary speichert SortedList Daten in Schlüsselwertpaaren. Die SortedList sortiert die Schlüssel beim Hinzufügen automatisch. Dieser Artikel [SortedList] (http://www.robvanderwoude.com/vbstech_data_sortedlist.php) zeigt, wie man sie benutzt. –