2017-08-08 2 views
0

Ich beginne immer noch auf VBA und wollte fragen, wie Sie Daten von Zellen, die nicht in einem bestimmten Array leer sind, in ein anderes Array kopieren. Also habe ich diese Tabelle, die ich "Candidates" nannte (sie beginnt nicht in Zeile 1) und ich möchte nur die Zellen kopieren, die Daten enthalten und sie in ein anderes Arbeitsblatt kopieren. Hier ist, was ich bis jetzt bekam:Kopieren von Spalten aus einem Array in ein anderes Arbeitsblatt

Dim arrCandidatures() As Variant 
arrCandidatures = Range("Candidatures").Value 

Dim iCol As Long 
Dim iRow As Long 

    iMaxRow = 250 

For iCol = 1 To 6 'these are the columns i want to copy from "Candidatures" 
    For iRow = 1 To iMaxRow 
     With Worksheets(CopierColler).Array(arrCandidatures).Columns(iCol) 
      If .Value = "" Then 
      Else: .Copy Destination:=Worksheets("RawData").Cells(D2, I10) 
      End If 
     End With 

    Next iRow 
Next iCol 

Irgendwelche Vorschläge?

Jonathan

+0

wo schlägt das fehl? Welcher Fehler wird angezeigt? – Luuklag

+0

Fehler in dieser Codezeile Mit Worksheets (CopierColler) .Array (arrCandidatures) .Columns (iCol) Ich kann nicht die Tabelle auswählen, in der die Spalten 1 bis 6 ausgewählt werden sollen – Jonathan

+0

Ist es eine Excel-Tabelle oder einfach? eine Gruppe von Zellen? – Luuklag

Antwort

0

Ihre Logik scheint ein wenig fehlerhaft, weil Sie sagen, dass Sie nur Zellen kopieren wollen, die nicht leer sind. Normalerweise würde man Zeilen kopieren, die nicht leer sind, aber leere Zellen innerhalb der ausgewählten Zeilen enthalten. Daher schlage ich diesen Ansatz vor: Zuerst kopieren Sie alles und entfernen dann die Zeilen, die Sie nicht behalten möchten. Der folgende Code würde alles kopieren.

Private Sub CopyPasteRange() 

    Dim Rng As Range 
    Dim Arr As Variant 

    With Range("Candidatures") 
     Set Rng = .Range(.Cells(0, 1), .Cells(.Rows.Count - 1, 6)) 
    End With 

    Debug.Print Rng.Address, Rng.Rows.Count, Rng.Columns.Count 
    Arr = Rng.Value 
    Debug.Print Lbound(Arr,1), Lbound(Arr, 2), Ubound(Arr,1), Ubound(Arr,2) 
    Debug.Print Worksheets("RawData").Cells(2, 1).Resize(UBound(Arr, 1), UBound(Arr, 2)).Address 
    Worksheets("RawData").Cells(2, 1).Resize(UBound(Arr, 1), UBound(Arr, 2)).Value = Arr 
End Sub 

Beachten Sie, dass die Zielzelle (2,1) A2 ist, was bedeutet, Zeile 2, Spalte 1. Dies ist die obere linke Zelle des gesamten Bereichs kopiert werden und Sie können es für Ihre Anforderungen ändern.

Wenn Sie die neuen Zeilen in "RawData" durchlaufen, denken Sie daran, dies von unten nach oben zu tun, damit Sie die Zeile löschen können, die nicht Ihren Anforderungen entspricht.

Hinweis: Ich bin eher überrascht über den Code .Range(.Cells(0, 1), .Cells(.Rows.Count - 1, 6)). Cells(0, 1), die normalerweise einen Fehler auslösen würde. Dies ist in diesem Fall nicht der Fall, da es sich auf einen benannten Bereich bezieht. Ich habe getestet und es funktioniert richtig. Sie sagen jedoch, Sie haben einen Tisch. Ich bin nicht mit Tabellen vertraut, weil ich Excel gelernt habe, bevor sie eingeführt wurden. Wie auch immer, wenn diese Codezeile ein Problem verursacht, dann liegt das daran, dass es in Excel keine Zeile 0 gibt. Die "normale" Art, diese Codezeile zu konstruieren, wäre .Range(.Cells(1, 1), .Cells(.Rows.Count, 6)), aber als ich versuchte, gab es mir den falschen Bereich. Mit der Null werden die korrekten Daten aus einem benannten Bereich aufgenommen.

+0

Ich sehe was du meinst, was ich meinen Code tun soll kopiere die gefüllten Zellen, bis sie eine leere findet, denn in meinem speziellen Fall zeigt eine leere Zelle das Ende der Daten an (ich habe jedoch meine "Kandidatur" -Tabelle größer definiert und enthält daher eine Menge leerer Zeilen unter den gefüllten müsste gelöscht werden). Ich habe das versucht, aber ich bekomme eine Fehlermeldung '9' Nachricht und die letzte Zeile des Codes ist das Problem offenbar. – Jonathan

+0

Warum brauchen Sie "Kandidaten", um ein Tisch zu sein? Sobald Sie VBA verwenden, ist das Arbeitsblatt die dominierende Einheit. Jede Adresse in einer Tabelle muss in ihr Äquivalent auf dem Blatt konvertiert werden. Folglich könnten Ihre Probleme viel kleiner sein, wenn Sie das Blatt einfach als Tabelle verwenden könnten. – Variatus

+0

In der letzten Zeile müssen die Quell- und Zielbereiche in der Größe identisch sein. 'Rng' ist die Quelle und die Größe der Zelle in" RawData "ist das Ziel. Ich habe Code zu der obigen Lösung hinzugefügt, um diese zwei Bereiche zu untersuchen. Sie können überprüfen, ob 'Rng' den richtigen Bereich auswählt, von dem die Daten kopiert werden sollen und wie die Größe der beiden Bereiche ist. Die Ausgabe von 'Debug.Print' erfolgt im Direktfenster des VB-Editors. – Variatus

Verwandte Themen