Excel-Makros immer in einer Datei laufen lasse

Hallo,

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.

Danke und Guß
Frank

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?

Gruß
Reinhard

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:

statt: wert = cells(1, 2).value
das: wert = workbooks(„a.xls“).worksheets(„a“).cells(1, 2).value

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

Hallo Jens,

Danke für die schnelle Antwort :smile:
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?

Problem nun halbswegs erklärt?
Gruß Frank

Hallo Reinhard,

Danke für die schnelle Antwort :smile:
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.

Problem nun halbswegs erklärt?
Gruß Frank

Hallo Frank,

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.

Gruß
Reinhard

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

Gruß
Frank

Hallo Frank,

Pivotabelle sagt mir noch gar nichts,

kann man erlernen.

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

Gruß
Reinhard

Hallo Frank

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.

VG
Carsten

Hallo Carsten,

perfekt!

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 :smile:
Gruß
Frank

Hallo Reinhard,

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 !

Gruß
Frank

Hallo frank,

ja, ich hätte eine Menge Fragen.

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

Das Wichtige dabei ist der Punkt vor Range.

Gruß
Reinhard