Usedrange erkennt letzte Spalte nicht

Moin Leute,
folgende Methode funktioniert nicht. Sie überschreibt immer wieder eine Spalte (in diesem Fall die zweite). Sinn der Methode ist, dass mit den Parametern wb_von eine Quell-Mappe und wb_nach eine Zielmappe definiere. In der Quellmappe wird die erste Zeile nach der Spaltenüberschrift durchsucht, die im dritten Parameter des Prozeduraufrufs steht. wird dieser String gefunden, soll die komplette Spalte kopiert und in der Zielmappe ganz rechts eingefügt werden. Ein normaler Prozeduraufruf könnte so aussehen (die Arbeitsmappen werden korrekt geöffnet, daher lasse ich hier die Objektbezeichner wb_von und wb_nach einfach drin):

 call spalte\_kopieren(wb\_von, wb\_nach, "Vorname")

Leider kommt als Ergebnis raus, dass die zweite Spalte der Zielmappe die einzig beschriebene ist, und darin stehen die Werte des jeweils letzten Prozeduraufrufs. Also wird immer wieder die selbe Spalte überschrieben. Die Usedrange-Eigenschaft gibt jedesmal den Wert 1 aus, was ich komisch finde. Wenn jemand den Fehler sieht, wäre es cool wenn er/sie mir helfen kann. Ich benutze XL2003 SP2

Hier der Code

Private Sub spalte\_kopieren(ByRef wb\_von As Workbook, ByRef wb\_nach As Workbook, ByRef spstr As String)
wb\_von.Activate
Range("A1").Activate
copy\_col = Cells.Find(spstr, ActiveCell, xlFormulas).Column
ActiveSheet.Cells(1, copy\_col).EntireColumn.Select
Selection.Copy
wb\_nach.Activate
sp = wb\_nach.ActiveSheet.usedrange.Columns.Count
ActiveSheet.Cells(1, sp + 1).Select
ActiveSheet.Paste
End Sub

Moin Leute,
folgende Methode funktioniert nicht. Sie überschreibt immer
wieder eine Spalte (in diesem Fall die zweite). Sinn der
Methode ist, dass mit den Parametern wb_von eine Quell-Mappe
und wb_nach eine Zielmappe definiere. In der Quellmappe wird
die erste Zeile nach der Spaltenüberschrift durchsucht, die im
dritten Parameter des Prozeduraufrufs steht. wird dieser
String gefunden, soll die komplette Spalte kopiert und in der
Zielmappe ganz rechts eingefügt werden. Ein normaler
Prozeduraufruf könnte so aussehen (die Arbeitsmappen werden
korrekt geöffnet, daher lasse ich hier die Objektbezeichner
wb_von und wb_nach einfach drin):

call spalte_kopieren(wb_von, wb_nach, „Vorname“)

Hi Micha,
hab hier kein Excel, deshalb konnte ich deinen Code auch nicht testen, genau wie meinen :frowning:

sub tt(wbQ,wbZ,Titel)
dim SpaQ, SpaZ
SpaQ = application.worksheetfunction.match(wbQ.Worksheets("Tabelle1").range("A2:W2"),Titel) 
SpaZ= wbZ.Worksheets("Tabelle1").cells(1,columns.count).end(xltoleft).column+1
wbQ.Worksheets("Tabelle1").columns(spaQ).copy destination:=wbZ.Worksheets("Tabelle1").cells(1,spaZ)
end sub

Es bleibt noch abzufangen, wenn Titel nicht gefunden wird oder allerletzte Spalte belegt ist, da klappt das end() nicht.

Match entspricht Verweis in Excel, dort mal in der Hilfe schauen ob die Parameterreihenfolge korrekt ist, und nach dem dritten Parameter.

Gruß
Reinhard

Hi Micha,
hab hier kein Excel, deshalb konnte ich deinen Code auch nicht
testen, genau wie meinen :frowning:

Ich hab hier Excel und es funktioniert!!!

Hab jedoch nur deine Codezeile für die Zielspalte genommen und eingesetzt

SpaZ=
wbZ.Worksheets(„Tabelle1“).cells(1,columns.count).end(xltoleft).column+1

Es bleibt noch abzufangen, wenn Titel nicht gefunden wird

Da mach ich mich grad ran

oder allerletzte Spalte belegt ist, da klappt das end() nicht.

Die Tabelle hat eine fixe breite von 26 Spalten

zwar beginnen die Zielspalten nun bei „B“, weil der end-Befehl scheinbar das gleiche Ergebnis für ein leeres Blatt gibt, wei für ein Blatt, dessen erste Spalte belegt ist, aber ne Spalte aus einem Tabellenblatt zu nehmen ist ja nicht so kompliziert.

Vielen Dank nochmal für deine schnelle Hilfe. Ich glaub du könntest es auch als Blindprogrammierer versuchen oder ganz ohne Compilieren auskommen!

Hi Micha,

Hab jedoch nur deine Codezeile für die Zielspalte genommen und
eingesetzt

SpaZ=
wbZ.Worksheets(„Tabelle1“).cells(1,columns.count).end(xltoleft).column+1

Bei längerem Code ist leider deine Variante mit Einzelzeilen für Select (braucht man zu 98% nie), Copy, und Paste unübersichtlich.
Es wäre für dich zukunftsorientiert chicker copy + destination zu benutzen, da sieht man klar was von wo nach wo kopiert wird.

oder allerletzte Spalte belegt ist, da klappt das end() nicht.

zwar beginnen die Zielspalten nun bei „B“, weil der end-Befehl
scheinbar das gleiche Ergebnis für ein leeres Blatt gibt, wei
für ein Blatt, dessen erste Spalte belegt ist, aber ne Spalte
aus einem Tabellenblatt zu nehmen ist ja nicht so kompliziert.

Ja, End() hat 2 Macken. Wenn die letzte Spalte (Zeile) belegt ist gibt es ein falsches Ergebnis und wenn die Spalte (Zeile) leer ist kommt ein falsches Ergebnis.
Ab XL2000 gibt es ja IIF (Ansonsten muß man halt ElseIf nehmen)
und da schreibt man das so:
with activesheet
Spa=Iif(.cells(1,columns.count)"",columns.count, .cells(1,columns.count).end(xltoleft).column)
end with
Der Fehler, wenn Spalte/Zeile leer ist, kann man oft vernachlässigen wenn man in einer Spalte die letzte gefüllte Zelle sucht, denn meist steht in der Spalte oben eine Überschrift, damit ist das Problem weg.

Ansonsten muß man es halt mit
If spa=1 and .cells(1,spa)="" then
abfangen.

Vielen Dank nochmal für deine schnelle Hilfe. Ich glaub du
könntest es auch als Blindprogrammierer versuchen oder ganz
ohne Compilieren auskommen!

Dankeschön :smile:

Gruß
Reinhard