ich habe eine Excel-Datei mit vielen Makros, die einwandfrei funktionieren. Öffnet man zusätzlich eine zweite oder weitere Excel-Dateien, funktionieren diese Makros nicht mehr. Wie kann ich sicherstellen, das die Makros immer in der einen Datei ablaufen. Es soll dabei egal sein, ich welcher Reihenfolge die Dateien geöffnet werden.
ich habe eine Excel-Datei mit vielen Makros, die einwandfrei
funktionieren. Öffnet man zusätzlich eine zweite oder weitere
Excel-Dateien, funktionieren diese Makros nicht mehr. Wie kann
ich sicherstellen, das die Makros immer in der einen Datei
ablaufen. Es soll dabei egal sein, ich welcher Reihenfolge die
Dateien geöffnet werden.
Hallo Frank,
ich wüßte jetzt nicht warum meine Makros in meiner Mappe nicht laufen sollten wenn da keine oder mehrere andere Mappen in der gleichen ExcelInstanz geöffnet sind.
Zeig mal so Makros. Was genau bedeutet "Nicht laufen?
Haben die anderen mappen die evtl. Makros haben die beim Öffnen starten?
schaff mal ein wenig klarheit, denn genaugenommen laufen die makros IMMER nur in einer datei.
vermutlich willst du aber, dass du z.b. in tabelle a immer nur in der spalte xyz nach etwas suchst. öffnest du tabelle b, dann läuft der code nicht mehr durch. richtig?
dann liegt dein problem darin, dass der code so geschrieben ist, dass er immer auf das workbook und die tabelle im vordergrund zugreift.
du hast zwei möglichkeiten:
entweder arbeitest du mit activate - also z.b. so:
workbooks(„a.xls“).worksheets(„a“).activate
das legt dir das workbook und die tabelle in den vordergrund und darauf wird gearbeitet.
alternative du greifst immer mit dem vollen befehl auf ein spezielles workbook zu. z.b. so:
gleiches mit allen zugriffen, also row, column, range…
den workbooknamen und den des worksheets kann man natürlich auch per string übergeben und dann die makros je nach gegebenheit unterschiedlich nutzen. geht in beiden fällen
Danke für die schnelle Antwort
es geht um eine Kalkulationsdatei (ca. 700 Zeilen) um Artikel für ausgerüstete Schaltschränke einzutragen und natürlich den Gesamtpreis zu ermitteln.
Die Datei ist mit „Daten: Gruppierung und Gliederung“ versehen und die Makros sortieren z.B. innerhalb einer Gruppierung nach Namen, Artikelnummern, doppelten Einträgen, nur Einträge mit Stk. > 0, usw. Die Datei wächst ständig, sodaß ich diese Bezüge immer neu erstelle (do while Schleifen).
Mit dieser „Kalk-Datei“ lese ich auch ältere Kalkulationen ein, um die Artikel „neu zu bepreisen“. Das geht alles wunderbar, solange eben keine weitere Excel-Datei geöffnet ist.
Ein Teilproblem habe ich schon erkannt. Ich arbeite mit „ActiveWindow.WindowState = xlMinimized“ am Anfang jedes Makros, um Zeit zu sparen und nicht jeden einzelnen Schritt auf dem Monitor zu bringen. Aber genau das ist das Problem, da er dann auf eine andere Tabelle zugreift und mit „debuggen“ aussteigt. Ohne „Minimized“ läuft es tatsächlich mit mehreren Dateien, aber die Optik stört mich einfach (jeder Makroschritt ist ersichtlich)
Du liegts schon richtig, variable workbooks wären möglich, aber z.B. =ZELLE(„Dateiname“) geht nicht, der wechselt auch. Wie geht das mit String Übergabe?
Danke für die schnelle Antwort
es geht um eine Kalkulationsdatei (ca. 700 Zeilen) um Artikel für ausgerüstete Schaltschränke einzutragen und natürlich den Gesamtpreis zu ermitteln.
Die Datei ist mit „Daten: Gruppierung und Gliederung“ versehen und die Makros sortieren z.B. innerhalb einer Gruppierung nach Namen, Artikelnummern, doppelten Einträgen, nur Einträge mit Stk. > 0, usw. Die Datei wächst ständig, sodaß ich diese Bezüge immer neu erstelle (do while Schleifen).
Mit dieser „Kalk-Datei“ lese ich auch ältere Kalkulationen ein, um die Artikel „neu zu bepreisen“. Das geht alles wunderbar, solange eben keine weitere Excel-Datei geöffnet ist.
Ein Teilproblem habe ich schon erkannt. Ich arbeite mit „ActiveWindow.WindowState = xlMinimized“ am Anfang jedes Makros, um Zeit zu sparen und nicht jeden einzelnen Schritt auf dem Monitor zu bringen. Aber genau das ist das Problem, da er dann auf eine andere Tabelle zugreift und mit „debuggen“ aussteigt. Ohne „Minimized“ läuft es tatsächlich mit mehreren Dateien, aber die Optik stört mich einfach (jeder Makroschritt ist ersichtlich)
Nein, die anderen Tabellen haben keine Makros, dienen lediglich als „copy - paste“ für die Kalk-Datei.
Die Datei ist mit „Daten: Gruppierung und Gliederung“ versehen
und die Makros sortieren z.B. innerhalb einer Gruppierung nach
Namen, Artikelnummern, doppelten Einträgen, nur Einträge mit
Stk. > 0, usw. Die Datei wächst ständig, sodaß ich diese
Bezüge immer neu erstelle (do while Schleifen).
vielleicht wäre eine Pivotabelle was für dich?
Ein Teilproblem habe ich schon erkannt. Ich arbeite mit
„ActiveWindow.WindowState = xlMinimized“ am Anfang jedes
Makros, um Zeit zu sparen und nicht jeden einzelnen Schritt
auf dem Monitor zu bringen. Aber genau das ist das Problem, da
er dann auf eine andere Tabelle zugreift und mit „debuggen“
aussteigt. Ohne „Minimized“ läuft es tatsächlich mit mehreren
Dateien, aber die Optik stört mich einfach (jeder Makroschritt
ist ersichtlich)
Alles mit Active* ist grundsätzlich gefährlich.
Klar referenziert beseitigt die Gefährlichkeit.
Also nochmals, zeige den Code oder besser noch die Mappe hochladen mit file-upload, s. FAQ:2606
Anonymisiere sie bei Bedarf, geht binnen Minuten.
Schreib bei Artikelbezeichnung „Artikel1“ in die oberste Zelle, dann „zieh“ die rechte untere Ecke dieser Zelle nach unten.
Schon sind ide Artikelbezeichnungen anonymisiert.
Also können da Preise, bestand usw. stehen bleiben, weiß ja keiner um was es sich handelt.
Für das Problem unwichtige Spalten leerst du.
Wichtig ist nur, daß die tabellenstruktur, also die Spaltenüberschriften bestehen bleiben.
Pivotabelle sagt mir noch gar nichts, ich programmieren zwar SPS-Steuerungen, aber Excel habe ich mir bisher selber beigebracht. Anbei die Datei, mir geht es primär um die Makros „Artikel_0“ und „Artikel_alle“ (die beiden buttons rechts). Den Rest kann ich dann selber anpassen.
Bedienung: beliebige Untergruppe links aufklappen, beliebige Artikel mit Stüchzahl >0 (Spalte J) auswählen. Nun button „Artikel>0“ betätigen. Danach „Artikel_alle“ anwählen, um zB weitere Artikel hinzuzufügen.
es gibt ein Auto_open Start-Makro http://www.fileuploadx.de/723329
Anbei die Datei, mir geht es primär um die Makros
„Artikel_0“ und „Artikel_alle“ (die beiden buttons rechts).
Den Rest kann ich dann selber anpassen.
Bedienung: beliebige Untergruppe links aufklappen, beliebige
Artikel mit Stüchzahl >0 (Spalte J) auswählen. Nun button
„Artikel>0“ betätigen. Danach „Artikel_alle“ anwählen, um zB
weitere Artikel hinzuzufügen.
es gibt ein Auto_open Start-Makro http://www.fileuploadx.de/723329
Du hast da 51 Module, davon 46 Standardmodule in denen aber nur in 7 Standardmodulen überhaupt etwas drinsteht.
Lösche die „leeren“, kopiere also nachfolgenden Code in Modul1, stell dich in den Code und drück F5.
Wie auch schon von Jens gesagt mußt du all deine Codes genauer oder überhaupt referenzieren.
Hast du dazu Fragen?
Gruß
Reinhard
Sub alle\_Makros\_loeschen()
Dim x, a, t
With ThisWorkbook.VBProject
MsgBox .VBComponents.Count
For x = .VBComponents.Count To 1 Step -1
t = .VBComponents(x).Type
a = .VBComponents(x).CodeModule.CountOfLines
If t = 1 And a
Anbei die Datei, mir geht es primär um die Makros
„Artikel_0“ und „Artikel_alle“ (die beiden buttons rechts).
Hallo Frank,
schreibe in alle Module zuoberst Option Explicit.
so in etwa könnten die beiden aussehen:
Option Explicit
Sub Artikel\_alle()
Dim Zeile As Long
Zeile = 1
With Worksheets("Röckle")
Do
Zeile = Zeile + 1
Loop While .Cells(Zeile, "A") "Gesamt"
Ende = Zeile - 1
.Rows("1:" & Zeile - 1).EntireRow.Hidden = False
Cells(1, "A").Select
Call Bedingt\_1
.Rows("1:" & Zeile - 1).AutoFilter Field:=10
End With
End Sub
Sub Artikel\_0()
Dim Zeile As Long
Zeile = 1
With Worksheets("Röckle")
Do
Zeile = Zeile + 1
If .Cells(Zeile, "A") = "----" Then .Cells(Zeile, "C") = 0
Loop While .Cells(Zeile, "A") "Gesamt"
With .Rows("1:" & Zeile - 1)
.EntireRow.Hidden = False
.AutoFilter Field:=10, Criteria1:="\>0", Operator:=xlAnd
End With
.Cells(1, "A").Select
Call Bedingt\_0
End With
End Sub
Ein Teilproblem habe ich schon erkannt. Ich arbeite mit
„ActiveWindow.WindowState = xlMinimized“ am Anfang jedes
Makros, um Zeit zu sparen und nicht jeden einzelnen Schritt
auf dem Monitor zu bringen. Aber genau das ist das Problem, da
er dann auf eine andere Tabelle zugreift und mit „debuggen“
aussteigt. Ohne „Minimized“ läuft es tatsächlich mit mehreren
Dateien, aber die Optik stört mich einfach (jeder Makroschritt
ist ersichtlich)
Mit etwas Glück läßt sich dieses Problem beheben, wenn Du nicht den WindowState verwendest, sondern an der richtigen Stelle ein „Application.ScreenUpdating = False“ einfügst. Natürlich mußt Du das auch irgendwann wieder auf „True“ setzen, aber das ist ja für Dich als SPSler sowieso logisch.
Mir ist nicht bekannt, ob das Ganze „dateiübergreifend“ funktioniert.
vielen Dank, das ist die aus meiner Sicht einfachste Lösung. Tatsächlich funktioniert es auch wenn zusätzliche Dateien geöffnet sind.
Wieder etwas dazugelernt
Gruß
Frank
ja, ich hätte eine Menge Fragen. Die leeren Module habe ich erst mal von Hand gelöscht und Carsten hat eine super Lösung gefunden, die meinen Ansprüchen völlig genügt. Danke für Deine Hilfe !
ist mir klar, aber wenn du die beiden Prozeduren die ich dir angepasst habe mit den Originalen vergleichst und versuchst zu verstewhen was ich da gemacht habe, so könntest du analog dazu deine anderen prozeduren auch verbessern.
Undsdann gezielt fragen.
Die leeren Module habe ich
erst mal von Hand gelöscht
Wozu habe ich dir dann den Code gebastelt?
und Carsten hat eine super Lösung
gefunden, die meinen Ansprüchen völlig genügt.
Ja, auch Carsten weist auf fehlende genaue Referenzierung hin.
Gewöhne dir eine genauere Referenzierung gleich an, du machst es dir dadurch für alle späteren Codierungen viel leichter.
Schreib also nicht
Range(„A1“).value=67
sondern
with Worksheets(„Tabelle7“)
.Range(„A1“).value=67
oder wenn verschiedene Mappen offen sein KÖNNTEN
with Workbooks(„meinemappe.xls“).Worksheets(„Tabelle7“)
.Range(„A1“).value=67