Zeilen kopieren per VBA

  • Excel

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von thomas82.

    Zeilen kopieren per VBA

    Hallo liebes Forum,

    ich bastel gerade an einer Kopierfunktion einer Userform.

    Ich habe die Tabelle1 und Tabelle2.

    Eine Zeile aus Tabelle "Neukunden" soll in Tabelle "Kunden" kopiert werden.
    Die Auswahl der Zeile soll über eine Combobox welche einen Namen aus Tabelle "Neukunden" Spalte B anzeigt realisiert werden.
    Die zu kopierende Zeile soll ans Ende der Tabelle 1 angefügt werden. Die Spaltenbezeichnungen in Zeile 1 sind in beiden Tabellen identisch. Der zu kopierende Spaltenbereich geht von B bis W.

    Ich habe 3 Beispiele schon durchgespielt aber ohne Erfolg :(

    Vielleicht habt Ihr ja eine Idee oder seht den Fehler in den Codes.

    'Private Sub cmd_speichern_Click()
    ' Dim rng As Range
    ' Dim iRow As Variant
    ' If cbx_neukunde.Text = "" Then
    ' Beep
    ' 'MsgBox "Sie müssen einen Neukunden auswählen!"
    ' Exit Sub
    ' End If
    ' Set rng = Worksheets("Neukunde").Columns(3) _
    ' .Find(cbx_neukunde.Text, lookat:=xlWhole, LookIn:=xlValues)
    ' If Not rng Is Nothing Then
    ' 'MsgBox "Herzlichen Glückwunsch :) !!"
    ' With Worksheets("Kunden")
    ' iRow = Sheets("Kunden").Cells(Rows.Count, 1).End(xlUp).Row
    ' If iRow = 1 Then iRow = 2 Else iRow = iRow + 3
    ' rng.EntireRow.Copy Worksheets("Kunden").Rows(iRow)
    ' End With
    ' Else
    ' 'MsgBox "Suchbegriff wurde nicht gefunden!"
    ' End If
    '
    ' 'If cbx_anlegen.Value = True Then
    ' ' If cbx_anlegen.Value = False Then MsgBox "bist du sicher"
    '
    '
    ' Unload Me
    '
    '
    'End Sub


    'Private Sub cmd_speichern_Click()
    ' Dim rngC As Range
    ' Dim strAdresse As String
    ' With Worksheets("Neukunde").Columns("C")
    ' Set rngC = .Find("x")
    ' If Not rngC Is Nothing Then
    ' strAdresse = rngC.Address
    ' Do
    ' rngC.EntireRow.Copy Destination:=Worksheets("Kunden").Range("C" & rngC.Row)
    ' Set rngC = .FindNext(rngC)
    ' Loop While Not rngC.Address = strAdresse
    ' End If
    ' End With
    'End Sub




    'Private Sub cmd_speichern_Click()
    ' With Worksheets("Neukunde")
    'Dim Auswahl As String, Zeile As Integer
    'Application.ScreenUpdating = False
    'Application.DisplayAlerts = False
    'Auswahl = cbx_neukunde.Value
    'For Zeile = 15 To 39
    '.Activate
    'If Auswahl = .Cells(Zeile, 2).Value Then 'die aktuelle Konfiguration abspeichern
    '
    '.Range(.Cells(Zeile, 2), .Cells(Zeile, 12)).Select
    'Selection.Copy
    'Sheets("Kunden").Activate
    'Cells(30, 5).Select
    'ActiveSheet.Paste
    '
    'End If
    'Next
    'Application.ScreenUpdating = True
    'Application.DisplayAlerts = True
    'End With
    'End Sub

    Vielen Dank schonmal!!

    thomas82 schrieb:

    Eine Zeile aus Tabelle "Neukunden" soll in Tabelle "Kunden" kopiert werden.
    Die Auswahl der Zeile soll über eine Combobox welche einen Namen aus Tabelle "Neukunden" Spalte B anzeigt realisiert werden.
    Die zu kopierende Zeile soll ans Ende der Tabelle 1 angefügt werden.
    Dein erster Ansatz war doch gar nicht so schlecht.

    Visual Basic-Quellcode

    1. Sub CopyCustomer (ByVal CustomerName as String)
    2. Set c=Sheets("NeuKunden").Range("B:B").Find(CustomerName, LookIn:=xlValues, LookAt:=xlWhole)
    3. If Not c Is Nothing Then c.EntireRow.Copy Sheets("Kunden").Cells(Rows.Count,2).End(xlUp).Offset(1,-1)
    4. End Sub

    Die Routine rufst du auf mit dem Namen, der in der Combobox steht.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    ah ok :)

    Vielen Dank

    Nachtrag:

    leider funktioniert es nicht :-s

    Der Code sieht jetzt so aus:
    Option Explicit

    Private Sub cmb_abbruch_Click()
    Unload Me
    End Sub
    Private Sub cmd_speichern_Click()
    CopyCustomer cbx_neukunde.Text
    End Sub

    Sub CopyCustomer(ByVal Kunden As String)
    Set c = Sheets("Neukunde").Range("B:B").Find(Kunden, LookIn:=xlValues, LookAt:=xlWhole)
    If Not c Is Nothing Then c.EntireRow.Copy Sheets("Kunden").Cells(Rows.Count, 2).End(xlUp).Offset(1, -1)

    Unload Me

    End Sub

    wobei er mir "Sub Copycustomer ...." gelb makiert und "c=" blau makiert.

    Fehlermeldung ist Projekt oder Biblio nicht gefunden.

    Bin ich zu doof für copy and paste ? :-s

    Gruß

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „thomas82“ ()

    Option Explicit bedeutet, dass die Variablen deklariert sein müssen.
    Hilft ungemein bei den Typen und bei Tippfehlern.

    Wo ist c bei dir deklariert?

    Edit:
    Nur sub nutze ich nie. Entweder Private sub oder Public sub kommt bei mir vor. Sollte in diesem Fall Private sein.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Hallo,

    habe den Code jetzt nur so kopiert wie oben von petaod beschreiben.

    C habe ich nicht deklariert. :S

    Nachtrag:

    C ist jetzt als Variant deklariert. Läuft auch ohne Fehler durch, nur leider kopiert er die Zeile nicht :-s

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „thomas82“ ()

    Hallo,

    sorry doof sein ist keine Schande :) aber ich schäme mich zu Grunde :)

    ich hätte einfach den .range bereich einfach richtig setzen müssen :)

    Problem umschifft ;)

    Nur jetzt habe ich Aufgrund der PIVOT heraus gefunden das Excels letzte Zeile 1048576 ist. wo jetzt der Eintrag gelandet ist. Änder ich .....Offset(1, -1) auf .....Offset(1, 0) oder ....Offset(1, 1) dann sagt er Fehler 1004 und das die bereiche nicht passen.

    Gruß
    Die korrekte Definition wäre Range.
    Aber es müsste auch mit Variant oder Object funktionieren (Late Binding).

    Sub ohne weitere Definition ist Public.
    Das nutze ich ganz gerne, wenn die Prozedur auch aus anderen Sheets aufrufbar sein soll.
    Was in diesem Fall ja durchaus praktisch sein könnte.


    Wenn er einfach so durchläuft, musst du vielleicht den Suchbereich anders definieren.
    Der obige Code geht davon aus, dass in der zweiten Spalte gesucht werden soll.
    So variabel wirst du ja wohl sein, dass du das verbiegen kannst.

    Und: Nutze den Debugger!
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    thomas82 schrieb:

    das Excels letzte Zeile 1048576 ist
    Das ist Excel's letzte adressierbare Zeile.
    Der UsedRange ist aber (hoffentlich) kleiner.

    Wo ist denn dein Problem?
    Willst du dort den Pivot hin platzieren?
    Da ist natürlich kein Spielraum mehr nach unten.

    Code?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Also ich wollte eigentlich in eine Pivot schreiben.

    Sub CopyCustomer(ByVal Kunden As String)
    Set c = Sheets("Neukunde").Range("C:C").Find(Kunden, LookIn:=xlValues, LookAt:=xlWhole)
    If Not c Is Nothing Then c.EntireRow.Copy Sheets("Kunden").Cells(Rows.Count, 2).End(xlUp).Offset(1, -1)

    Danke
    Hallo,

    ja mit Pivot kenne ich mich aus.

    Die Tabelle wo die Daten reinkopiert werden soll ist in Pivot formatiert.
    Wenn ich nun den Datensatz über die Userform in die Tabelle kopiere dann findet er die letzte freie Zelle wo keine Pivotformatierung ist.
    Aber die er soll unter die letzte mit Daten gefüllte Zelle kopieren.

    Code hatte ich schon abgeändert über einen Code der in eine Pivot Formatierung schreibt. aber dort gibt er mir eine Fehlermeldung.
    Code:

    Sheets("Kunden").Range("C65536").End(xlUp).Offset(1, 1).Row

    über diesen Code schreibe ich in Pivottabellen
    Warum machst Du den Datenbereich für die PivotTable nicht über Alle Zeile. z.B. Du benötigst die Spalten A bis H in der PivotTable dann setze den Bereich doch einfach auf "$A:$H".
    In diesem Fall musst Du nur noch unter der letzen beschrieben Zelle die Daten einfügen und die PivotTable aktualisieren.

    Was meinst Du mit Pivotformatierung?
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Hallo

    Also ich habe die "normale" Exceltabelle mit Formatvorlage "Tabelle formatieren" formatiert. Habe den Bereich A-X in Benuzung. Mein Gedanke war, die Formatierung zu machen um dann in dem für den Nutzer sichbaren Tabellenblatt die Abfragen an zu zeigen.

    Danke
    Was hälst Du von?

    Visual Basic-Quellcode

    1. ​Dim NeueZeile As Long
    2. Dim Rng As Range
    3. Set Rng = ActiveSheet.Range("Tabelle1")
    4. NeueZeile = Rng.Row + Rng.Rows.Count


    Wobei "Tabelle1" der Name Deines Tabellenbereiches ist.
    In der Zeile mit dem Wert NeueZeile, kannst Du dann Deine Werte eintragen.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).

    INOPIAE schrieb:

    Was hälst Du von?

    Visual Basic-Quellcode

    1. Dim NeueZeile As Long
    2. Dim Rng As Range
    3. Set Rng = ActiveSheet.Range("Tabelle1")
    4. NeueZeile = Rng.Row + Rng.Rows.Count


    Wobei "Tabelle1" der Name Deines Tabellenbereiches ist.
    In der Zeile mit dem Wert NeueZeile, kannst Du dann Deine Werte eintragen.



    Wenn ich deinen Code in meinen baue bekomme ich eine Fehlermeldung: 1004

    Mein dezeitiger Code:

    Option Explicit

    Private Sub cmb_abbruch_Click()
    Unload Me
    End Sub
    Private Sub cmd_speichern_Click()
    CopyCustomer cbx_neukunde.Text
    End Sub

    Sub CopyCustomer(ByVal Kunden As String)
    Dim c As Variant
    Dim NeueZeile As Long
    Dim Rng As Range
    Set Rng = ActiveSheet.Range("Kunden")
    NeueZeile = Rng.Row + Rng.Rows.Count

    Set c = Sheets("Neukunde").Range("C:C").Find(Kunden, LookIn:=xlValues, LookAt:=xlWhole)
    If Not c Is Nothing Then c.EntireRow.Copy NeueZeile
    Unload Me

    End Sub
    Private Sub UserForm_Initialize()
    cbx_neukunde.RowSource = "Neukunde!C2:C2600" & Sheets(1).Cells(Cells.Rows.Count, 1).End(xlUp).Row
    cbx_neukunde.ListIndex = 0
    End Sub

    Er zeigt mir dann Set Rng ..... Gelb an und gibt die Fehlermeldung. Tabellenblatt heißt "Kunden"
    hmm entweder ein ganz kleiner Fehler oder ich fange gleich nochmal neu an ;)
    Hi,

    Du hast den Tabellen- und den Bereichsnamen verwechselt.

    Visual Basic-Quellcode

    1. Set Rng = Sheets("Kunden").Range("Tabelle1")


    Sheets("Kunden") verweist auf das Tabellenblatt.
    Range("Tabelle1") verweist auf den Namensbereich Tabelle . Geh mal in Deine formatierte Tabelle. Dann gehe in das Ribbon Tabellenlools - Entwurf. Dort findest Du in der Gruppe Eigenschaften den Tabellennamen. Diesen musst Du hier einsetzen.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).