Excel VBA Zeilen kopieren

thomasooo

Cadet 3rd Year
Registriert
März 2010
Beiträge
39
Hallo liebe Community,

ich verzweifel fast schon hier. Ich und meine 3 Kollegen bringen es einfach nicht hin, eine Zeile aus Excel zu kopieren und dann in ein anderes Tabellenblatt einzufügen. Ich habe schon gegooglet aber gar nichts gefunden, das mir weiterhilft. Alle Lösungen sind zu spezifisch.

Danke schon im Voraus!
 
Hallo,

falls Du Werte (Ergebnisse) kopieren möchtest, die durch eine Formel oder ähnliches erechnet worden sind, musst Du wie folgt vorgehen.

- Zellen mit Inhalt markieren und kopieren
- Ziel Zelle anwählen und über Bearbeiten -> Inhalte einfügen -> "Wert" markieren -> OK

Dann wird nur der Wert der Quellzelle eingefügt ohne Formel etc..
Hoffe das ist das was Du suchst, ansonsten bitte nochmal genauer Dein Problem beschreiben.
 
Danke, das habe ich allerdings nicht gemeint. Ich will das ganze mit VBA machen. Sonst krieg ich sehr viel hin mit Excel. ;-) Trotzdem Danke.
 
Klick einfach auf Makro aufzeichnen, mache per Hand einmal was du tun willst und dann kannst du evtl. den entstandenen Code deinen Vorstellungen entsprechend anpassen...
 
So:
Worksheets("Tabelle1").Rows(1).Copy Destination:=Worksheets("Tabelle2").Rows(5)​
oder so:
Worksheets("Tabelle1").Range("A1").EntireRow.Copy Destination:=Worksheets("Tabelle2").Range("A1")​
 
Danke Viel Mal! Das hat geholfen... ;-)

Wie würde das gehen, wenn ich die ganze Zeile bis auf eine Zelle in der Zeile (Bsp: Zeile 1 ohne Zelle B1) kopieren möchte? Kann mir da einer helfen?
 
Zuletzt bearbeitet: (kein Doppelpost)
Steht in Tabelle2.B1 ein Wert, der nicht überschrieben werden darf? Sonst könnte man wie gehabt die ganze Zeile kopieren und dann Tabelle2.B1 wieder löschen.
 
Mit STRG ausmustern
 
Nein steht nichts drin. Ja, Löschen wäre eine Möglichkeit.
 
Dann kopieren wie oben und danach
Worksheets("Tabelle2").Range("B1").Value = ""​
oder etwas komfortabler :D
Code:
Sub kopieren()

Dim sSpalte As String
Dim sZeile As Integer
Dim last_col as String
Dim last_row as Integer
Dim iSpaltenanzahl As Integer
Dim iZeilenanzahl As Integer
Dim wks1 As Worksheet
Dim wks2 As Worksheet
Dim iNCopy As Integer
Dim sTab1 As String
Dim sTab2 As String

sTab1 = InputBox("Wie heißt die Quelltabelle?", "Quelle")
sTab2 = InputBox("Wie heißt die Zieltabelle?", "Ziel")

Set wks1 = Worksheets(sTab1)
Set wks2 = Worksheets(sTab2)

iSpaltenanzahl = wks1.UsedRange.Columns.Count
iZeilenanzahl = wks1.UsedRange.Rows.Count
last_col = Replace(Cells(1, iSpaltenanzahl).Address(0, 0), "1", "")
last_row = iZeilenanzahl

sZeile = InputBox("Welche Zeile soll kopiert werden? (1-" & last_row & ")", "Zeile kopieren")
sSpalte = InputBox("Welche Spalte soll nicht kopiert werden? (A-" & last_col & ")", "Spalte kopieren")

iNCopy = Range(sSpalte & ":" & sSpalte).Column


For i = 1 To iSpaltenanzahl
    If i <> iNCopy Then
        wks1.Cells(sZeile, i).copy Destination:=wks2.Cells(sZeile, i)
    End If
Next i

End Sub
 
Zuletzt bearbeitet:
Wow, cool mit dem hätte ich nicht gerechnet. In VBS bekomm ich eigentlich sehr vieles hin, in VBA ist das ganz anders. ;-)

Ich werde sicherlich noch weitere Fragen haben, ich poste es dann einfach.

Danke nochmals :p
 
*ausbuddel*

es passt einfach sooo gut, man findet im netz kaum halbwegs lesbaren text der auch gut dokumentiert ist für anfänger.
bei dem beispiel oben bekomm ich immer
"Laufzeitfehler '9'
Index außerhalb des gültigen Bereiches"

hängt das mit den msg-boxen als input zusammen? ich durchsteig die kein bisschen. :(
will ein paar zeilen aus ner geschloßenen tabelle importieren um dann lokal damit weiterarbeiten zu können...
 
Hast du schon versucht deine Funktion zu debuggen? (Geht mit F8 im Visual Basic Editor)
Nebenbei kann die oben beschriebene Funktion nur Zeilen/Spalten zwischen zwei Registern innerhalb derselben Datei hin- und herzukopieren.
 
du siehst den code ja auch oben, ich finde den fehler leider partou nicht. :(
falls jemand lust und ahnung hat kann er sich dem ja gerne annehmen und den quelltext vielleicht sogar kommentieren zum verständniss. darum geht es ja und nicht nur copy-paste-lösungen.

ich will den quelltext so abändern, dass mir 4 spalten (sagen wir mal B-D und G, dann hängen 3 zusammen und eine einzelne, so kann man verschiedene methoden reinschreiben) kopieren und in mein lokales blatt einfügen. von da aus ist es dann ja viel leichter auf ner unsichtbaren seite mit den üblichen excel-kommandos lokal mit den inhalten zu jonglieren und selbige zu verarbeiten. :)
ich pick mir dann aus den zeilen schon raus was ich brauche, aber selbige sollen importiert werden. der pfad ist bekannt und immer nach einem datum korrospondierend zum datum. vielleicht könnte man das auch gleich aus ner lokalen zelle auslesen lassen, dann lass ich mir die zelle berechnen und kann so alles schön fortlaufend machen.

also: habe: ein leeres blatt, ne zelle a1 wo ein netzwerkpfad drinnen steht und nen eigenen button.
will: spalten b,c,d und g aus dem dokument unter dem pfad kopieren und lokal einfügen lassen um ohne visual basic advanced damit arbeiten zu können.

vielen dank. wenn das grundskript zum import endlich mal vernünftig laufen würde könnte man immernoch optimieren, aber pro spalte geht es bei mir um 40 zeilen wo maximal die hälfte beschrieben ist nach nem groben muster.
 
Hier mal eine kleine Funktion samt Erklärungen die ich zusammengebastelt habe:

Code:
    Dim wb As Workbook
    Dim wbSource As Workbook
    Dim wsSource As Worksheet
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim sPath As String
    Dim sRange As String
    
    ' Die aktuelle Datei und Arbeitsblatt auswählen
    Set wb = ActiveWorkbook
    Set ws1 = ActiveSheet
    Set ws2 = wb.Sheets(2)
    
    ' Wenn die Zelle A1 leer ist einen Fehler ausgeben
    sPath = Trim(ws1.Cells(1, 1).Value)
    If sPath = "" Then
        MsgBox "Kein Pfad in Zelle A1 vorhanden!", vbOKOnly, "Fehler"
        Exit Sub
    End If
    
    ' Die Datei mit dem Pfad aus Zelle A1 öffnen und das erste Arbeitsblatt auswählen
    Set wbSource = Workbooks.Open(sPath)
    Set wsSource = wbSource.Sheets(1)
    
    ' Den Bereich den du kopieren willst auswählen und kopieren
    ' "B1:D20,G1:G20" funktioniert leider nicht =/
    sRange = "B1:D20"
    Call wsSource.Range(sRange).Copy
    
    ' Das zweite Arbeitsblatt in deiner Datei aktivieren und dort den Inhalt einfügen
    Call ws2.Activate
    Call ws2.Range(sRange).Select
    Call ws2.Paste
    
    ' Die Ursprungsdatei wieder schließen
    Call wbSource.Close(False)
Voneinander getrennte Spalten (B-D und G) zu kopieren funktioniert so leider nicht, habe so schnell leider auch nicht herausgefunden warum.
Den Bereich usw. musst du natürlich noch anpassen, aber es soll ja auch keine copy&paste Lösung sein ;)
 
superklasse.
na klar pass ich mir die sachen noch an und merz ihm paar sachen raus.
so details wie die richtige seite in einer datei auswählen bekomm ich auch selbst hin, aber erstmal aus dem nix eine funktionierende import-funktion zu schnitzen war ein ding der unmöglichkeit in der kurzen zeit und da hast du sehr gut geholfen.
kann mir gut vorstellen, dass sich hier noch ein paar mehr bedienen werden. ;) vielen dank.


kann mir vielleicht noch wer auf den weg geben wie man die zweite datei ohne nachfrage schließt?
er jammert jetzt ja rum, weil ein bereich daraus im arbeitsspeicher liegt (könnte man ändern indem ich aus der anderen datei ne leere zelle symbolisch kopiere vor dem schließversuch) und dass er die andere datei ja speichern will, weil darin rumgeklickt wurde.
Code:
Application.DisplayAlerts = False
    Call wbSource.Close
    SaveChanges = False
ist nicht so der bringer...
 
Zuletzt bearbeitet:
Mein Code müsste die zweite Datei eigentlich schon schließen ohne nachzufragen, dazu ist ja die Zeile "Call wbSource.Close(False)" da, deswegen schließ ich die zweite Datei ja auch ganz am Ende damit diese Frage nicht stört.
Speichern dürfte er die zweite Datei allerdings nicht, du hast ja schließlich nichts geändert sondern nur ausgelesen.

Notfalls kannst du auch die Zwischenablage zwischenspeichern, leeren, die zweite Datei schließen und dann die Zwischenablage wieder füllen. Das ist aber schon etwas umständlich nicht nicht wirklich schön ;)

Edit:
Welche Version von Office benutzt du? Ich habe das nur mit Office 2010 probiert, dort hat es mit meinem Code funktioniert.
 
office2010
hab weiter drann rumgespielt und .close(true) beendet es ohne nachfragen. :D
zumindest bekomm ich jetzt keine mehr. hauptsache es läuft halt.

gegenwärtiger code:
Code:
Private Sub CommandButton1_Click()
    Dim wb As Workbook
    Dim wbSource As Workbook
    Dim wsSource As Worksheet
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim sPath As String
    Dim sRange As String
    
     Set wb = ActiveWorkbook
    Set ws1 = ActiveSheet
    Set ws2 = wb.Sheets(2)
    
 
    sPath = Trim(ws1.Cells(1, 1).Value)
    If sPath = "" Then
        MsgBox "Kein Pfad in Zelle A1 vorhanden!", vbOKOnly, "Fehler"
        Exit Sub
    End If
    
      Set wbSource = Workbooks.Open(sPath)
    Set wsSource = wbSource.Sheets(2)
    
      sRange = "A2:L46"
    Call ws1.Activate
    Call wsSource.Range(sRange).Copy
    ' Das zweite Arbeitsblatt in deiner Datei aktivieren und dort den Inhalt einfügen
    Call ws2.Activate
    sRange = "A13:L57"
    Call ws2.Range(sRange).Select
    Call ws2.Paste
    sRange = "B1:C1"
    Call ws2.Range(sRange).Copy
      ' hier wird eine sinnlose operation vorgenommen, damit der cursor nicht mehr in der zu schließenden datei steht
      ' und ja, ich definiere einfach immer sRange neu statt es anders zu setzen, never touch a running system. xD
  
  Call wbSource.Close(True)
End Sub
den pfad in zelle a1 lass ich mir schon dynamisch berechnen aus nem datum und so kann ich sie durchs ausblenden ausreichend verstecken. versierten anwendern kann man ja kurz sagen wie die generierung aus nem datum erfolgt
="C:\Users\PFAD\test\"&TEXT(B2;"JJJJ")&"-"&TEXT(B2;"MM")&" "&TEXT(B2;"MMMM")&"\"&TEXT(B2;"JJJJ")&"-"&TEXT(B2;"MM")&"-"&TEXT(B2;"TT")&"xxDATENBANK.xlsm"
und alle anderen hacken bloss das datum in b2 und freuen sich.


leider enthält meine quelle noch verknüpfte zellen und will bei jeder abfrage wissen ob er die generieren soll.
ist bekannt wie man die abfrage unterbindet? kurzes googeln brachte mir noch keine idee... ansonsten muss noch einmal "nein" gedrückt werden oder "ja -nein".
ich hoffe beim portieren ins laufende system gibts dann keine probleme, außer dass der pfad in a1 von local auf netzwerk umgestellt wird... *bibber*


Application.AskToUpdateLinks = False
funktioniert gut, aber danach gibt er mir noch den fehler aus, dass die arbeitsmappe mindestens eine verknüpfung enthält die nicht aktualisiert werden kann. ist mir aber völlig wurst und ich würd gern noch das abfragefenster ("weiter" & "verknüpfung bearbeiten") wegzaubern, dann macht er alles gewünschte ohne einen pieps, so wie es sein soll. :)

Application.DisplayAlerts = False
so, wowowo, es läuft. :)
 
Zuletzt bearbeitet:
Zurück
Oben