Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VBA letzte befuellte Zelle einer Spalte ermitteln und Range kopieren

991 views
Skip to first unread message

Volker Neurath

unread,
May 14, 2010, 8:24:36 AM5/14/10
to
Hallo zusammen,

meine �berschrift ist etwas ungenau.

Was ich m�chte, schildere ich an einem Beispiel:

In ein Excel-Sheet werden Produktlisten eingetragen, mit verschiedenen
Werten. die Spalte A enth�lt dabei die Produktbeschreibung, die Spalte B
die Artikelnummer.

Ene VBA-routine soll nun die in spalte A und B eingetragenen Werte in
ein zweites Blatt desselben Workbooks kopieren.

Klar k�nnte ich das einfach in Zelle A2 des Zielsheets
=Wenn(ISTLEER(Blatt1!A2;"";Blatt1!A2)
schreiben und runterkopieren bis Blattende - aber das finde ich
unelegant.
Ich m�chte halt, dass nur soviele Zeilen kopiert werden, wie auch
vorhanden sind.

Au�erdem ben�tige ich diese Funktion ein weiteres mal, da aus derselben
Liste noch ein ExcelSheet erstellt werden muss, das in unser WW-System
hochgeladen wird; und da w�rden z.B. Formeln st�ren.

Volker

--
Wenn es vom Himmel Zitronen regnet -- lerne, Limonade zu machen.

Andreas Killer

unread,
May 14, 2010, 8:38:25 AM5/14/10
to
Volker Neurath schrieb:

> In ein Excel-Sheet werden Produktlisten eingetragen, mit verschiedenen

> Werten. die Spalte A enth锟絣t dabei die Produktbeschreibung, die Spalte B

> die Artikelnummer.
>
> Ene VBA-routine soll nun die in spalte A und B eingetragenen Werte in
> ein zweites Blatt desselben Workbooks kopieren.

Wann?

Soll direkt bei der Eingabe das Kopieren stattfinden oder m锟絚htest Du
selber mit einem Makro generell alle Wert in Spalte A und B kopieren?

> Au锟絜rdem ben锟絫ige ich diese Funktion ein weiteres mal, da aus derselben

> Liste noch ein ExcelSheet erstellt werden muss, das in unser WW-System

> hochgeladen wird; und da w锟絩den z.B. Formeln st锟絩en.
Also soll das Kopieren nicht nur in ein sondern in 2 Bl锟絫ter erfolgen?

Wie hei锟絜n die Bl锟絫ter denn eigentlich?

Tjajaja, ich glaube nicht nur Deine 锟絙erschrift ist ungenau. ;-)

Andreas.

Sub Test()
Dim Ymax As Long
'Letzte Zeile in Spalte A und B ermitteln, _
und h锟絟ere Zeile bestimmen.
Ymax = WorksheetFunction.Max( _
Range("A" & Rows.Count).End(xlUp).Row, _
Range("B" & Rows.Count).End(xlUp).Row)
'Alles von Zelle A1 bis B[letzte Zeile] kopieren _
nach Tabelle2
Range(Range("A1"), Range("B" & Ymax)).Copy _
Destination:=Sheets("Tabelle2").Range("A1")
End Sub

Volker Neurath

unread,
May 14, 2010, 9:33:48 AM5/14/10
to
Andreas Killer wrote:

> Volker Neurath schrieb:

>> In ein Excel-Sheet werden Produktlisten eingetragen, mit verschiedenen
>> Werten. die Spalte A enth锟絣t dabei die Produktbeschreibung, die Spalte B
>> die Artikelnummer.
>>
>> Ene VBA-routine soll nun die in spalte A und B eingetragenen Werte in
>> ein zweites Blatt desselben Workbooks kopieren.
> Wann?

> Soll direkt bei der Eingabe das Kopieren stattfinden

Am liebsten, ja.
Das gesamte Worksheet soll demn锟絰t an unsere Aussendienstler gehen;
denen m锟絚hte ich nur notfalls noch zumuten, im Zielsheet einen Button
dr锟絚ken zu m锟絪sen

>> Au锟絜rdem ben锟絫ige ich diese Funktion ein weiteres mal, da aus derselben
>> Liste noch ein ExcelSheet erstellt werden muss, das in unser WW-System
>> hochgeladen wird; und da w锟絩den z.B. Formeln st锟絩en.
> Also soll das Kopieren nicht nur in ein sondern in 2 Bl锟絫ter erfolgen?

> Wie hei锟絜n die Bl锟絫ter denn eigentlich?

Quellsheet: Produktliste
Zielsheet 1: Competitor Information
Zielsheet 2: Uploadliste

Relevante Informationen aus dem Quellsheet

F锟絩 Zielsheet 1: spalten A und B ab A4 bzw B4 - und dann eben bis n.
F锟絩 Zielsheet 2: Spalten A - V ohne spalte L

> Tjajaja, ich glaube nicht nur Deine 锟絙erschrift ist ungenau. ;-)

Is ja gut ;)

> Sub Test()
> Dim Ymax As Long
> 'Letzte Zeile in Spalte A und B ermitteln, _
> und h锟絟ere Zeile bestimmen.
> Ymax = WorksheetFunction.Max( _
> Range("A" & Rows.Count).End(xlUp).Row, _
> Range("B" & Rows.Count).End(xlUp).Row)
> 'Alles von Zelle A1 bis B[letzte Zeile] kopieren _
> nach Tabelle2
> Range(Range("A1"), Range("B" & Ymax)).Copy _
> Destination:=Sheets("Tabelle2").Range("A1")
> End Sub

Sieht gut aus, damit sollte ich den Rest alleine hinbekommen - bis auf
kopieren w锟絟rend der eingabe.

Danke

Volker Neurath

unread,
May 14, 2010, 10:07:23 AM5/14/10
to
Andreas Killer wrote:

> Sub Test()
> Dim Ymax As Long
> 'Letzte Zeile in Spalte A und B ermitteln, _

> und h�here Zeile bestimmen.


> Ymax = WorksheetFunction.Max( _
> Range("A" & Rows.Count).End(xlUp).Row, _
> Range("B" & Rows.Count).End(xlUp).Row)
> 'Alles von Zelle A1 bis B[letzte Zeile] kopieren _
> nach Tabelle2
> Range(Range("A1"), Range("B" & Ymax)).Copy _
> Destination:=Sheets("Tabelle2").Range("A1")
> End Sub

Hab den code Ausprobiert.
Setze ich den Beginn auf Zelle "A4" (dort beginnt mein Wertebereich)
wird nichts kopiert, setze ich den Beginn auf A1, wird nurdie
�berschritenZeile (eben die Zellen A1 und B1) kopiert.

Volker Neurath

unread,
May 14, 2010, 10:18:06 AM5/14/10
to
Und so umgeschrieben:


Private Sub cmdProduktlisteKopieren_Click()


Dim Ymax As Long
'Letzte Zeile in Spalte A und B ermitteln, _
und h�here Zeile bestimmen.
Ymax = WorksheetFunction.Max( _

Sheets("Produktliste").Range("A" & Rows.Count).End(xlUp).Row, _
Sheets("Produktliste").Range("B" & Rows.Count).End(xlUp).Row)
Debug.Print


'Alles von Zelle A1 bis B[letzte Zeile] kopieren _
nach Tabelle2

Range(Sheets("Produktliste").Range("A4"),
Sheets("Produktliste").Range("B" & Ymax)).Copy _
Destination:=Sheets("Competitor Information").Range("A3")
End Sub


erhalte ich einen laufzeitfehler mit "Die Methode Range f�r das Objekt
Worksheet ist fehlgeschlagen"

Ich weiss nicht mehr weiter und gebe hiermit f�r heute auf :(

Montag gehts weiter :(

Claus Busch

unread,
May 14, 2010, 10:29:58 AM5/14/10
to
Hallo Volker,

dann probiers mal so:

Private Sub cmdProduktlisteKopieren_Click()
Dim Ymax As Long
'Letzte Zeile in Spalte A und B ermitteln

'und h�here Zeile bestimmen.

With Sheets("Produktliste")
Ymax = WorksheetFunction.Max( _
.Range("A" & Rows.Count).End(xlUp).Row, _


.Range("B" & Rows.Count).End(xlUp).Row)
Debug.Print

'Alles von Zelle A4 bis B[letzte Zeile] kopieren
'nach Tabelle2
.Range(Cells(4, 1), Cells(Ymax + 3, 2)).Copy _


Destination:=Sheets("Competitor Information").Range("A3")

End With

End Sub


Mit freundlichen Gr�ssen
Claus Busch
--
Win XP PRof SP2 / Vista Ultimate SP2
Office 2003 SP2 /2007 Ultimate SP2

Volker Neurath

unread,
May 14, 2010, 10:45:51 AM5/14/10
to
Claus Busch wrote:

> Hallo Volker,

> dann probiers mal so:

> Private Sub cmdProduktlisteKopieren_Click()
> Dim Ymax As Long
> 'Letzte Zeile in Spalte A und B ermitteln
> 'und h�here Zeile bestimmen.

> With Sheets("Produktliste")
> Ymax = WorksheetFunction.Max( _
> .Range("A" & Rows.Count).End(xlUp).Row, _
> .Range("B" & Rows.Count).End(xlUp).Row)
> Debug.Print
> 'Alles von Zelle A4 bis B[letzte Zeile] kopieren
> 'nach Tabelle2
> .Range(Cells(4, 1), Cells(Ymax + 3, 2)).Copy _
> Destination:=Sheets("Competitor Information").Range("A3")
> End With

F�hrt zu "Anwendungs- oder objektdefinierter Fehler", makriert ist:

> .Range(Cells(4, 1), Cells(Ymax + 3, 2)).Copy _
> Destination:=Sheets("Competitor Information").Range("A3")

Claus Busch

unread,
May 14, 2010, 10:52:03 AM5/14/10
to
Hallo Volker,

Am Fri, 14 May 2010 16:45:51 +0200 schrieb Volker Neurath:

> F�hrt zu "Anwendungs- oder objektdefinierter Fehler", makriert ist:
>
>> .Range(Cells(4, 1), Cells(Ymax + 3, 2)).Copy _
>> Destination:=Sheets("Competitor Information").Range("A3")

sorry, habe die Punkte vergessen. �ndere so ab:
.Range(.Cells(4, 1), .Cells(Ymax + 3, 2)).Copy _


Destination:=Sheets("Competitor Information").Range("A3")

Volker Neurath

unread,
May 14, 2010, 1:01:00 PM5/14/10
to
Claus Busch wrote:

>> Fᅵhrt zu "Anwendungs- oder objektdefinierter Fehler", makriert ist:


>>
>>> .Range(Cells(4, 1), Cells(Ymax + 3, 2)).Copy _
>>> Destination:=Sheets("Competitor Information").Range("A3")
>

> sorry, habe die Punkte vergessen. ᅵndere so ab:


> .Range(.Cells(4, 1), .Cells(Ymax + 3, 2)).Copy _
> Destination:=Sheets("Competitor Information").Range("A3")

Etwas zu schnell auf "Senden" geklickt:

was mᅵsste ich denn tun, damit die ᅵbertragung schon wᅵhrend der Eingabe
erfolgt?
Geht das ᅵberhaupt?

Volker
--
Im ᅵbrigen bin ich der Meinung, dass TCPA/TCG verhindert werden muss

Wenn es vom Himmel Zitronen regnet, dann lerne, wie man Limonade macht

Volker Neurath

unread,
May 14, 2010, 12:59:52 PM5/14/10
to
Claus Busch wrote:

>>> .Range(Cells(4, 1), Cells(Ymax + 3, 2)).Copy _
>>> Destination:=Sheets("Competitor Information").Range("A3")
>

> sorry, habe die Punkte vergessen. ᅵndere so ab:


> .Range(.Cells(4, 1), .Cells(Ymax + 3, 2)).Copy _
> Destination:=Sheets("Competitor Information").Range("A3")

Uff!
Den fehlenden Punkt habbich auch ᅵbersehen.

OK, ich teste das am Montag, jetzt hab ich erstmal Wochenende (und zu Hause
kein Excel)

Claus Busch

unread,
May 14, 2010, 1:14:54 PM5/14/10
to
Hallo Volker,

Am Fri, 14 May 2010 19:01 +0200 schrieb Volker Neurath:

> was m�sste ich denn tun, damit die �bertragung schon w�hrend der Eingabe
> erfolgt?

du m�sstest in "Produktliste" Ver�nderungen an den Zellen �berwachen mit
Worksheet_Change
Aber ob das sinnvoll ist, dass bei jeder �nderung das Kopieren
angestossen wird, bezweifle ich.

Claus Busch

unread,
May 14, 2010, 1:19:10 PM5/14/10
to
Hallo Volker,

und wenn du kopierst bevor du schlie�t oder speicherst, also nicht
gerade bei jeder Eingabe?
Also ein �berwachen von Workbook_BeforeClose oder Workbook_BeforeSave

Andreas Killer

unread,
May 15, 2010, 3:55:37 AM5/15/10
to
Volker Neurath schrieb:

>> Wann?
>> Soll direkt bei der Eingabe das Kopieren stattfinden
> Am liebsten, ja.

Dann kannst Du im Change-Ereignis der Tabelle "Produktliste" die
Eingaben �berwachen und direkt 1:1 in die Zieltabellen �bernehmen.

Der Code muss in das Codemodul der Tabelle, wie's geht steht hier:
http://www.online-excel.de/excel/singsel_vba.php?f=44#s4

Andreas.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim R As Range
Dim Tabelle As Variant, I As Integer

'Liste aller Zieltabellen
Tabelle = Array("Competitor Information", "Uploadliste")
'Ereignisse aus
Application.EnableEvents = False
'Durchlaufe jede ge�nderte Zelle einzeln
For Each R In Target
'Durchlaufe jede Zieltabelle
For I = LBound(Tabelle) To UBound(Tabelle)
'Schreibe den Wert in die gleiche Zelle dort
Sheets(Tabelle(I)).Range(R.Address) = R
Next
Next
'Ereignisse an
Application.EnableEvents = True
End Sub

Volker Neurath

unread,
May 15, 2010, 3:30:22 PM5/15/10
to
Claus Busch wrote:

> Hallo Volker,
>
> und wenn du kopierst bevor du schlieᅵt oder speicherst, also nicht
> gerade bei jeder Eingabe?
> Also ein ᅵberwachen von Workbook_BeforeClose oder Workbook_BeforeSave

Das geht nicht - aber wenn ich den Wechsel zwischen Worksheets ᅵberwachen
kᅵnnte, wᅵre das eine Option.

Der Aussendienstler muss nᅵmlich in eines der Worksheets, in das die Daten
kopiert werden, ebenfalls Eintragungen machen.
Kopiert werden sollen die Daten nur, um ihm doppelte bzw. dreifache Arbeit
zu ersparen.

Bei dem Zweiten Sheet ist der Grund fᅵr das kopieren der, dass die Daten in
eine mit SAP verbundene webbasierte Applikation hochgeladen werden sollen -
diese sich aber an eventuell im Sheet vorhandenen Formeln stᅵrt und dann
einfach abschmiert.

Wᅵre dem nicht so, wᅵrde ich, statt nach kopieren zu fragen, schlicht
Formeln wie

=Wenn(Istleer(Produktliste!A4);"";Produktliste!A4)

in den Zellen des Zielsheets benutzt haben - Eleganz hin oder her ;)

Volker Neurath

unread,
May 17, 2010, 3:10:39 AM5/17/10
to
Hi Claus,

Claus Busch wrote:

> sorry, habe die Punkte vergessen. �ndere so ab:

> ..Range(.Cells(4, 1), .Cells(Ymax + 3, 2)).Copy _


> Destination:=Sheets("Competitor Information").Range("A3")

Das hat das problem wenigstens kurzfristig gel�st.

Ernsthaft: ich bin kurz davor, einfach

=wenn(istleer(quellzelle);"";quellzelle)

in die erste Zielzelle zu shcreiben und das herunterzuziehen bis
Sheetende.

Grund: dein Makro hat exkt *einmal* funktioniert.

Inhalt des Sheets gel�scht, wieder auf den button geklickt und - nichts
tut sich.

Was ist da los?!

Volker,
f�r den VBA unter Excel sich immer mehr als eine Welt des Grauens
offenbart.

Volker Neurath

unread,
May 17, 2010, 4:11:58 AM5/17/10
to
Nochwas f�llt mir gerade ein:

kopiert diese Routine Formeln mit oder nicht?
Formeln im zu kopierenden Bereich sollen eben *nicht* mitkopiert werden,
nur Werte.

Volker

Claus Busch

unread,
May 17, 2010, 6:15:46 AM5/17/10
to
Hallo Volker,

Am Mon, 17 May 2010 10:11:58 +0200 schrieb Volker Neurath:

> Formeln im zu kopierenden Bereich sollen eben *nicht* mitkopiert werden,
> nur Werte.

probiers mal so in Workbook_SheetActivate. Damit werden dir beim
Aktivieren von "Competitor Information" die *Werte* aus Produktliste
kopiert.

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

Dim Ymax As Long
'Letzte Zeile in Spalte A und B ermitteln
'und h�here Zeile bestimmen.

If ActiveSheet.Name = "Competitor Information" Then
ActiveSheet.Cells.Delete


With Sheets("Produktliste")
Ymax = WorksheetFunction.Max( _
.Range("A" & Rows.Count).End(xlUp).Row, _
.Range("B" & Rows.Count).End(xlUp).Row)
Debug.Print
'Alles von Zelle A4 bis B[letzte Zeile] kopieren
'nach Tabelle2

.Range(.Cells(4, 1), .Cells(Ymax, 2)).Copy
ActiveSheet.Range("A3").PasteSpecial xlPasteValues
End With
End If

End Sub

Volker Neurath

unread,
May 17, 2010, 8:58:15 AM5/17/10
to
Hi Claus

Claus Busch wrote:

> probiers mal so in Workbook_SheetActivate. Damit werden dir beim
> Aktivieren von "Competitor Information" die *Werte* aus Produktliste
> kopiert.

> Private Sub Workbook_SheetActivate(ByVal Sh As Object)

> Dim Ymax As Long
> 'Letzte Zeile in Spalte A und B ermitteln
> 'und h�here Zeile bestimmen.

> If ActiveSheet.Name = "Competitor Information" Then
> ActiveSheet.Cells.Delete
> With Sheets("Produktliste")
> Ymax = WorksheetFunction.Max( _
> .Range("A" & Rows.Count).End(xlUp).Row, _
> .Range("B" & Rows.Count).End(xlUp).Row)
> Debug.Print
> 'Alles von Zelle A4 bis B[letzte Zeile] kopieren
> 'nach Tabelle2
> .Range(.Cells(4, 1), .Cells(Ymax, 2)).Copy
> ActiveSheet.Range("A3").PasteSpecial xlPasteValues
> End With
> End If

> End Sub

ich habe diesen code in das .activate Ereignis des "Competitor
Information" worksheets kopiert.
Funktionierte bestens, nachdem ich

ActiveSheet.Cells.Delete

auskommentiert hatte, da es mir die voreingestellten �beschriftenzeilen
l�scht ;)

ein ganz herzliches 'Danke' f�r deine hervorragende Hilfe.

Claus Busch

unread,
May 17, 2010, 9:06:12 AM5/17/10
to
Hallo Volker,

Am Mon, 17 May 2010 14:58:15 +0200 schrieb Volker Neurath:

> Funktionierte bestens, nachdem ich
>
> ActiveSheet.Cells.Delete
>
> auskommentiert hatte, da es mir die voreingestellten �beschriftenzeilen
> l�scht ;)

sch�n, dass es nun funktioniert.
Wenn du die Zellen nicht l�schst, darf aber die Tabelle in Produktliste
nicht kleiner werden. Falls das doch der Fall sein kann, m�sste man zum
L�schen den korrekten Range angeben.

Volker Neurath

unread,
May 17, 2010, 9:25:30 AM5/17/10
to
Claus Busch wrote:

> Wenn du die Zellen nicht l�schst, darf aber die Tabelle in Produktliste
> nicht kleiner werden. Falls das doch der Fall sein kann, m�sste man zum
> L�schen den korrekten Range angeben.

Klar. Daran versuche ich mich jetzt mal selber; ich glaube, das Prinzip
habe ich verstanden - wir werden sehen ;)

Ob das wirklich wichtig ist, werden wir ebenfalls sehen m�ssten;
_geplant_ habe ich, dass das Workbook als *.xlt Datei verteilt wird -
nat�rlich mit leeren Sheets, so dass dieser Fall eigentlich nicht
auftreten sollte.

Aber man weiss ja nie... ;)

Volker Neurath

unread,
May 18, 2010, 1:51:08 AM5/18/10
to
Hi claus, hi @ll,

Claus Busch wrote:

> sch�n, dass es nun funktioniert.
> Wenn du die Zellen nicht l�schst, darf aber die Tabelle in Produktliste
> nicht kleiner werden. Falls das doch der Fall sein kann, m�sste man zum
> L�schen den korrekten Range angeben.

Hab ich selber versucht - geht nicht.

was genau ist an folgendem Code falsch?

If ActiveSheet.Name = "Competitor Information" Then

'Bereich A3:Bn leeren
With Sheets("Competitor Information")


Ymax = WorksheetFunction.Max( _
.Range("A" & Rows.Count).End(xlUp).Row, _
.Range("B" & Rows.Count).End(xlUp).Row)

'Alles von Zelle A3 bis B[letzte Zeile] kopieren
'nach Tabelle2
.Range(.Cells(3, 1), .Cells(Ymax, 2)).Clear
End With
end if

Ergebnis eines durchlaufes ist: keine aktion, der Bereich wird nicht,
wie erwartet gel�scht, es passiert schlicht nichts, jedenfalls nichts
sichtbares

Volker Neurath

unread,
May 18, 2010, 2:13:45 AM5/18/10
to
kommando zur�ck: funktioniert sehrwohl.
man sollte den Test auch so durchf�hren, dass man eine m�gliche
Ver�nderung erkennen kann *sch�m*

Naja, ist noch fr�h am Tag (und bis jetzt nicht meiner :( )

Claus Busch

unread,
May 18, 2010, 2:07:42 AM5/18/10
to
Hallo Volker,

nachfolgenden Code in das Codemodul von "Competitor Information":

Private Sub Worksheet_Activate()

Dim Ymax As Long

Application.ScreenUpdating = False

If ActiveSheet.Name = "Competitor Information" Then

'Die n�chste Zeile brauchst du nur, wenn die Tabelle
'in Produktliste auch kleiner werden kann
With ActiveSheet


Ymax = WorksheetFunction.Max( _
.Range("A" & Rows.Count).End(xlUp).Row, _
.Range("B" & Rows.Count).End(xlUp).Row)

.Range("A3:B" & Ymax).Clear
End With

With Sheets("Produktliste")


'Letzte Zeile in Spalte A und B ermitteln
'und h�here Zeile bestimmen.

Ymax = WorksheetFunction.Max( _
.Range("A" & Rows.Count).End(xlUp).Row, _
.Range("B" & Rows.Count).End(xlUp).Row)

Debug.Print
'Alles von Zelle A4 bis B[letzte Zeile] kopieren
'nach Tabelle2


.Range(.Cells(4, 1), .Cells(Ymax, 2)).Copy
ActiveSheet.Range("A3").PasteSpecial xlPasteValues
End With
End If

Application.ScreenUpdating = True
Application.CutCopyMode = False

End Sub

Volker Neurath

unread,
May 18, 2010, 2:23:18 PM5/18/10
to
Claus Busch wrote:

[code gesnipped]

Dnke dir - auch wenn ich das Problem selber lᅵsen konnte.

0 new messages