Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Makro verursacht Endlosberechnung, Arbeitsmappe hängt sich auf
#1
Hallo liebe Community,

in meinem Code oder Vorgehen steckt der Wurm und löst eine Endlosberechnung aus. Ich tue mich sehr schwer den Fehler zu finden, weil ich schon probiert habe alle möglichen Codezeilen zu deaktivieren:

Code:
Public Sub KonfigLaden()

Dim MyFile As Variant
Dim Ticker As Range

Application.EnableEvents = False
Worksheets("Start").Unprotect Password:="x"
 
   ' "Excel (*.xls), *.xls" beschränkt die Dateiauswahl auf XLS Dateien
   MyFile = Application.GetOpenFilename("Excel *.xlsm (*.xlsm), *.xlsm")
   'Bildschirmaktualisierung aus
   'Application.ScreenUpdating = False
   
       If Not MyFile = False Then
       Workbooks.Open (MyFile)
       Else
       Exit Sub
       End If
   
   Application.EnableEvents = False
   Worksheets(1).Activate
   Worksheets("Start").Unprotect Password:="x"
   ActiveSheet.Columns.Hidden = False
       
   'Range("L3:S10").Copy
   'ThisWorkbook.Worksheets("Start").Range("L3").PasteSpecial Paste:=xlValues 'xlPasteValues
   'Range("K16").Copy
   'ThisWorkbook.Worksheets("Start").Range("K16").PasteSpecial xlPasteValues
   'Range("L25:L32").Copy
   'ThisWorkbook.Worksheets("Start").Range("L25").PasteSpecial xlPasteValues
   'Range("A100:Q1000").Copy
   'ThisWorkbook.Worksheets("Start").Range("A100").PasteSpecial xlPasteValues
       
   ' Speichert nicht und schließt die geöffnete Datei, DisplayAlerts deaktiviert kurzzeitig die Nachfrage nach Speichern
   Application.DisplayAlerts = False
   ActiveWorkbook.Close SaveChanges:=False
   
   
   ' Springt wieder zu EK-Datum-Feld
   Worksheets(1).Activate
   Range("C14").Select
   
   ' Entfernt den Selektionsrahmen
   Application.CutCopyMode = False
   
   ' Bildschirmaktualisierung ein
   Application.ScreenUpdating = True

   Worksheets("Start").Protect Password:="x", UserInterFaceOnly:=True
   Application.DisplayAlerts = True
End Sub

Dieser Code steht in Modul1. Wenn ich den Code durchgehe mit F8 löst es _meistens_ keine Endlosberechnung aus. Sobald ich das Makro über eine Userform starte, ist irgendwo ab workbooks.open irgendwo Schluss und es geht nichts mehr aus Task beenden. Ich bin ratlos und weiß auch nicht was ich euch erklären kann.
In Sheet1 habe ich ein worksheet_change Ereignis:
Code:
' Worksheet_Change Anweisung muss in diesem Tabellenblatt stehen, sonst führt es sich nicht bei Zelländerung aus
Private Sub Worksheet_Change(ByVal target As Range)
   ' Haken2 = Teilnehmer-Kontrolle
   If target.Address = "$H$13" Or target.Address = "$H$14" Or target.Address = "$H$15" Or target.Address = "$H$16" Or target.Address = "$H$17" Or target.Address = "$H$18" Or target.Address = "$H$19" Then
       Call Haken2
   End If
   ' Haken3 = EK-Daten-Kontrolle
   If target.Address = "$C$14" Or target.Address = "$C$15" Or target.Address = "$C$16" Then
   ' Hier stand mal:target.Address = "$C$13" Or
       Call Haken3
       Call ReFormatierung
   End If
   If target.Address = "$T$3" Then
       Call Haken4
   End If
   End Sub

Anfangs dachte ich die Endlosberechnung wird aufgrund der CopyPaste-Zeilen im obigen Code ausgelöst. Die habe ich nun alle deaktiviert und das Problem taucht weiterhin auf. Es ist zum heulen.
Hat jemand eine Idee? Ein Impuls?

Grüße und Danke
Martin
Antworten Top
#2
Ich bin nun um einen Punkt schlauer.

Ich versuche den Range von L3:S10 zu kopieren und einzufügen.
In der Spalte R befinden sich Adresse mit Zeilenumbrüchen (diese Adressen kommen aus einer Userform mit Textboxen und WordWrap = True.

Nach etlichem Probieren weiß ich nun, dass das Kopieren funktioniert, solange ich xlcalulationmanual = false setze. Wenn ich am Ende des Makros das auf xlcalculationautomatic setze, dann beginnt die Endlosberechnung und die Mappe wird unbedienbar, hängt sich auf.

Ich versuchte mir Abhilfe mit folgendem zu schaffen:
Code:
   Range("L3:R10").Copy
   With ThisWorkbook.Worksheets("Start").Range("L3")
   .PasteSpecial xlPasteValues
   .PasteSpecial xlPasteFormats
   End With
Leider ohne Erfolg. Ich dachte, ich könnte das Format mitkopieren. Jemand eine Idee?

Danke und Gruß
Martin
Antworten Top
#3
Hallo,

ich hab das mal überflogen und glaube, deine Endlosschleife hat nix unmittelbar mit dem Copy & Pasta zu tun. Vielmehr halte ich die Routine, die auf Veränderungen im Arbeitsblatt reagiert für den Übelltäter. Ich hab zwar gesehen, das du irgendwo die Events abschaltest, aber wo werden die wieder eingeschaltet?? Ich empfehle, die Events am Anfang von

Private Sub Worksheet_Change(ByVal target As Range)

abzuschalten und am Ende wieder einzuschalten (und nirgends sonst).

vg, MM
Antworten Top
#4
Danke dir. Die Events und die Calculation schalte ich am Ende des Makros wieder ein. Das fehlt im Code hier.

Das Problem reduziert sich auf die Zweizeiligkeit der Felder in Spalte R.
Ich habe alle Adressen auf einzeilig gekürzt und das Problem taucht nicht auf. Mit zweizeiligen Adressen tritt es auf.
Folglich bin ich am Ende meines Lateins.
Könnte ich mit einem Replace-Mechanismus das Zeichen kurz gegen einen Platzhalter ersetzen den ich danach wieder gegen einen Zeilenumbruch ersetzen kann?
Antworten Top
#5
Hi,

das zweite Makro würde ich so formulieren:


Code:
Private Sub Worksheet_Change(ByVal target As Range)
   ' Haken2 = Teilnehmer-Kontrolle
   If Not Intersect(target, Range("H12:H18")) Is Nothing Then Haken2
   
   ' Haken3 = EK-Daten-Kontrolle
   If Not Intersect(target, Range("C14:C16")) Is Nothing Then
   ' Hier stand mal:target.Address = "$C$13" Or
       Haken3
       ReFormatierung
   End If
   If target.Address = "$T$3" Then
     Haken4
   End If
   End Sub


Ansonsten solltest Du Dir im Klaren darüber sein, dass beim Öffnen der neuen Datei diese automatisch aktiv ist und Dein Makro diese nicht richtig anspricht! Der Fehler liegt also daran, dass Du nicht richtig referenzierst!
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Antworten Top
#6
Hallo Edgar,

danke für deine Antwort. Dein Versuch mit Intersect muss ich leider abweisen. Dieser hat nicht meine Makros (Haken1, etc.) ausgelöst. Ansonsten sind die Referenzen beabsichtigt, also das Makro tut schon das was es soll, zumindest wenn ich es mit F8 durchgehe.

Mit Replace habe ich die Zeichen chr(10) und chr(13) mit % und $ ersetzt und die Testzelle R3 (die mit zweizeiliger Adresse) kopiert und eingefügt. Siehe da, wenn der Zeilenumbruch getauscht ist funktioniert das Makro ohne Probleme. Tausche ich % und $ gegen chr(10) oder chr(13) zurück (um Zweizeiligkeit herzustellen), dann stürzt das Makro spätestens beim Einschalten von enableevents und calculationautomatic wieder ab.
Es ist zum Verrücktwerden.


Startet das Change-Ereignis immer, auch wenn ich ganz andere Zellen als die mit target.adress definierten Zellen wähle???

Ein über jede Antwort dankbarer Martin sagt schönen Sonntagabend.

Grüße
Martin  :15:
Antworten Top
#7
Hallo zusammen,

neuer Tag, neues Glück.
Ich meine den Fehler noch besser eingekreist zu haben. Und zwar:
Zelle R3 ist mit einer Textbox aus einer UserForm verknüpft. Ich kann meine zweizeilige Zelle kopieren und einfügen ohne Probleme, wenn ich mir eine Zelle aussuche die nichts mit meiner Userform zu tun hat.
Sobald ich eine Zelle befülle die etwas mit meiner Userform zu tun hat, dann schmiert Excel bei zweizeiligen Zellen ab.

Jetzt, mit diesem Wissen, hat jemand eine Idee wie ich vorgehen kann?
Aktuell probiere ich über Variablen die Adresse direkt in die Textbox zu transferieren, kriege es aber bisher nicht hin.

Grüße
Martin
Antworten Top
#8
Ich habe das Makro nun auf ein Minimum gekürzt um die elementaren Vorgänge zu prüfen.
Dabei ist etwas nicht nachvollziehbares aufgetreten:

Code:
Public Sub KonfigLaden2()
Dim myfile As Variant
Dim Adresse1 As String

  myfile = Application.GetOpenFilename("Excel (*.xlsm; *.xlsx; *.xls), *.xlsm; *.xlsx; *.xls")
  If Not myfile = False Then
       Workbooks.Open (myfile)
  Else
       Exit Sub
  End If
   
   Adresse1 = Range("R3")
   
   ThisWorkbook.Worksheets("Start").Range("R3") = Adresse1
   
   Application.DisplayAlerts = False
   ActiveWorkbook.Close SaveChanges:=False
 
End Sub

Setze ich an das Ende des Codes eine MsgBox:
Code:
MsgBox "Import der Einstellung fertig."
Tritt mein Problem auf, d.h. die Arbeitsmappe hängt sich in einer Endlosberechnung auf.
Eine MsgBox ist die Ursache meines Problems?  Huh
Das kann es doch nicht sein, was übersehe ich?
Antworten Top
#9
Wo bleibt die Beispieldatei ?
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#10
Hallo,

danke. Ich stelle meine Beispieldatei zur Verfügung.
Arbeitsmappe A
Arbeitsmappe B

Situation:
In A soll über Einstellungen "Konfiguration importieren" die Arbeitsmappe B gewählt werden und die Adressen importiert werden.


Die beiden Dateien sind tendenziell identisch. Die Idee ist, wenn eine neue "Version" des Tools zur Verfügung steht, kann man über Import die alten Adressdaten, etc. importieren, damit diese nicht neu eingegeben werden müssen.

Aktuell habe ich einen loopcount im Worksheet_Change drin, damit dieser anschlägt, falls im Hintergrund 500 change Ereignisse durchlaufen.

Ich bitte euch den Fall zu prüfen! Tausend Dank.

Arbeitsmappe A:


Arbeitsmappe B:  Dateien bitte im Forum hochladen: https://www.clever-excel-forum.de/thread-326.html



Grüße
Martin
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste