Microsoft Excel

Herbers Excel/VBA-Archiv

Case Select endet nicht bzw. endet im Laufzeitfehl

Betrifft: Case Select endet nicht bzw. endet im Laufzeitfehl von: Robert B.
Geschrieben am: 23.11.2014 00:59:32

Hallo zusammen,

ich habe in der Zelle Q56 ein Dropdown erstellt und daran einen Case Select gekoppelt. Wenn Case 1 selektiert wird sollen die Zellen "L58:N59" und "L59:N59" selektiert, gemerged und jeweils mit einem Text versehen werden. Es gehschieht zwar was ich mir vorstelle nur hört das Ganze nicht auf sich zu wiederholen und endet in einem Laufzeitfehler. Durch den Debugger sehe ich das die Zellen wie gewünscht selektiert und zusammengefügt werden sowie die Texte hinzugefügt werden, nur springt er dann vom End Sub wieder zum Ende Select und wieder zum End Sub dann zum Private Sub und dann zum ersten Range und durchläuft diesen immer wieder. Hier meine Frage: Warum?

Ich habe derzeit wenig Ahnung von VBA und wäre nett wenn mir einer eben helfen könnte da ich meines Wissens nach keine Schleife oder ähnliches eingebaut habe :o(

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Select Case Range("Q56")

    Case "1"
    Range("L58:N58").Select
    With Selection
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlCenter
    End With
    Selection.Merge
    ActiveCell.FormulaR1C1 = "Test 1"
                            
    Range("L59:N59").Select
    With Selection
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlCenter
    End With
    Selection.Merge
    ActiveCell.FormulaR1C1 = "Test 2"                         

End Select
End Sub

  

Betrifft: AW: Case Select endet nicht bzw. endet im Laufzeitfehl von: fcs
Geschrieben am: 23.11.2014 07:25:07

Hallo Robert,

du musst im Makro die Ereignismakros vorübergehend deaktivieren, damit durch das Eintragen des Formeltextes das Ereignismakro nicht erneut gestartet wird und so in eine Endlosschleife gerät.

Zusätzlich kann man das Makro etwas kompakter gestalten und auf die Zellselektion verzichten.

Gruß
Franz

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    Select Case Range("Q56")
    
        Case "1"
        Application.EnableEvents = False
        
        With Range("L58:N58")
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .Merge
            .Range("A1").FormulaR1C1 = "Test 1"
        End With
                                
        With Range("L59:N59")
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .Merge
            .Range("A1").FormulaR1C1 = "Test 2"
        End With
        
        Application.EnableEvents = True
    
    End Select
End Sub



  

Betrifft: AW: Case Select endet nicht bzw. endet im Laufzeitfehl von: Crazy Tom
Geschrieben am: 23.11.2014 07:28:21

Hallo Robert

so wie dein Code geschrieben ist läuft es selbstverständlich in eine Endlosschleife
weil das Sheetchange bei jeder Änderung im Tabellenblatt reagiert
in meinem Test habe ich die Änderung auf Zelle Q56 beschränkt

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Target.Address = "$Q$56" Then
        Select Case Range("Q56")
            Case "1"
            Range("L58:N58").Select
            With Selection
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
            End With
            Selection.Merge
            ActiveCell.FormulaR1C1 = "Test 1"
            Range("L59:N59").Select
            With Selection
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
            End With
            Selection.Merge
            ActiveCell.FormulaR1C1 = "Test 2"
        End Select
    End If
End Sub

MfG Tom


  

Betrifft: AW: Case Select endet nicht bzw. endet im Laufzeitfehl von: Tino
Geschrieben am: 23.11.2014 07:38:18

Hallo,
weil sich der Code durchs schreiben der Formel selbst immer wieder aufruft.

In Target sind die geänderten Zellen enthalten, also müsstest Du dies auch abfragen.
Zudem mit Application.EnableEvents = False/True die Events abstellen,
damit der Code nicht erneut aufgerufen wird.
Mit Select muss man auch so gut wie nie arbeiten,
macht den Code langsam und das gehüpfe in der Tabelle ist auch nicht schön.
Der Code steht in DieserArbeitsmappe und da wird er auf jeder Tabelle aufgerufen.
Wenn dies nicht gewollt ist, gibt es auf der Tabelle auch ein Worksheet_Change.


z.Bsp. so.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

If Intersect(Range("Q56"), Target) Is Nothing Then Exit Sub

Application.EnableEvents = False
Select Case Range("Q56")
    Case "1"
        With Range("L58:N58")
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .Merge
            .Cells(1, 1).FormulaR1C1 = "Test 1"
        End With

        With Range("L59:N59")
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .Merge
            .Cells(1, 1).FormulaR1C1 = "Test 2"
        End With
End Select
Application.EnableEvents = True

End Sub
Gruß Tino


  

Betrifft: Fazit aller Verbesserungsversuche von: Luc:-?
Geschrieben am: 23.11.2014 13:09:57

Mahlzeit, Leute!
1. Die PrimärVerbesserungen sind im Prinzip Ok.
2. Adressen und andere Werte, die angepasst wdn müssen oder sich ändern können, legt man zum Zwecke leichterer Aktualisierbarkeit als Konstanten oder noch besser über Namen (definierte Bereichsnamen oder Konstanten) fest.
3. Warum wurde der Eintrag eines Trivial-Textes als (Z1S1-)Fml belassen? Das geht zwar, ist aber Quatsch, wenn es sich dabei nicht um eine Fml (in US-Original-Z1S1-Notation) handelt! Da der FrageSteller nur über bescheidene VBA-Kenntnisse verfügt, wird er so doch versucht sein, diese Schreibung (mit Makro-Recorder-Bezug) immer zu verwenden.
Gruß + schöSo, Luc :-?


  

Betrifft: zu 3. "Test" wird wohl nicht stehen bleiben... von: Tino
Geschrieben am: 23.11.2014 14:39:11

Hallo,
aber durch was könnte es ersetzt werden?

Vieleicht eine Formel oder auch ein anderer Text der mit dem Rekorder aufgezeichnet wird.
Der Rekorder zeichnet nach meinem Wissensstand im Z1S1 (R1C1) Bezug auf und
damit ist man mit FormulaR1C1 auf der sicheren Seite egal was rein kommt.

Gruß Tino


  

Betrifft: Das wdn wir wohl NIE erfahren! :-| Gruß owT von: Luc:-?
Geschrieben am: 24.11.2014 17:52:46

:-?


 

Beiträge aus den Excel-Beispielen zum Thema "Case Select endet nicht bzw. endet im Laufzeitfehl"