Clever-Excel-Forum

Normale Version: Excel Makro geht immer sehr lange in "Keine Rückmeldung"
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
[attachment=47047]

Hallo liebe Gemeinde,

ich habe mir eine Tabelle gebaut, welches 2 Print-Seiten zum ausdrucken enthält. Eine Konfiguration für die MBE und eine Konfiguration für die DDC. Nicht jede Zeile ist für jede Konfiguration notwendig, so gibt es ein Sheet PropertyList, wo in 2 Spalten mittel einem "x" die benötigten Zeilen eingeblendet werden. Zeilen, die kein Kreuz enthalten, werden ausgeblendet.

Mein Problem ist jetzt, dass wenn ich ein oder mehrere Kreuze setze oder lösche, der Wartekreisel kommt und die Tabelle auf "Keine Rückmeldung" geht. Habt Ihr eine Idee, wo mein Fehler liegen könnte?

Code in Module:
Code:
Option Explicit


Sub ZeilenAusblenen()
'In diesem Programm sollen Zeilen ausgeblendet werden, wenn ein x als Bedingung erfüült ist

Dim i, j As Integer
i = 5
j = 5

Application.ScreenUpdating = False

For i = 5 To 472
If Worksheets("PropertyList").Cells(i, 1).Value = "" Then
    Worksheets("Print_MBE").Rows(i + 6).Hidden = True
        Else
            Worksheets("Print_MBE").Rows(i + 6).Hidden = False
End If
Next i

For j = 5 To 472
If Worksheets("PropertyList").Cells(j, 2).Value = "" Then
    Worksheets("Print_DDC").Rows(j + 6).Hidden = True
        Else
            Worksheets("Print_DDC").Rows(j + 6).Hidden = False
End If
Next j

Application.ScreenUpdating = True
'Range("").Select



End Sub

Code in der Tabelle PropertyList
Code:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Application.Intersect(Target, Range("A5:A500")) Is Nothing Then
ZeilenAusblenen
End If

If Not Application.Intersect(Target, Range("B5:B500")) Is Nothing Then
ZeilenAusblenen
End If

End Sub

Vielen Dank für Eure Ideen
Andreas
Bei jedem Eintrag prüfst du ALLE Zellen im Bereich A5:B472 auf ihren Inhalt und veranlasst Änderungen. 
Über das Change-Ereignis weißt du aber doch, welche Zelle(n) geändert wurde(n). Du brauchst doch ausschließlich diese zu prüfen und entsprechend ein- oder ausblenden. 

Optional kannst du noch versuchen, Berechnungen während des Ablauf der Prozedur ZeilenAusblenen auf "manuell" zu stellen und danach wieder auf den vorher eingestellten Wert.
Hi,

wenn ich versuche den Problem nachzustellen, läuft dein Programm im Bruchteil einer Sekunde durch. Daran liegt es also nicht. Allerdings muss ich EarlFred recht geben, dass es völlig überflüssig ist alle Zeilen durchzugehen. von daher könnte man hier locker Zeit einsparen.

Um die eigentlich Ursache zu finden: stell doch bitte mal eine Beispieldatei hier ein, bei der das Phänomen auftritt.
Hallo zusammen,

vielen Dank für Eure Informationen. Da ich noch auf meinen ersten Metern mit VBA bin, sind bei mir noch ein paar Verständnisprobleme aufgetreten.
Zu Anfang hat die Tabelle bei mir auch schneller funktioniert. Kollegen hatten mir berichtet, dass sie Abstürze hatten. Nachdem ich ein paar Formatierungen im Printbereich gemacht habe, kam das Problem reproduzierbar bei mir auf.

Meine Tabelle habe ich hier: [attachment=47055]

Habe ich EarlFred richtig verstanden, es wäre besser das Change-Ereignis ins Modul zu verschieben und die Prüfung der einzelnen Zellen zu unterlassen?

Viele Grüße
Andreas
(14.02.2023, 11:18)Candalfo schrieb: [ -> ]Habe ich EarlFred richtig verstanden, es wäre besser das Change-Ereignis ins Modul zu verschieben und die Prüfung der einzelnen Zellen zu unterlassen?
Irgendwelche Prozeduren wahllos irgendwohin zu verschieben hat EarlFred garantiert nicht gesagt und noch garantierter nicht gemeint. 

Was er gesagt und gemeint hat: Prüfe nur die Zellen, die du auch wirklich geändert hast. Wenn du A3 änderst, musst du nicht prüfen, was in A9 steht - das ist ja nicht geändert, muss also nicht bearbeitet werden. 

In die Mappe habe ich noch nicht geschaut, dafür fehlt mir die Zeit, muss los.
Hi,

du musst einfach lange genug warten, dann meldet sich Excel zurück. Das liegt daran, dass du jede Zeile einzeln ausblendest. Das dauert einfach.

Um es zu beschleunigen, solltest du EralFreds Vorschlag umsetzen.

Wenn ich es programmieren müsste, würde ich es so machen:
Code:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zelle As Range
Dim Bereich As Range
Set Bereich = Intersect(Target, Range("A5:B500"))
If Not Bereich Is Nothing Then
    For Each Zelle In Bereich
        Worksheets("Print_" & IIf(Zelle.Column = 1, "MBE", "DDC")).Rows(Zelle.Row + 6).Hidden = Zelle = ""
    Next Zelle
End If
End Sub
Dieser Code gehört ins Codemodul von PropertyList.
(14.02.2023, 12:02)HKindler schrieb: [ -> ]Wenn ich es programmieren müsste, würde ich es so machen:
Endlich jemand, der nicht den kompletten Code abbricht, wenn mehr als eine Zelle geändert wird. Danke dafür!
Irgendwelche Prozeduren wahllos irgendwohin zu verschieben hat EarlFred garantiert nicht gesagt und noch garantierter nicht gemeint. 
--> ...ich würde es als "hilflos" bezeichnen, aber wie schon gesagt...aller Anfang ist schwer Smile

Was er gesagt und gemeint hat: Prüfe nur die Zellen, die du auch wirklich geändert hast. Wenn du A3 änderst, musst du nicht prüfen, was in A9 steht - das ist ja nicht geändert, muss also nicht bearbeitet werden. 
--> Soweit ich das Change-Ereignis verstanden habe, gibt es mir aber keinen Wert zurück. Woher weiß ich denn, welche Zelle von den 2x 400 sich geändert hat? Wenn ich diesen Wert hätte, könnte ich mir vorstellen, über die Zeilenadresse die Zeile auszublenden. Allerdings wäre ich hier wieder bei der selben IF-Anweisung.
Hallöchen,

ein anderer hätte sich für die Unterstützung bedankt statt Helfer als hilflos zu bezeichnen ... 20
Hi,


Zitat:Soweit ich das Change-Ereignis verstanden habe


Du hast es eher nicht verstanden:

worksheet-change-ereignis
Seiten: 1 2