sebastian-
Goto Top

Mit VB Script bzw. Makro Tabellenreihen kopieren

Hallo liebe Leute!

Ich habe mittlerweile schon gut 4-5 Stunden versucht, dass folgende Problem in Excel zu lösen (auch mittels code Schnippseln aus google usw.), es bis jetzt jedoch leider nicht hinbekommen:

Es geht um 2 Datenblätter:

Blatt1 sieht so aus:

1 | Name1 | Adresse1 | Telefon1
2 | Name2 | Adresse2 | Telefon2
3 | Name3 | Adresse3 | Telefon3
.. | Name.. | Adresse.. | Telefon..
n | Name.. | Adresse..| Telefon..

Blatt2 sieht so aus:

23 |
19 |
1 |
57 |
18 |
9 |
.. |
.. |

Ich möchte nun mittels Makro die Zeilen aus Blatt1 auf Blatt2 kopieren, für die auf Blatt2 Zahlen existieren (die Zahlen auf Blatt2 sind random).

Blatt2 sollte dann so aussehen:

23 | Name23 | Adresse23 | Telefon23
19 | Name19 | Adresse19 | Telefon19
1 | Name1 | Adresse1 | Telefon1
.. |
.. |
usw.

Ich hoffe, jemand kann mir dabei behilflich sein, ich bin nämlich der Verzweiflung nahe face-smile

Schon mal vielen Dank im Voraus!

[Edit Biber] Ist doch ganz banal mit SVerweis() lösbar -- also verschoben von "Visual Basic, VBA und .Net" nach "Excel" [Edit]

Content-Key: 110478

Url: https://administrator.de/contentid/110478

Printed on: April 24, 2024 at 03:04 o'clock

Member: rubberduck
rubberduck Mar 04, 2009 at 08:18:15 (UTC)
Goto Top
Hallo Sebastian

Ist vielleicht eine etwas naive Frage...aber wieso machst Du es nicht einfach mit einem SVERWEIS?

Gruss
Rubberduck
Member: Sebastian-
Sebastian- Mar 04, 2009 at 08:28:35 (UTC)
Goto Top
Hallo Rubberduck,

ganz einfach, weil die Zahlen auf Blatt2 immer random-generiert werden.. und da ist es etwas umständlich, jedes mal einen Zellenverweis einzustellen.
Member: rubberduck
rubberduck Mar 04, 2009 at 08:31:23 (UTC)
Goto Top
Könntest Du das .xls mal raufstellen?
Ich möchte zwar nichts behaupten, aber ich denke, dass es gehen sollte...
Member: Sebastian-
Sebastian- Mar 04, 2009 at 08:41:44 (UTC)
Goto Top
Das kann ich aus Datenschutzgründen leider nicht tun.
Member: rubberduck
rubberduck Mar 04, 2009 at 08:45:17 (UTC)
Goto Top
... face-surprise

Ich hoffe, dass das nur ein witz war...

Kannst ja die besonders schützenswerte Daten rausnehmen.
Und ob dort jetzt "blabla" oder "labla" drinsteht, tut glaub ich nichts zur Sache.
Member: optimax
optimax Mar 04, 2009 at 09:51:49 (UTC)
Goto Top
Die Adressen aus Blatt1 sollten lückenlos ab Zeile x untereinander stehen. Wenn dem so ist einfach mit einer for next Schleife suche ab zeile x nachfolgend nach z.B. >0 dann Zeilenummer merken, adressdaten merken (Merken=in Variablen einlesen). Die Variablen als Public deklarieren.
Dann in Blatt2 nach Vorhandensein der Adressnummer suchen, wenn gefunden die Daten aus den Variablen in die entsprechenden Felder schreiben. Wenn nicht vorhanden next.
Sind die Blätter in verschiedenen Arbeitsmappen oder in der selben Mappe????

So könntest Du die Anzahl der Adressen ermitteln, sucht in Spalte A ab Zeile A4 nach einer Leerzelle:

Columns("A").Find("", After:=[A3]).Select
AdressAnzahl = Selection.Row - 4

So könnte es funktionieren, Annahme es sind 2 Arbeitsmappen und die Daten sind ab Zeile 4/SpalteA..., ggfs. die Mappen-/Blatt Namen anpassen:

Public NameTxt
Public AdresseTxt
Public TelefonTxt
Public AdressNr
Public AdressAnzahl

Sub Adressen_Uebertragen()

Application.Workbooks("Mappe1_Adressen.XLS").Activate
Application.Sheets("Tabelle1").Activate

Columns("A").Find("", After:=[A3]).Select
AdressAnzahl = Selection.Row - 4

For i = 1 To AdressAnzahl
NameTxt = ""
AdresseTxt = ""
TelefonTxt = ""

Application.Workbooks("Mappe1_Adressen.XLS").Activate
Application.Sheets("Tabelle1").Activate

AdressNr = ActiveSheet.Cells(i + 3, 1).Value
NameTxt = ActiveSheet.Cells(i + 3, 2).Value
AdresseTxt = ActiveSheet.Cells(i + 3, 3).Value
TelefonTxt = ActiveSheet.Cells(i + 3, 4).Value

'Blatt2 muss jetzt aktiviert werden....

Application.Workbooks("Mappe2_Adressen_Kopiert.XLS").Activate
Application.Sheets("Tabelle1").Activate
For k = 1 To AdressAnzahl
If ActiveSheet.Cells(k + 3, 1).Value = AdressNr Then
ActiveSheet.Cells(k + 3, 2).Value = NameTxt
ActiveSheet.Cells(k + 3, 3).Value = AdresseTxt
ActiveSheet.Cells(k + 3, 4).Value = TelefonTxt
GoTo Naechste_Adresse
End If
Next 'k
Naechste_Adresse:
Next 'i

End Sub
Das ganze ist natürlich ohne Fehlerprozedur. Die beiden Mappen müssen geöffnet sein.

Gruß OpTiMaX
Member: rubberduck
rubberduck Mar 04, 2009 at 09:58:21 (UTC)
Goto Top
bin immer noch überzeugt, dass es ohne VBA geht.
rein nur mit formeln...
Member: Sebastian-
Sebastian- Mar 04, 2009 at 10:45:54 (UTC)
Goto Top
Hallo OpTiMaX, danke für deinen Ansatz. Die Worksheets sind alle in der selben Arbeitsmappe.

Ich habe schon einen Ansatz hinbekommen:

Sub Zeilen_kopieren()
Dim a As Long, i As Long
Application.ScreenUpdating = False
a = 1
For i = 1 To 29
If Worksheets("CE").Cells(i, "A") = Worksheets("Tabelle1").Cells(i, "A") Then
Worksheets("CE").Rows(i).Copy _
Destination:=Worksheets("Tabelle1").Rows(i)
a = a + 1
End If
Next i
Application.ScreenUpdating = True

End Sub

Allerdings kopiert er mir hier nur die Zeilen, in denen die Nummer von Blatt1 mit der Nummer auf Blatt2 übereinstimmt. Also zum Beispiel:

Auf Blatt1 steht in Zelle A23 die Zahl 22.
Durch den Zufallsgenerator wurde auf Blatt2 in Zelle A23 ebenfalls die Zahl 22 generiert -> Zeile von Zelle A23 wird von Blatt1 korrekt auf Blatt2 kopiert.

Alle anderen Zeilen (z.B. Blatt1 A14 = 13; Blatt2 A14 = 25) werden nicht kopiert.


Es soll einfach so sein, dass er sich von Blatt2 die Zelle A1 nimmt (z.B. Wert 42), dann in Blatt1 springt und die Zeile kopiert, in der A=42 ist.
Das gleiche dann für A2 auf Blatt2 (z.B. Wert 13), dann in Blatt1 springen und Zeile kopieren, in der A=13 ist. usw.
Member: optimax
optimax Mar 04, 2009 at 11:28:17 (UTC)
Goto Top
Dann brauchst Du die Mappe nicht zu wechseln.

Public NameTxt
Public AdresseTxt
Public TelefonTxt
Public AdressNr
Public AdressAnzahl

Sub Adressen_Uebertragen()

Application.Sheets("Blatt1").Activate

Columns("A").Find("", After:=[A3]).Select
AdressAnzahl = Selection.Row - 4

For i = 1 To AdressAnzahl
NameTxt = ""
AdresseTxt = ""
TelefonTxt = ""

Application.Sheets("Blatt1").Activate

' Beschreibung... ActiveSheet.Cells(ZeileNummer,SpalteNummer)
AdressNr = ActiveSheet.Cells(i + 3, 1).Value
NameTxt = ActiveSheet.Cells(i + 3, 2).Value
AdresseTxt = ActiveSheet.Cells(i + 3, 3).Value
TelefonTxt = ActiveSheet.Cells(i + 3, 4).Value

'Blatt2 muss jetzt aktiviert werden....

Application.Sheets("Blatt2").Activate

For k = 1 To AdressAnzahl
If ActiveSheet.Cells(k + 3, 1).Value = AdressNr Then
ActiveSheet.Cells(k + 3, 2).Value = NameTxt
ActiveSheet.Cells(k + 3, 3).Value = AdresseTxt
ActiveSheet.Cells(k + 3, 4).Value = TelefonTxt
GoTo Naechste_Adresse
End If
Next 'k
Naechste_Adresse:
Next 'i

End Sub
Member: Sebastian-
Sebastian- Mar 04, 2009 at 11:47:50 (UTC)
Goto Top
Suuuuuper! Es läuft! Vielen vielen Dank, optimax!
Member: optimax
optimax Mar 04, 2009 at 13:00:40 (UTC)
Goto Top
Zitat von @rubberduck:
bin immer noch überzeugt, dass es ohne VBA geht.
rein nur mit formeln...

in diesem Fall mit Sverweis und dynamische Felddefinition...

@108269

Gern geschehen face-smile