Freigeben über

Makroprobleme wenn bei geöffneter Userform eine andere Datei geöffnet wird

Anonym
2022-12-12T18:27:38+00:00

Hallo allerseits

Es sind da zwei Dateien - Datei A enthält alle Daten und Datei B enthält alle Makros, die die Daten in Datei A behandeln. Das Problem

  • Datei A ist die aktive Datei, Userform X ist aktiv
  • User öffnet Datei Y via Desktop
  • User kehrt zu Userform X zurück und gibt weitere Daten ein.

In diesem Momment kommt es zu Errormeldungen bei Statements wie Range("abc")=1. Range("abc") ist in Datei A definiert.

Wie kann das abgefangen werden? Bei jedem Statement wie Range("abc")= zuerst Datei A aktivieren ist zwar möglich, aber sehr umständlich.

Microsoft 365 und Office | Excel | Für Zuhause | Andere

Gesperrte Frage. Diese Frage wurde aus der Microsoft-Support-Community migriert. Sie können darüber abstimmen, ob sie hilfreich ist, aber Sie können keine Kommentare oder Antworten hinzufügen oder der Frage folgen.

0 Kommentare Keine Kommentare
{count} Stimmen

4 Antworten

Sortieren nach: Am hilfreichsten
  1. Anonym
    2022-12-13T13:48:28+00:00

    Hallo Andreas

    im Normalfall sind zwei Dateien offen - eine mit allen Makros und eine mit den Daten. Soweit wie möglich befinden sich in den Tabellenblättern der Datendatei keine Makros.

    Ich habe nun eine Holzhammermethode eingebaut, die Fehler verhindert.

    Eine Schaltfläche in der Datendatei ruft die primäre Userform in der Makrodatei auf. Über diese primäre Userform werden dann alle anderen Bearbeitungsschritte ausgelöst. (Stand der Dinge.)

    Neu wird nun in der Sub UserForm_Initialize ein Flag in der Datendatei auf True gesetzt. Wird die UserForm geschlossen, wird die Flag auf False gesetzt.

    In der Datendatei ist nun die folgende Sub

    Private Sub Workbook_Deactivate()

    If flag = True Then

    '

    ' eine Userform ist aktiv

    ' x = MsgBox("Eine andere Datei wird geöffnet!" & vbLf & _ "Die aktive Maske wird geschlossen, allfällige Dateneingaben gehen verloren.", _

               *vbOKOnly + vbExclamation, "Wechsel")    flag = False    End End If*
    

    End Sub

    Wie gesagt, nicht optimal, aber es funkioniert.

    zu a) versuche ich nicht zu verwenden

    zu b) leider sind es wesentlich mehr als nur 4 Variable. Grosse Module habe ich bereits gesplittet und weiteres Splitting wird dann etwas unübersichtlich.

    Gruss

    Jürgen

    0 Kommentare Keine Kommentare
  2. Andreas Killer 144K Zuverlässigkeitspunkte Freiwilliger Moderator
    2022-12-13T04:50:43+00:00

    Bei jedem Statement wie Range("abc")= zuerst Datei A aktivieren ist zwar möglich, aber sehr umständlich. auch gesagt.

    Das Problem damit: leider existiert bei VBA scheinbar eine Grenze für Modulen bei 64 k.

    a) Keine gute Idee, denn das funktioniert nicht wirklich / bei Dir nur per Zufall. Bitte benutze niemals SELECT, SELECTION, ACTIVECELL, es ist langsam und fehleranfällig. Referenziere immer die Objekte.

    b) Das betrifft nur das Codemodul und wenn wir 4 Variablen definieren und diese den Tabellenblättern zuweisen ist das Problem nicht vorhanden.

    Außerdem läßt sich ein großes Modul relativ leicht splitten, man definiert globale Variablen und verschiebt einen Codeteil in ein anderes Modul.

    BTW, ein Range in einem regulären Modul bezieht sich immer auf die aktuelle Datei und das aktuelle Blatt, in dem Codemodul eines Blattes bezieht sich das Range immer auf das Blatt. Wenn man also die Routinen zum Speichern / Lesen / Organisieren der Daten in das Blatt verschiebt (und am besten eine Property aus den Sub/Function macht), dann ist das Range-Problem schon mal weg. Der Speicherbedarf reduziert sich und wenn man eine Schleife mit Feldnamen ausführt, dann muss man noch nicht mal großartig was umschreiben.

    Andreas.

    0 Kommentare Keine Kommentare
  3. Anonym
    2022-12-12T21:43:18+00:00

    Tach Claus

    Das habe ich ja mit Bei jedem Statement wie Range("abc")= zuerst Datei A aktivieren ist zwar möglich, aber sehr umständlich. auch gesagt. Das Problem damit: leider existiert bei VBA scheinbar eine Grenze für Modulen bei 64 k. Einige der vorhandenen Module kratzen aber an dieser Grenze. Es geht ja nicht nur um das Speichern von ein paar Werten, sondern um ein ganzes Sammelsurium von Daten in diversen Tabellenblättern der Datei A.

    Bei einer Funktion werden Daten aus 4 Tabellenblättern gleichzeitig verwendet. Es würde dann also so aussehen:

    With wshZiel
      .Sheets("Tabelle1").Range("dauer") = .Sheets("Tabelle2").Range("xyz")
      .Sheets("Tabelle3").Range("zeit") = .Sheets("Tabelle4").Range("abc")
    End With
    

    Mein Wunsch

      Range("dauer") = Range("xyz")
      Range("zeit") = Range("abc")
    

    Wobei dauer, xyz, zeit und abc benannte Zellen in den jeweiligen Tabellenblättern sind

    Meine Idee: wie kann ich verhindern, dass andere Dateien geöffnet werden, wenn eine Userform aktiv ist?

    0 Kommentare Keine Kommentare
  4. Anonym
    2022-12-12T21:08:26+00:00

    Hallo Jürgen,

    es ist immer besser korrekt zu referenzieren, erst recht, wenn mehrere Mappe gleichzeitig geöffnet sind.

    Probiere es z.B. so:

    Dim wshZiel As Workbook 
    
    Set wshZiel = Workbooks("Mappe1.xlsx") 
    
    With wshZiel.Sheets("Tabelle1") 
    
          .Range("A1") = 1 
    
          .Range("B2") = 2 
    
    End With
    

    Claus

    0 Kommentare Keine Kommentare