Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1104to1108
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Erst fragen, dann kopieren.

Erst fragen, dann kopieren.
Tanja
Hallo meine lieben Excelianer,
ich habe mal wieder eine Frage und es geht auch mal wieder um das gute, alt Spalten-kopieren.
In diesem Thread ( https://www.herber.de/forum/archiv/1096to1100/t1096452.htm im Beitrag von 17.08.2009 16:42:47 steht der Code) hatte ich nach einem Marko gefragt, das Spalte/n kopiert, in die erste freie/n Spalte/n einfügt und schließlich nach Datum (das in Zeile 7 steht) sortiert.
Ich bin auch unheimlich glücklich - und immernoch sehr dankbar! - mit diesem Makro.
Aaaaaaaber ich möchte es gerne um eine Abfrage erweitern. Bevor die jeweilige Spalte kopiert wird, soll überprüft werden, ob das Datum der zu kopierenden Spalte (bei mir in G7) nciht schon vorhanden ist. Wenn es vorhanden ist, soll eine Meldung erscheinen, in der darauf hingewiesen wird und ich dann entscheiden kann, ob das Makro weitermachen soll, oder nicht.
Ginge das?
Ich hab schonmal versucht ein wenig rumzuspielen, scheiterte aber elendig.
Hat jemand von euch eine Idee und die Muße mir weiterzuhelfen?
Das wäre super! :-)
Viele Grüße,
Tanja
Kopiermakro um Abfrage ergänzen
08.10.2009 08:37:59
Tanja
Guten Morgen,
hat denn niemand eine Idee, wie sich das mit dem Makro bewerkstelligen ließe? :(
VG,
Tanja
AW: Erst fragen, dann kopieren.
08.10.2009 21:03:57
F1

Sub Dein_Macro()
Dim msg as Integer
If msg = msgbox("Soll kopiert werden?") = vbNo Then Exit Sub
....dein weiterer Code
End Sub
F1
Makro soll Datum suchen, dann evtl. überschreiben
09.10.2009 08:29:30
Tanja
Guten Morgen
und vielen Dank für deinen Ansatz.
Leider überprüft das Makro jedoch nciht, ob ein Datum schon vorhanden ist und fragt, ob es überschrieben werden soll. Ich glaube, das ist mein Fehler, wenn ich mir im Nachhinein meine eigene Beschreibung durchlese.
Im Weiteren ist es auch so, dass das Makro trotzdem kopiert, auch wenn man "Nein" auswählt?!
If msg = MsgBox("Soll kopiert werden?", vbYesNo) = vbNo Then Exit Sub
Also, um mich verständlicher auszudrücken: Ich würde gerne das vorhandene Makro um eine Kontrolle ergänzen. Es soll zunächst überprüft werden, ob das Datum der zu-kopierenden Spalte schon in der Liste der bereits kopierten Spalten drin ist.
Dann soll das Makro mich fragen: "xx.xx.xxxx ist schon vorhanden. Vorgang forsetzen?" Bei JA soll das Makro die vorhandenen Daten überschreiben, bei NEIN abbrechen.
Ich hoffe dennoch, dass du mir weiterhin dabei behilflich sein kannst :)
viele Grüße und eine guten Start in den Tag,
Tanja
Anzeige
AW: Makro soll Datum suchen, dann evtl. überschreiben
12.10.2009 01:56:07
franc
Am besten macht sich immer noch das Blatt wo du was verändern willst ...
Müssen ja nicht die Originaldaten drinstehen aber es sollte schon erkennbar sein wie es aussieht - sprich was kopiert werden soll
aus dem makrotext vom anderen thread werd ich net wirklich schlau ^^
Wenn es nicht selbst anpassen kannst, einfach nochmal Tabelle beifügen oder wenn wer die anderen Makros nachvollziehen kann, darf er das anpassen ^^
Dim Quell_Datum, c, vorh_Spalte, Abfrage
'wo steht das Datum?
Quell_Datum = Sheets("Tabelle1").Range("A1")
Abfrage = MsgBox("Soll kopiert werden?", vbYesNo)
If Abfrage = vbNo Then Exit Sub
'Bereich festlegegen wo nach dem Datum gesucht werden soll
With Sheets("Tabelle1").Range("B1:M1")
Set c = .Find(Quell_Datum, LookIn:=xlValues)
If Not c Is Nothing Then
' Spalte rausfinden wo das Datum steht
vorh_Spalte = c.Column
Else
'hier die kopierbefehle rein, wenn es nicht vorhanden ist
End If
End With
Anzeige
Fehlerteufel ^^
12.10.2009 02:01:57
franc
Abfrage wenn Wert vorhanden ist, war falsch (das kommt davon, wenn man es ohne zu überlegen aus der Excelhilfe kopiert)
hier nochmal richtig (hoff ich ;-) )
Sub kopieren()
Dim Quell_Datum, c, vorh_Spalte, Abfrage
'wo steht das Datum?
Quell_Datum = Sheets("Tabelle1").Range("A1")
'Bereich festlegegen wo nach dem Datum gesucht werden soll
With Sheets("Tabelle1").Range("B1:M1")
Set c = .Find(Quell_Datum, LookIn:=xlValues)
If c Then
Abfrage = MsgBox("Soll kopiert werden?", vbYesNo)
If Abfrage = vbNo Then Exit Sub
' Spalte rausfinden wo das Datum steht
vorh_Spalte = c.Column
Else
'hier die kopierbefehle rein, wenn es nicht vorhanden ist
End If
End With
End Sub

Anzeige
Ich kriegs nicht hin :(
12.10.2009 08:24:58
Tanja
Guten Morgen und vielen Dank schonmal für die Vorschläge!
Allerdings bin ich ein wenig blöd, das Makro so anzupassen, dass ich damit arbeiten kann :(
Deswegen versuche ich euch mal zu zeigen, was ich bisher habe, vielleicht könnt ihr mir ja dann helfen es umzustricken?
Hier ist ein Auzug aus meiner Routine. Da es nciht nur um einen Kopiervorgang geht, trage ich hier alles ein, was auf einmal kopiert werden soll:
Sub SpaltKopv2()
'Tabellennamen und Bereiche in dieser Routine anpassen
Sheets("Tabelle1").Activate
Application.ScreenUpdating = False
SpalteKopieVal wksZiel:=Worksheets("Tabelle1"), _
wksQuelle:=Worksheets("Tabelle1"), strSpalteQuelle:=("G:G")
Call SortSpalteTabelle1
SpalteKopieVal wksZiel:=Worksheets("Tabelle2"), _
wksQuelle:=Worksheets("Tabelle2"), strSpalteQuelle:=("F:F")
Call SortSpalteTabelle2
Application.ScreenUpdating = True
ActiveCell.Select
End Sub
Als nächstes ist hier der Kopierbefehl (kopiert nur die Werte - so sollte es auch bleiben :)) :
Sub SpalteKopieVal(wksZiel As Worksheet, wksQuelle As Worksheet, _
strSpalteQuelle As String)
' Kopiert Werte von wksQuelle nach wksZiel hinter die letzte Spalte
Dim lngCol As Long
With wksZiel
lngCol = LetzteSpalteBlatt(wksZiel)
If lngCol + wksQuelle.Range(strSpalteQuelle).Columns.Count 
Dazu gehört das Teil, das die erste freie Spalte berechnet:
Function LetzteSpalteBlatt(wks As Worksheet)
' Letzte Spalte im Zeilenbereich lngZVon:lngZBis
Dim Spalte As Long
LetzteSpalteBlatt = 1
With wks
For Spalte = .Cells.SpecialCells(xlCellTypeLastCell).Column To 1 Step -1
If Application.WorksheetFunction.CountA(.Columns(Spalte)) > 0 Then
LetzteSpalteBlatt = Spalte
Exit For
End If
Next
End With
End Function
Und ganz zum Schluss habe ich noch das Makro, dass die Spalten dann noch nach dem Datum aufsteigend sortiert:
Sub SortSpalteDiff()
Dim wksZiel As Worksheet, Spalte_1 As Long, ZeileSort As Long
Set wksZiel = Worksheets("Tabelle1")
Spalte_1 = 9      'erste Spalte des Sortierbereichs ggf. anpassen (hier: I)
ZeileSort = 7     'Zeile nach der Sortiert werden soll (z.B. Zeile 7 für Datum)
With wksZiel
With .Range(.Columns(Spalte_1), .Columns(.Cells(ZeileSort, _
.Columns.Count).End(xlToLeft).Column))
.Sort Key1:=.Cells(ZeileSort, .Column), order1:=xlAscending, Header:=xlNo, _
Orientation:=xlLeftToRight
End With
End With
End Sub
Wie krieg ich denn jetzt die Abfrage dazwischen, ohne dass ich für jede Tabelle ein anderes Kopiermakro benötige?
Und wie bekomme ich es hin, dass alle Werte, inkl. Datum, auch überschrieben werden, wenn das Datum schon vorhanden ist und ich es in dem Makro bestätige?
Habe mein Makro gerade dazwischenpacken wollen, so wie es im Kommentar steht, aber es kann ja gar nciht funktionieren, weil alles in meiner Routine ja ganz anders benannt ist. :(
Ich kann gleich einmal eine Beispieltabelle basteln, falls es hilft.
Wäre sehr froh, wenn ihr mir weiterhin helfen könntet!
Einen guten Start in die Woche wünscht
Tanja
Anzeige
Rückfragen
12.10.2009 10:02:12
Erich
Hi Tanja,
eine Beispielmappe wäre sicher hilfreich. Der Code sollte dabei vollständig sein.
(In deinem letzten Beitrag fehlten SortSpalteTabelle1 und SortSpalteTabelle2,
dafür wird SortSpalteDiff gar nicht aufgerufen.)
Noch eine Frage:
Wenn Quell- gleich Zieltabellenblatt ist:
Nehmen wir an, Tabelle1 ist bis Spalte J gefüllt ist, dann soll Spalte G kopiert werden.
Was genau soll jetzt geprüft werden? Ob G7 in Zeile 7 vorkommt? Das ist immer der Fall - eben in G7.
Vielleicht kannst du das noch etwas genauer erklären.
Geht es eigentlich IMMER um Zeile 7? Oder vielleicht später doch auch mal um eine andere Zeile?
Und in deinem Beispiel für Tabelle2: Hier soll wohl F7 statt G7 geprüft werden, oder?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
... und die Antworten
12.10.2009 11:49:17
Tanja
Hallo Erich,
ich danke dir für deine Antwort. Puh, da scheint ja noch ziemlich viel unklar zu sein :)
Ich versuche es mal so genau wie möglich zu erklären. Aber hier erstmal die Beispieldatei:
https://www.herber.de/bbs/user/65044.xls
Also:
Im Prinzip ist jedes Sheet ähnlich aufgebaut (deswegen habe ich eine Beispieldatei aus nur einem Sheet gemacht).
Daten werden vorne eingelesen. In der Beispieldatei in Spalte F.
Alte Daten stehen dahinter. In der Beispieldatei ab H. Das Prinzip ist überall das Gleiche.
Ich habe mir die Dateien so gebastelte, dass IMMER in Zeile 7 das Datum steht.
Quell- und Zieltabelle sind immer gleich.
Und in deinem Beispiel für Tabelle2: Hier soll wohl F7 statt G7 geprüft werden, oder?

Genau. Es kommt auch vor, dass mal H7, F7 oder J7 geprüft wird.
Wäre also schön, wenn die Routine so oder in dieser Art bleiben könnte (weil die so wunderschön leicht zu ahndhaben ist :)
Wenn man nun auf "kopieren" klickt, wird der Wert vom 14.09. in Spalte L kopiert. Wenn ich den Button nochmal drücke, wird der Wert in M kopiert. Aber stattdessen möchte ich dann lieber gefragt werden "Das Datum 14.09. existiert bereits. Wirklich überschreiben?". Bei ja --> Werte überschreiben. Bei nein --> Abbruch.
Sind noch Fragen offen?
Es wäre wundervoll, wenn du mir helfen könntest :)
VG,
Tanja
Anzeige
und neue Fragen :)
12.10.2009 13:47:22
Tanja
Hallo Erich,
auf dem ersten Blick: toll! Auf dem zweiten Blick immernoch :)
Allerdings kopiert das Makro, wenn ein Datum schon vorhanden ist, und überschreibt die vorhandenen Daten nicht. Hast du dafür auch noch eine Idee?
Ich stelle mir das quasi so vor:
Alte Werte:
14.09.09 - 1 2 3 4 5
Neue Werte:
14.09.09 - 2 4 6 8 10
Makro findet das Datum "14.09.09" und ersetzt die alten Werte (1 2 3 4 5) durch die neuen Werte (2 4 6 8 10). Wird es nachvollziehbar, was ich meine?
Des Weiteren blick ich da noch nciht ganz durch. Könntest du das Makro vielleicht für mich kommentieren, wo ich was anpassen muss, wenn ich das Makro zB auf andere Tabellen anwende?
Das wäre klasse!
Bis hierhion schonmal tausend Dank!
VG,
Tanja
Anzeige
und die neue Version
12.10.2009 16:31:39
Erich
Hi Tanja,
mit ein wenig Kommentar. Bei Fragen bitte melden!
https://www.herber.de/bbs/user/65049.xls
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: und die neue Version
12.10.2009 19:21:41
Tanja
Nabend Erich,
danke, für deine Mühen. Soweit ich sehen kann, läufts perfekt :)
Noch eine kleine Frage am Rande. Könnte man theoretisch dieses Makro auch auf andere Excel-Dateien anwenden, indem man die Routine anpasst, oder läuft das Makro nur in der Arbeitsmappe, in der es sich befindet? Was müsste ich anpassen?
Nochmals tausend Dank. Wenn du in der Nähe wohnst, würde ich dich zu 'nem Kaffee einladen ;)
Einen schönen Abend noch,
Tanja
Anzeige
AW: und die neue Version
12.10.2009 19:44:50
Erich
Hi Tanja,
da ist eigentlich keine Änderung nötig - das Startmakro arbeitet auf der gerade aktiven Mappe.
Sicherheitshalber sollte man aber vollständig referenzieren - einschließlich der Mappe, wenn es mehrere gibt.
Das würde ich dann so schreiben:

Sub SpaltKopv4()
' lngZeile:        7 - Zeile mit dem Datum
' lngSpalteQuelle: 6 - Spalte F als Quellspalte
' lngAbSpalte:     8 - Spalte H, Spalte, ab der sortiert werden soll
'Mappen- und Tabellennamen und Bereiche in dieser Routine anpassen
With Workbooks("abc.als")
If SpalteKopieVal(wksT:=.Worksheets("Tabelle1"), lngZeile:=7, lngSpalteQuelle:=6) Then
SortAbSpalte wks:=.Worksheets("Tabelle1"), lngNachZeile:=7, lngAbSpalte:=8
End If
End With
End Sub
Wichtig ist besonders der Punkt jeweils vor 'Worksheets'.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort - da wohne ich - wg. Kaffee ;-))
Anzeige
Nochmal eine Frage :)
13.10.2009 11:41:35
Tanja
Hallo Erich,
entschuldige bitte, dass ich dich nochmal nerven muss, aber ich bin erst jetzt dazu gekommen, mir alles nochmal in Ruhe anzuschauen :)
Wenn ich mehrere Sachen kopieren muss, ist es dann richtig, die Routine so anzupassen? Oder wird das anders gemacht?
Sub SpaltKopv4()
' lngZeile:        7 - Zeile mit dem Datum
' lngSpalteQuelle: 6 - Spalte F als Quellspalte
' lngAbSpalte:     8 - Spalte H, Spalte, ab der sortiert werden soll
'Mappen- und Tabellennamen und Bereiche in dieser Routine anpassen
With Workbooks("abc.als")
If SpalteKopieVal(wksT:=.Worksheets("Tabelle1"), lngZeile:=7, lngSpalteQuelle:=6) Then
SortAbSpalte wks:=.Worksheets("Tabelle1"), lngNachZeile:=7, lngAbSpalte:=8
End If
If SpalteKopieVal(wksT:=.Worksheets("Tabelle2"), lngZeile:=7, lngSpalteQuelle:=6) Then
SortAbSpalte wks:=.Worksheets("Tabelle2"), lngNachZeile:=7, lngAbSpalte:=8
End If
End With
With Workbooks("def.als")
If SpalteKopieVal(wksT:=.Worksheets("Tabelle1"), lngZeile:=7, lngSpalteQuelle:=6) Then
SortAbSpalte wks:=.Worksheets("Tabelle1"), lngNachZeile:=7, lngAbSpalte:=8
End If
End With
End Sub
Klappen tuts zumindest :D
VG,
Tanja
PS: Dann wohnst du ja gar nciht weit weg :)
Klappt, wackelt, ...
13.10.2009 12:33:29
Erich
Hi Tanja,
... hat Luft - und sieht auch noch gut aus!
Ja, so sollte das ordentlich laufen.
Kaffee wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Klappt, wackelt, ...
13.10.2009 14:21:44
Tanja
Klasse! Nochmals vielen Dank!
Den Kaffee könntest du dir in Duisburg abholen kommen ;)
kleine Ergänzung
12.10.2009 19:50:20
Erich
Hi Tanja,
statt
With Workbooks("abc.als")
kann da natürlich auch z. B. stehen
With ActiveWorkbook
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige