Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1036to1040
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
Code per VBA kopieren
Peter
Hallöchen an alle Excler,
wie kann man es anstellen, wenn ich ein Blatt in eine neue Arbeitsmappe per Steuerelement kopiere, dass das Steuerelement mitkopiert wird, aber ein anderer Code hinterlegt wird.
Hintergrund der Frage:
Ich habe ca. 30 Rechner, die einwandfrei folgenden Befehl ausführen:
~f
Sheets(namges).Copy Before:=Workbooks(namges2).Sheets(1)
Nun das erste Problem:
Leider sind auch 6 Rechner dabei, bei denen er zwar das Blatt kopiert, aber nicht die Steuerelemente (Button und Kalender) und bei obiger Zeile mit einer Fehlermeldung aussteigt, dass er nicht kopieren könne. Hab bis jetzt noch keine Einstellungsmöglichkeit gefunden, die das regeln könnte.
Zweites Problem:
Hinter dem Button auf der Original-Tabelle ist ein Code hinterlegt. Nun soll aber beim kopieren in die neue Arbeitsmappe ein anderer Code für den Button hinterlegt werden. Eine Möglichkeit wäre zwar nach dem Dateinamen abzufragen und entweder Code 1 oder Code2 ausführen zu lassen, aber gibt es da nicht etwas besseres?
at Roland: Sorry, hatte vergessen beim letzten Mal Rückmeldung zu geben. Hat alles funktioniert!
Gruß und Danke schon mal für Eure Ideen.
Peter R.
AW: Code per VBA kopieren
Peter
Hallo Tino,
lieben Dank für die Idee.
Funktioniert auch bis auf eine kleine Kleinigkeit.
Mein Code hat ca. 400 Zeilen und irgendwie wie das nicht akzeptiert. Da kommt dann die Fehlermeldung "Zu viele Zeilenfortsätze?"
Ausserdem ist es sehr mühselig den Code in jeder Zeile vorne mit " und hinten mit " & chr(10) & _ anzupassen.
Hast Du da zufällig auch ne Idee?
Gruß
Peter R.
Anzeige
AW: Code per VBA kopieren
Tino
Hallo,
kenne Deinen Code nicht,
stell mal den Code hier rein (eventuell in einer Textdatei)
und ich schau mal wie wir es machen können.
Gruß Tino
AW: Code per VBA kopieren
Peter
Hallo Tino,
musste erstmal ein paar Sachen verändern. Ließ sich auch nur als zip hochladen. Habs in eine txt gesteckt.
https://www.herber.de/bbs/user/58284.zip
Danke erstmal.
Peter R.
AW: Code per VBA kopieren
Tino
Hallo,
weil Excel bei so vielen Zeichen schnell an seine Grenzen kommt,
habe ich den wohl einfachsten Weg gewählt.
Ich habe den Code in ein Modul (ModulCodeVorlage) verfrachtet und lese diesen als String aus.
Hier die Beispieldatei.
https://www.herber.de/bbs/user/58285.xls
Gruß Tino
Anzeige
AW: Code per VBA kopieren
Peter
Hallo Tino,
hab ne Möglichkeit gefunden. Ich hinterleg den Code einfach in einer ausgeblendeten Zelle und beziehe mich im VBA Code darauf. Ist zwar nicht das eleganteste, aber es funktioniert. Ich lass die Frage mal offen für evtl. weitere Ideen.
Trotzdem vielen Dank.
Gruß
Peter R.
AW: Code per VBA kopieren
Tino
Hallo,
kann aber sein, dass der Code unvollständig ist.
Eine Excelzelle kann nicht so viele Zeichen aufnehmen.
Gruß Tino
Mögliche Zeichen in Zelle: 2^15
.
allerdings als Standard formatiert, nicht als Text!
AW: Mögliche Zeichen in Zelle: 2^15
Tino
Hallo unbekannter,
bei mir ist der Code unvollständig (Standartzelle) und sieht auch sehr toll aus in einer Zelle. ;-)
Ich würde solch einen Code wie geschrieben aus einem Modul heraus holen,
ist auch einfachen wenn er mal bearbeitet werden muss.
Gruß Tino
Anzeige
AW: Mögliche Zeichen in Zelle: 2^15
Peter
Hallo Tino,
vielen Dank für die Hilfe.
Das war genau das, was ich gesucht habe. Muss es nur für meine Zwecke noch umschreiben, da diese Prozedur innerhalb einer anderen Prozedur ablaufen soll.
Aber ist Dir zufällig auf meine erste Frage auch ne Antwort eingefallen?
Hier nochmal die Fragestellung:
Ich habe ca. 30 Rechner, die einwandfrei folgenden Befehl ausführen:
Sheets(namges).Copy Before:=Workbooks(namges2).Sheets(1)
Nun das erste Problem:
Leider sind auch 6 Rechner dabei, bei denen er zwar das Blatt kopiert, aber nicht die Steuerelemente (Button und Kalender) und bei obiger Zeile mit einer Fehlermeldung aussteigt, dass er nicht kopieren könne. Hab bis jetzt noch keine Einstellungsmöglichkeit gefunden, die das regeln könnte.

Auch hier gibt es natürlich die Möglichkeit, welche ich wahrscheinlich auch nutzen werde, nur den betroffenen Zellbereich zu kopieren, da auch noch ein Kalender kopiert wird, der eigentlich nicht benötigt wird und gelöscht werden muss. Aber interessant wäre eine Antwort schon.
Lasse die Frage noch offen.
Gruß
Peter R.
Anzeige
leider habe ich keine Erklärung dafür,...
Tino
Hallo,
ich müsste schon vor solch einem Rechner stehen und mir dass ansehen.
Gruß Tino
AW: leider habe ich keine Erklärung dafür,...
Peter
Hallo Tino,
ist auch erstmal nicht so wichtig.
Hab jetzt aber noch ein anderes Problem.
Wie geschrieben, wollte ich Deinen Code bei mir einbauen.
Was ich natürlich nicht bedacht hatte war, dass sich die Schaltfläche und das kopierte Blatt in einer neuen Arbeitsmappe befinden. Leider bekomme ich es nicht hin, dass der Code in diese neue Arbeitsmappe geschrieben wird. Er wird immer die geschrieben, wo der Code schon steht.
Hab auch schon mehrere Sachen versucht, aber irgendwie gelingt es mir nicht, das richtige Workbook anzusprechen.
Es geht um diese Zeilen:
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
.InsertLines .CountOfLines + 1, sCode

und in der Zusatzfunction:
With Workbooks("Vorlage Eingabemaske.xls").VBProject.VBComponents("intimport01").CodeModule
sCode = .Lines(1, .CountOfLines)

Der ausgeführte Code steht zwar in der Ausgangstabelle (Vorlage Eingabemaske.xls"), aber er soll dann in eine neu angelegte Arbeitsmappe kopiert werden. Diese Mappe hat aber einen variablen Namen.
Wo ist mein Denkfehler?
Gruß
Peter R.
Anzeige
AW: leider habe ich keine Erklärung dafür,...
Peter
Vergessen offen zu halten :-)
AW: leider habe ich keine Erklärung dafür,...
Jan
Hi,
mal prinzipiell:

Sub t()
Dim Wb as workbook
Set WB = Workbooks.Add
With Wb.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
.InsertLines .CountOfLines + 1, sCode
End With
End Sub


Thisworkbook ist das, in dem der Code abläuft.
mfg Jan

AW: leider habe ich keine Erklärung dafür,...
Peter
Hallöchen Ihr beiden,
vielen Dank für Eure Antwort.
Das ThisWorkbook die Arbeitsmappe ist, in der der Code abläuft, ist mir schon klar, aber genau das ist ja das Problem.
Der Code läuft in einer Arbeitsmappe, die auch noch offen bleibt, da hinter dem Code kopieren noch mehr Code kommt.
Das habe ich inzwischen auch hinbekommen.
Nun versuche ich aber wieder den ersten Punkt zu realisieren.
Ich darf mal kurz den Originalcode von Tino verwenden:

strCode = _
"Private Sub " & objButton.Name & "_Click()" & Chr(10) & _
"Test" & Chr(10) & _
"End Sub"
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
.InsertLines .CountOfLines + 1, strCode
End With


Daraus habe ich folgendes gemacht:


strCode = _
"Private Sub " & objButton.Name & "_Click()" & Chr(10) & _
"call Import01" & Chr(10) & _
"End Sub"
With Workbooks(namges2).VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
.InsertLines .CountOfLines + 1, strCode
End With


Aber in der vorletzten Zeile des Codes (vor dem End with) steigt Excel komplett aus und muss beendet werden!
Wo liegt aber der Fehler?
Ich versuche den Code ("strCode") in die neue Arbeitsmappe in die entsprechende Tabelle zu integrieren.
Es sind natürlich immer nur Ausschnitte, was meinst Du also mit "vergessen offen zu halten"?
Gruß
Peter R.

Anzeige
AW: leider habe ich keine Erklärung dafür,...
Tino
Hallo,
soll nun eine neue Datei erzeugt werden oder ist diese bereits vorhanden?
Ist diese vorhanden, ist sie bereits geöffnet oder muss diese geöffnet werden?
Wie heißt diese Datei oder sind nur zwei geöffnet, diese und die wo der Code (Tabelle) hinsoll?
Gruß Tino
AW: leider habe ich keine Erklärung dafür,...
Peter
Hallo Tino,
also:
Es sind zwei Dateien, mit denen das Makro arbeitet (was nicht heißen soll, dass user nicht noch mehr Excel-dateien geöffnet haben können). Aus der Ursprungsdatei ("Vorlage Eingabemaske.xls") kopiere ich einen bestimmten Bereich in eine neue Arbeitsmappe. Diese Arbeitsmappe wird unter der variablen "namges2" gespeichert. Deswegen der Aufruf mit Workbooks(namges2). Nun soll noch der Commandbutton erstellt werden (funktioniert auch einwandfrei) und aus der "Vorlage Eingabemaske.xls heraus" einmal ein Code in die Tabelle geschrieben werden und zum zweiten ein neues Modul in der namges2 erstellt werden, in dem sich kopierter Code aus der "Vorlage Eingabemaske.xls" befindet (auch dieses funktioniert einwandfrei, wenn ich den vorherigen Versuch auskommentiere. Momentan sieht der Code in diesem Abschnitt so aus:

Dim strCode As String
Dim objButton As Shape
Dim vbC As Object
Dim iRow As Integer
Dim sCode As String
Set objButton = Workbooks(eing).Sheets(namges).Shapes("CommandButton1")
objButton.Copy
ActiveSheet.Paste
Set objButton = ActiveSheet.Shapes(1)
objButton.Top = Range("e4").Top
objButton.Left = Range("e4").Left
'Code für Button erstellen
ActiveSheet.OLEObjects(objButton.Name).Object.Caption = "Zahlen in die interne eintragen"
strCode = _
"Private Sub " & objButton.Name & "_Click()" & Chr(10) & _
"call import01" & Chr(10) & _
"End Sub"
With Workbooks(namges2).VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
.InsertLines .CountOfLines + 1, strCode                              'Hier steigt Excel aus
End With
With ThisWorkbook.VBProject.VBComponents("import01").CodeModule
sCode = .Lines(1, .CountOfLines)
End With
Set vbC = Workbooks(namges2).VBProject.VBComponents.Add(1)
vbC.CodeModule.deletelines 1, vbC.CodeModule.CountOfLines
vbC.CodeModule.AddFromString sCode


Nach dem Ausstieg von Excel habe ich duie Dateien mal wieder herstellen lassen, und siehe da, der Code steht im richtigen Tabellenblatt. Warum steigt Excel also bei der besagten Zeile aus?
Gruß
Peter R.

Anzeige
AW: leider habe ich keine Erklärung dafür,...
Tino
Hallo,
habe Deine Datei jetzt nicht nachgebaut und getestet.
Frage ist, ist ActiveSheet.CodeName auch die richtige Tabelle?
Versuche es mal so

Dim strCode As String
Dim objButton As Shape
Dim vbC As Object
Dim iRow As Integer
Dim sCode As String
Set objButton = Workbooks(eing).Sheets(namges).Shapes("CommandButton1")
objButton.Copy
ActiveSheet.Paste
Set objButton = ActiveSheet.Shapes(1)
objButton.Top = Range("e4").Top
objButton.Left = Range("e4").Left
'Code für Button erstellen
ActiveSheet.OLEObjects(objButton.Name).Object.Caption = "Zahlen in die interne eintragen"
strCode = _
"Private Sub " & objButton.Name & "_Click()" & Chr(10) & _
"call import01" & Chr(10) & _
"End Sub"
Workbooks(namges2).Activate
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
.InsertLines .CountOfLines + 1, strCode    'Hier steigt Excel aus
End With
With ThisWorkbook.VBProject.VBComponents("import01").CodeModule
sCode = .Lines(1, .CountOfLines)
End With
Set vbC = Workbooks(namges2).VBProject.VBComponents.Add(1)
vbC.CodeModule.deletelines 1, vbC.CodeModule.CountOfLines
vbC.CodeModule.AddFromString sCode


Gruß Tino

Anzeige
AW: leider habe ich keine Erklärung dafür,...
Peter
Hallöchen zusammen,
hab ein wenig rumgespielt und herausgefunden, dass es an dem Code liegt, der in strCode deklariert wird:

"Private Sub " & objButton.Name & "_Click()" & Chr(10) & _
"call import01" & Chr(10) & _
"End Sub"


Nehme ich anstatt der drei Zeilen nur text (z.B. "Hallo"), so funktioniert es.
Jemand ne Idee?
Gruß
Peter R.

kann keinen Fehler erkennen oT.
Tino
AW: kann keinen Fehler erkennen oT.
Peter
Ich auch nicht, genau das ist es ja, wo ich nicht mehr mitkomme!
vieleicht ein Datei
Tino
Hallo,
habe den kleinen Code mal nachgebaut, bekomme keinen Fehler.
Kannst Du die Datei hochladen? Vieleicht als zip sollte diese zu groß sein.
Inhalt kannst Du löschen, geht ja nur um den Code.
Gruß Tino
Anzeige
AW: vieleicht ein Datei
Peter
Hallo Tino,
geht leider nicht, da zuviele Blätter und Codes, die ich löschen müsste.
Aber habs nochmal genau verfolgt.
Er steigt erst bei dem End with - Befehl aus. ?
Gruß
Peter R.
AW: vieleicht ein Datei
Tino
Hallo,
habe mal etwas getestet.
Vertauschen die Reihenfolge, schreibe zuerst den Code für dass Modul und danach den für die Tabelle.
Bei mir hat dieser tausch funktioniert.
Gruß Tino
Ein Versuch ist es Wert :-)
Peter
Hallo Tino,
werde es morgen mal ausprobieren.
Wäre ja komisch, wenn es klappen würde.
Du meinst also zuerst den Code, der das Modul erzeugt, und danach den Code der für den Button erzeugt werden soll und danach den Rest ausführen lassen.
Gruß
Peter R.
AW: Ein Versuch ist es Wert :-)
Tino
Hallo,
ich habe den Code für die Tabelle ans ende gestellt, nach dem Code fürs Modul.
Warum das so ist, vielleicht ein Bug? Keine Ahnung.
Gruß Tino
AW: Ein Versuch ist es Wert :-)
Peter
Hallöchen Tino,
habs jetzt mal mit verschiedenen Schreibweisen ausprobiert, aber es funktioniert nicht!
Hab auch noch nen anderen Thread gefunden, wo genau das gleiche Problem vorherrscht, aber auch keine Lösung dazu:
https://www.herber.de/forum/archiv/876to880/t879620.htm
Sobald er an den End with Punkt kommt, steigt er aus!
Gruß
Peter R.
Ohne Beispieldatei kann ich nichts machen. oT.
Tino
hier mein Beispiel
Tino
Hallo,
hier die Version die bei mir funktioniert.
Datei OrgMappe.xls und Mappe2.xls müssen geöffnet sein,
Makro wird von OrgMappe aus von dem Button gestartet.
Bei mir kommt kein Fehler, getestet unter xl2003 und xl2007
https://www.herber.de/bbs/user/58331.zip
Gruß Tino
AW: hier mein Beispiel
Peter
Hallo Tino,
vielen dank für Deine Lösung.
Sie funktioniert Super.
War auch nochmal kreativ, da ich nirgendwo eine Lösung gefunden hatte.

With ThisWorkbook.VBProject.VBComponents("intimport01").CodeModule
sCode = .Lines(1, .CountOfLines)
End With
Set vbC = Workbooks(namges2).VBProject.VBComponents.Add(1)
vbC.CodeModule.DeleteLines 1, vbC.CodeModule.CountOfLines
vbC.CodeModule.AddFromString sCode
ActiveSheet.Buttons.Add(450, 100, 150, 50).Select
Selection.Caption = "Zahlen in die interne eintragen"
Selection.OnAction = "'" & namges2 & "'!import01"


Ich bin in dem obigen Beispiel nicht mehr über einen Commandbutton gegangen, sondern ein Button aus der Formularleiste und hab das kopierte Modul einfach als Makro zugewiesen.
Funktioniert auch.
Jetzt gibt es also zwei Lösungen!
Gruß
Peter R.

AW: hier mein Beispiel
Peter
Hallo Tino,
habs nochmal mit Deinem Code ausprobiert und kommt doch wieder Absturz, aber erst, sobald ich versuche die feste Dateinamenzuordnung durch variable zu ersetzen.
Da scheint das Problem zu sein.
Gruß
Peter R.

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige