Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1876to1880
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

Pls Help

Pls Help
12.04.2022 18:59:23
Nerzi
Moin zusammen,
ich habe einen größeren Datensatz (ca. 800 Zeilen), in dem 2 wichtige Infos stehen. 1te wichtige Info ist ein Name (steht in A2, bzw. in jeder A-Spalte ein anderer), in Spalte E eine Nummer, die es auch so als Tabellenblatt gibt. Ich möchte jetzt gerne das die Zelle A2 kopiert wird und aus der Zelle E2 der entstrechende Tabellenblattname des Zielblatts ausgelesen wird. Anschließend soll der Wert in die nächste freie Zelle ab J5 des entsprechenden Tabellenblatts eingefügt werden. Das Ganze soll dann jetzt natürlich für alle Zeilen aus dem Datensatz so passieren.
Wahrscheinlich müsste ich da mit "Dim." usw. arbeiten, aber bis das bei mir richtig funzt dauert es noch ein wenig :D

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Pls Help
12.04.2022 19:34:05
ReginaR
Hi,
lade doch mal eine Beispieldatei hoch, dann kann man (ich) Dir sicher einen Ansatz liefern.
Gruß Regina
AW: Pls Help
12.04.2022 21:06:54
ReginaR
...ok, Rückfrage:
Wo sollen die Namen "landen"?
In Blatt "123" wohl in "I"
In Blatt "456" wohl in "J"
in Blatt "789" wohl in "H"
Gruß Regina
AW: Pls Help
12.04.2022 21:08:06
Nerzi
Sorry, da hab ich wohl nicht ganz aufgepasst. Die Namen sollen alle jeweils in "J".
AW: Pls Help
12.04.2022 21:09:45
ReginaR
...ok, dann teste mal diesen Code:

Sub kopieren()
Dim lng_zeile As Long
Dim obj_wks_quelle As Worksheet
Dim lng_letzte_zeile_ziel As Long
Dim str_blattname As String
Set obj_wks_quelle = ThisWorkbook.Worksheets("Datensatz") ' ggf. anpassen
lng_zeile = 2
With obj_wks_quelle
Do Until .Cells(lng_zeile, 1) = ""
str_blattname = .Cells(lng_zeile, 10)
lng_letzte_zeile_ziel = ThisWorkbook.Worksheets(str_blattname).Cells(Rows.Count, 10).End(xlUp).Row + 1
.Cells(lng_zeile, 1).Copy _
ThisWorkbook.Worksheets(str_blattname).Cells(lng_letzte_zeile_ziel, 10)
lng_zeile = lng_zeile + 1
Loop
End With
End Sub

Anzeige
AW: Pls Help
12.04.2022 21:36:32
Nerzi
Sorry, für das Doppelposting. In meiner Beispieldatei funktioniert es wunderbar, leider aber nicht in der Datei in der es laufen soll. Dort soll ich hier debuggen :
lng_letzte_zeile_ziel = ThisWorkbook.Worksheets(str_blattname).Cells(Rows.Count, 10).End(xlUp).Row + 1
Habe jetzt nichts weiter gemacht außer die 10 auf eine 5 geändert da die Daten aus Spalte "E" kommen. Die Originaldatei kann ich leider nicht hochladen (zu viele Namen etc.). Kannst du vielleicht ein paar Kommentare dazu schreiben ? Dann kann ich es vielleicht sogar selbst beheben und lerne noch was :)
LG
AW: Pls Help
12.04.2022 21:50:05
ReginaR
Hi, hier mit Kommentaren:

Sub kopieren()
Dim lng_zeile As Long
Dim obj_wks_quelle As Worksheet
Dim lng_letzte_zeile_ziel As Long
Dim str_blattname As String
Set obj_wks_quelle = ThisWorkbook.Worksheets("Datensatz") ' in welchem Blatt stehen die Quelldaten
lng_zeile = 2
With obj_wks_quelle
Do Until .Cells(lng_zeile, 1) = ""
str_blattname = .Cells(lng_zeile, 10) ' aus den Quelldaten aus Spalte 10 wird der Blattname gezogen, in das die daten kopiert werden sollen
lng_letzte_zeile_ziel = ThisWorkbook.Worksheets(str_blattname).Cells(Rows.Count, 10).End(xlUp).Row + 1 ' auf dem Zielblatt wird in Spalte 10 die erste leere Zeile ermittelt
.Cells(lng_zeile, 1).Copy _
ThisWorkbook.Worksheets(str_blattname).Cells(lng_letzte_zeile_ziel, 10)  ' Der Name wird aus dem Quellblatt in die erste leere Zelle der Spalte 10 auf dem Zielblatt kopiert
lng_zeile = lng_zeile + 1
Loop
End With
End Sub
Welcher Fehler kommt denn? Sind alle Zielblätter auch schon vorhanden?
Gruß und bis morgen
Regina
Anzeige
AW: Pls Help
12.04.2022 22:04:33
Nerzi
Ich bekomme teilweise "Index außerhalb des gültigen Bereichs". Erschließt sich mir leider nicht ganz. Auf einem der Blätter (habe es erstmal mit 2 Tabellenblättern versucht) ist noch probeweise eine Tabelle eingefügt (über Raster), dass sollte ja aber eigentlich nichts zur Sache tun, trotzdem fängt zählt ab da erst die erste Spalte unterhalb der Linien. Die Zellen sind aber alle leer und auch nicht formatiert.
LG
AW: Pls Help
13.04.2022 09:09:22
ReginaR
Hi, das kann ich Dir per "Ferndiagnose" auch nicht beantworten ...
Da musst Du sonst Deine Originalmappe anonymisieren und einmal hochladen.
"Index außerhalb ..." könnte bedeuten, dass ein Tabellenblatt nicht gefunden wird. Teste mal, ob da nicht evtl. in der Zelle oder bei der Benennung des Blattes ein Leerzeichen hinter dem eigentlichen Namen steht.
Gruß Regina
Anzeige
AW: Pls Help
12.04.2022 22:07:02
Luschi
Hallo Regina,
diese Zeile:
lng_letzte_zeile_ziel = ThisWorkbook.Worksheets(str_blattname).Cells(Rows.Count, 10).End(xlUp).Row + 1
kann nur funktionieren, wenn das aktive Blatt dem entspricht, was in str_blattname steht.
Da das aber sehr nicht stimmen muß, deshalb so:

With ThisWorkbook.Worksheets(str_blattname)
' "J" statt 10 erspart das Fingerzählen
' oder hättest Du gewußt, daß die Spalten-Nr. 59 der -bezeichnung 'BG'
' entspricht
lng_letzte_zeile_ziel = .Cells(.Rows.Count, "J").End(xlUp).Row + 1
End With
Achtung: hier spielen die Punkte vor Cells und Rows die entscheidende Rolle.
Gru0 von Luschi
aus klein-Paris
Anzeige
AW: Pls Help
13.04.2022 09:06:39
ReginaR
Hi Luschi,
ob "J" oder "10" ist, meiner Meinung nach, eine Frage des persönlichen Programmierstils. Ich finde eine Mischung von Zahl und Text immer unschön. Für die Entwicklung in Excel einmal auf Z1S1-Bezugsart umzuschalten erspart dann auch das Zählen :-)
Was ich nicht verstehe:
Warun bezieht sich

lng_letzte_zeile_ziel = ThisWorkbook.Worksheets(str_blattname).Cells(Rows.Count, 10).End(xlUp).Row + 1 
auf das aktuelle Tabellenblatt? In str_blattname steht der Name des Zielblattes und auf dem wird die erste leere Zelle in der Spalte 10 ermittelt. Einzig Rows.Count bezieht sich auf das aktuelle Blatt, da aber alle Blätter die gleiche Zeilenzahl haben, ist das meines Erachtens zu vernachlässigen.
Ich habe den Code mehrfach laufenlassen, immer mit verschiedenen Blättern im Vordergrund und konnte keinen Unterschied im Verhalten entdecken.
Gruß Regina
Anzeige
AW: Pls Help
13.04.2022 09:16:54
Oberschlumpf
Hi Regina,
da wir aber das Original nicht kennen, wissen wir auch nicht, ob wirklich auch im Original - in jedem - Tabellenblatt - immer - die gleiche Anzahl Zeilen enthalten ist.
Und so kommt es dann bei Verwendung von...

.Cells(Rows.Count, 10).End(xlUp).Row + 1 
...zu einem anderen Wert = letzte, benutzte Zeile in Spalte 10, wenn vor Rows der . fehlt
btw: ich mag in dem Codeschnipsel auch lieber die Spaltenzahl als den Buchstaben :-) Aber es stimmt schon: Buchstaben ersparen das Fingerzählen
Ciao
Thorsten
AW: Pls Help
13.04.2022 10:43:27
ReginaR
.... jetzt stehe ich auf dem Schlauch:
Wenn ich eine xlsx-Datei habe, dann haben doch alle Tabellenblätter 1048576 Zeilen, oder ? Ich programmiere diese Code-Zeile seit Jahren so und bi noch nie damit "auf den Bauch gefallen"... Hmm...
Gruß Regina
Anzeige
AW: Pls Help
13.04.2022 11:02:21
Rudi
Hallo,

Wenn ich eine xlsx-Datei habe, dann haben doch alle Tabellenblätter 1048576 Zeilen
korrekt. Innerhalb einer Mappe haben alle Worksheets die gleiche Zeilenanzahl.
Es gibt immer wieder Puristen, die sich anscheinend auf diesen Sonderfall beziehen:
Du öffnest aus einer .xlsm eine .xls, hast die xlsm aktiv und willst in der xls die letzte Zeile ermitteln. Dann geht das ohne ausführliche Referenzierung schief.
Gruß
Rudi
AW: Pls Help
13.04.2022 12:46:22
Oberschlumpf
Ok, Regina,
ich hatte in meinem Erklär-Versuch leider auch etwas nicht ganz genau beschrieben.
Ich schrieb:
"...ob wirklich auch im Original - in jedem - Tabellenblatt - immer - die gleiche Anzahl Zeilen enthalten ist.
ich hätte schreiben müssen:
"...ob wirklich auch im Original - in jedem - Tabellenblatt - immer - die gleiche Anzahl benutzter Zeilen enthalten ist.
Denn der Befehl...
Cells(Rows.Count, 10).End(xlUp).Row
...ermittelt in der aktiven Tabelle die letzte, benutzte Zeile in Spalte 10
Bedeutet:
Steht in Spalte 10 gar nix, dann gibt der Befehl 1 zurück (1. Zeile in Spalte 10; 0 als Rückgabe geht nicht, weil Zeilenzählen bei 1 beginnt)
Sind in Spalte 10 aber 100 Einträge, beginnend in Zeile 3, dann wäre der Rückgabewert = 103
Vielleicht hast du mich jetzt verstanden.
Auch ich hatte viele Jahre vor ROWS() nie einen . gesetzt, weil es immer "passte" - bis ich dann von Excel eines besseren "belehrt" wurde :-)
Ciao
Thorsten
Anzeige
AW: Pls Help
13.04.2022 15:53:38
ReginaR
Hallo Thorsten,
ich glaube, wir reden aneinander vorbei:
Rows.Count ermittelt nicht die Anzahl der benutzten Zeilen in einer Spalte, sondern die Gesamtzahl der Zeilen. Bei einer xlsx-datei ist das immer 1048576, bei xls 65536. Diese Zeilennumer wird in der Befehlszeile nur als "Sprungbrett" für End(xlUp) benutzt. D.h. ich starte ganz unten und "springe" dann nach oben bis zur ersten befüllten Zelle.
Man könnte statt Rows.Count in der xlsx-Datei auch fix die Zahl 1048576 eingeben, das Ergebnis wäre das gleiche.
AW: Pls Help
13.04.2022 16:11:10
GerdL
Moin

trotzdem fängt zählt ab da erst die erste Spalte unterhalb der Linien.
Nimm mal nur gaaanz dünne Linien.
Gruß Gerd
Anzeige
AW: Pls Help
12.04.2022 21:09:01
Nerzi
Da hab ich wohl nicht aufgepasst. Jeweils in "J" :)
AW: Pls Help
12.04.2022 21:09:08
Nerzi
Da hab ich wohl nicht aufgepasst. Jeweils in "J" :)

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige