Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 20:05:21
28.04.2024 18:33:31
28.04.2024 18:25:12
28.04.2024 14:18:05
Anzeige
Archiv - Navigation
1916to1920
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Kopieren vba

Kopieren vba
07.02.2023 15:42:55
Tim
Hallo Forum,
ich bin Recht neu in VBA und möchte folgendes über einen Button umsetzen.
Ich möchte im Tabellenblatt 1 Spalte A2 mit Spalte D1 aus Tabellenblatt 2 vergleichen, wenn diese gleich sind soll er die Werte von der Tabellenblatt 1 (Bereich J2 bis U2) nach Tabellenblatt 2 kopieren (unter der Vergleichsspalte Spalte D1 aus Tabellenblatt 2.)
Anschließend soll er die nächste Spalte vergleichen bis zum letzten Eintrag.
Ich hoffe ihr habt verstanden was ich erreichen möchte. Eine Beispiel Datei habe ich leider noch nicht erstellt, dafür müsste ich erst ein paar Fakedaten erstellen,vlt geht es aber ja auch so.

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kopieren vba
07.02.2023 15:53:46
Daniel
Hi
nein, ist noch nicht so ganz verstanden.
könnte auch an deiner Formulierung liegen.
"A2" ist keine Spalte, sondern eine Zelle. "A" ist die Spalte und "2" ist die Zeile.
eine Beispieldatei mit Ausgangslage und gewünschtem Ergebnis wäre für das Verständnis schon sehr hilfreich, vorallem wenn deine Beschreibung noch nicht ganz dem üblichen Standard entspricht.
Gruß Daniel
AW: Kopieren vba
07.02.2023 16:00:15
ChrisL
Hi
Mir geht es gleich wie Daniel (Spalte, Zeile, verwirrend). Lustigerweise hat ChatGPT (Link im Forumstitel) deine Beschreibung verstanden :)
(der AI-generierte Muster-Code mit zwei Schleifen ist nicht ideal/performant, aber wenn die Datenmengen eher klein ist, kein Problem)
excel vba
Ich möchte im Tabellenblatt 1 Spalte A2 mit Spalte D1 aus Tabellenblatt 2 vergleichen, wenn diese gleich sind soll er die Werte von der Tabellenblatt 1 (Bereich J2 bis U2) nach Tabellenblatt 2 kopieren (unter der Vergleichsspalte Spalte D1 aus Tabellenblatt 2.)
Anschließend soll er die nächste Spalte vergleichen bis zum letzten Eintrag.

Untenstehend finden Sie ein Beispiel-VBA-Code, der Ihre Anforderungen erfüllt:
Sub VergleichenUndKopieren()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim lastrow1 As Long, lastrow2 As Long
Dim i As Long, j As Long
Set ws1 = ThisWorkbook.Sheets("Tabellenblatt1")
Set ws2 = ThisWorkbook.Sheets("Tabellenblatt2")
lastrow1 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row
lastrow2 = ws2.Cells(ws2.Rows.Count, "D").End(xlUp).Row
For i = 2 To lastrow1
For j = 2 To lastrow2
If ws1.Cells(i, 1).Value = ws2.Cells(j, 4).Value Then
ws1.Range("J" & i & ":U" & i).Copy
ws2.Cells(j, 4).End(xlToRight).Offset(1, 0).PasteSpecial xlPasteValues
Exit For
End If
Next j
Next i
End Sub
Verwenden Sie diesen Code, indem Sie ein Modul in Ihrem Projekt erstellen und ihn einfügen. Vergessen Sie nicht, das Projekt zu speichern und dann auszuführen.
cu
Chris
Anzeige
AW: Kopieren vba
07.02.2023 18:12:28
Yal
Moin,
was entweder ChatGPT (oder Chris) nicht gut kann, ist das sauberes Einrücken, dass das Verständnis des Codings unterstützt:
Sub VergleichenUndKopieren()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim lastrow1 As Long, lastrow2 As Long
Dim i As Long, j As Long
    Set ws1 = ThisWorkbook.Sheets("Tabellenblatt1")
    Set ws2 = ThisWorkbook.Sheets("Tabellenblatt2")
    lastrow1 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row
    lastrow2 = ws2.Cells(ws2.Rows.Count, "D").End(xlUp).Row
    For i = 2 To lastrow1
        For j = 2 To lastrow2
            If ws1.Cells(i, 1).Value = ws2.Cells(j, 4).Value Then
                ws1.Range("J" & i & ":U" & i).Copy
                ws2.Cells(j, 4).End(xlToRight).Offset(1, 0).PasteSpecial xlPasteValues
                Exit For
            End If
        Next j
    Next i
End Sub
VG
Yal
Anzeige
AW: Kopieren vba
07.02.2023 19:19:17
Tim
Danke für die Rückmeldungen...
Ich habe den Code so übernommen, etwas abgeändert was die Zeilen angeht. Aber sonst ist alles gleich geblieben, leider kommt es zu keinem Kopiervorgang. Habe ich was falsch gemacht?
Hier die Datei: https://www.herber.de/bbs/user/157706.xlsm
AW: Kopieren vba
08.02.2023 08:58:03
ChrisL
Hi Tim
Ich würde es ohne VBA lösen. In Tabellenblatt1!H1 einen Titel einfügen z.B. "Einheit"
Pivot-Tabellenbericht
Quelle markieren und Pivot einfügen.
Menü PivotTable-Analyse, Felder Elemente und Gruppen, berechnetes Feld
SummeJahr = Jan +Feb +Mrz +Apr +Mai +Jun +Jul +Aug +Sep +Okt +Nov +Dez
Spalten = Einheit, Zeilen = Jahr, Werte = SummeJahr
Als Formel
Aus den Quelldaten eine "intelligente Tabelle" machen d.h. Menü Start, Als Tabelle formatieren
Formel für Tabellenblatt2!D2:
{=SUMME(Tabelle1[[Jan]:[Dez]]*(INDIREKT("Tabelle1[Einheit]")=D$1)*(INDIREKT("Tabelle1[Jahr]")=$C2)) }
Geschweifte Klammer mit Ctrl+Shift+Enter erzeugen.
Als Power-Query
- Quelldaten markieren
- Menü Daten, Aus Tabelle/Bereich
- Spalten Einheit + Jahr markieren, rechte Maustaste, entpivotieren
- Spalten Einheit + Jahr markieren, Menü Start, Gruppieren nach (Summe auf Wert)
- Spalten Einheit markieren, Menü Transformieren, Spalte pivotieren
Insgesamt also viele Möglichkeiten, um die Aufgabe ohne VBA zu lösen. Scheint mir sinnvoll auf VBA zu verzichten, wenn die entsprechenden Kenntnisse fehlen.
Aus meiner Sicht handelt es sich um eine klassische Pivot-Aufgabe. Einzig das Eliminieren der Monate stellt eine kleine Hürde dar, was aber wie aufgezeigt über ein berechnetes Feld gelöst werden kann.
cu
Chris
Anzeige
Power Query, eindeutig
08.02.2023 09:47:02
Yal
Hallo zusammen,
ich bin vollkommen bei Chris. Wenn Du, Tim, VBA lernen möchtest, dann bitte nicht mit einer Entpivotierung von Daten, wo andere Mittel wesentlich besser geeignet sind.
Ich würde in dem Fall PQ bevorzügen. Sogar in einer Kombination PQ+Pivot und mit einem Zusatz zu Chriss Anleitung:
_ nach dem Entpivotierung, bei der die "andere Spalten" als Einheit(=Abteilung) und Jahr entpivotiert werden,
_ eine benutzerdefinierte Spalte "Datum" einführen: "1. " & [Attribut] & " " & Text.From([Jahr])
_ diese Rechtsklicken, "Typ ändern", "Datum"
_ Spalten "Jahr" und "Attribut" entfernen
_ Menü "Start", "Schliessen & laden in ...", "Nur Verbindung", "Dem Datenmodell ...hinzufügen"
_ dann neue Pivottabelle auf dem Datenmodell
Wo ist die Mehrwert? Du bekommst die Jahressumme und behälst die Monatsdetails verfügbar ("Daten verdichten heisst Daten vernichten").
Quartalsumme kommen dann automatisch kommt, wenn Datum als Zeilenüberschrift in einem Pivot verwendet werden.
VG
Yal
Anzeige
AW: Power Query, eindeutig
08.02.2023 14:10:11
Tina
Danke für die Rückmeldungen. Ich wollte die Anordnungen deshalb so über VBA lösen da ich die Daten für ein Kombinationsfeld brauche. Und wenn ich eine Pivot Tabelle habe kann ich ja nicht über ein Kombinationsfeld auf einer Userform darauf zu greifen oder doch?
Die Daten auf Tabellenblatt 1 bekomme ich so "angeliefert".
AW: Power Query, eindeutig
08.02.2023 16:11:19
Yal
Hallo Tim/Tina/divers,
ich weiss gar nicht, die Du die gesammelte Werte in einem Combinationsfeld reinbringen möchte.
Vielleicht ist daher eine Version mit Sammler (Dictionary) etwas was hlefen könnte:
Sub SammelnUndAusgeben()
Dim Z As Range
Dim r As Long, c As Long
Dim ws1 As Worksheet
Dim Abt
Dim Jahr
Dim Abt_dic As Object
Dim Jahr_dic As Object
Dim Wert_dic As Object
'Init
    Set Abt_dic = CreateObject("Scripting.Dictionary")
    Set Jahr_dic = CreateObject("Scripting.Dictionary")
    Set Wert_dic = CreateObject("Scripting.Dictionary")
'Sammeln
    With ThisWorkbook.Sheets("Tabellenblatt1")
        For Each Z In Range(.Range("H2"), .Cells(.Rows.Count, "H").End(xlUp))
            Abt = CStr(Z.Value)
            Jahr = CStr(Z.Offset(0, 1).Value)
            Abt_dic(Abt) = Abt_dic(Abt) + 1 'sammeln und aufzählen
            Jahr_dic(Jahr) = Jahr_dic(Jahr) + 1 'sammeln und aufzählen
            For i = 3 To 14
                Wert_dic(Abt & ";" & Jahr) = CLng(Wert_dic(Abt & ";" & Jahr)) + Z.Offset(0, i).Value
            Next
        Next
    End With
'Herausgeben
    With ThisWorkbook.Sheets("Tabellenblatt2")
        .Cells.ClearContents
        c = 4
        For Each Abt In Abt_dic.keys
            .Cells(1, c).Value = Abt
            r = 2
            For Each Jahr In Jahr_dic.keys
                .Cells(r, 3).Value = Jahr
                .Cells(r, c).Value = Wert_dic(Abt & ";" & Jahr)
                r = r + 1
            Next
            c = c + 1
        Next
    End With
    Set Abt_dic = Nothing
    Set Jahr_dic = Nothing
    Set Wert_dic = Nothing
End Sub
VG
Yal
Anzeige
AW: Power Query, eindeutig
08.02.2023 17:10:31
ChrisL
Hi
Schon eher Spielerei.
Wenn du die Pivot wie beschrieben machst, kannst du wie folgt darauf zugreifen. Das Tabellenblatt "Pivot-Tabelle" kann ausgeblendet sein.
Entweder in die bestehende Vorlage "Tabellenblatt2" übernehmen:
Worksheets("Pivot-Tabelle").PivotTables("PivotTable1").PivotCache.Refresh
With Worksheets("Tabellenblatt2").Range("D2:F4")
    .Formula = "=GETPIVOTDATA(""SummeJahr"",'Pivot-Tabelle'!$A$3,""Einheit"",D$1,""Jahr"",$C2)"
    .Value = .Value
End With
Oder einen einzelnen Wert der Pivot auslesen z.B.
MsgBox Evaluate("=GETPIVOTDATA(""SummeJahr"",'Pivot-Tabelle'!$A$3,""Einheit"",""Buchhaltung"",""Jahr"",""2021"")")
cu
Chris
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige