none
Acc 2010 mehr als 3 bedingte Formatierungen per VBA

    Frage

  • Hallo,

    ich versuche gerade in einem Formular bedingte Formatierungen bestimmten Textfeldern zuzuweisen. Bei der 4. Regel erhalte ich einen Fehler. Die Recherche im Internet weist auf ein generelles Problem hin. Daraus entnehme ich das man in der Version 2010 zwar per GUI mehr als 3 Bedingungen einstellen kann, per VBA jedoch nicht.

    Gibt es Abhilfe, bzw. wie kann ich das lösen?

    Michael


    Sonntag, 21. April 2013 12:52

Alle Antworten

  • Hallo,

    ich versuche gerade in einem Formular bedingte Formatierungen bestimmten Textfeldern zuzuweisen. Bei der 4. Regel erhalte ich einen Fehler. Die Recherche im Internet weist auf ein generelles Problem hin. Daraus entnehme ich das man in der Version 2010 zwar per GUI mehr als 3 Bedingungen einstellen kann, per VBA jedoch nicht.

    Negativ, das geht per VBA genauso, <ControlName>.FormatConditions.Add.

    Zeig mal deinen Code.

    Gruss - Peter

    Sonntag, 21. April 2013 22:32
    Moderator
  • Hallo,

    hab ich mir gedacht und deshalb die Frage gestellt. Hier mein Code

        colRed = RGB(255, 0, 0)
        colGreen = RGB(50, 205, 50)
        colYellow = RGB(255, 255, 0)
       
        Dim objFormatCondition As FormatCondition
        Dim strControl As String
        Dim frm As Form
        Dim Ctl As Control
       
        For Each Ctl In Me.Controls
       
            If Left(Ctl.Name, 2) = "tb" And Right(Ctl.Name, 3) = "QTY" Then
                With Ctl
                    .FormatConditions.Delete
                   
                    .FormatConditions.Add acExpression, , "[SafetyStk] = 0 and [" & Ctl.Name & "] <5"
                    .FormatConditions(0).BackColor = colRed
                   
                    .FormatConditions.Add acExpression, , "[SafetyStk] = 0 and [" & Ctl.Name & "] >=5 and [" & Ctl.Name & "] <=20"
                    .FormatConditions(1).BackColor = colYellow
                   
                    .FormatConditions.Add acExpression, , "[SafetyStk] = 0 and [" & Ctl.Name & "] >20"
                    .FormatConditions(2).BackColor = colGreen
                   
                    .FormatConditions.Add acExpression, , "[SafetyStk] > 0 and [satetyStk]<=[" & Ctl.Name & "]"
                    .FormatConditions(3).BackColor = colRed
                   
                End With
            End If
       
        Next

    Es handelt sich um eine Schleife über alle Steuerelemente im Formular. Bis zur Bedingung (2) hat es funktioniert. Die Bedingung (3) habe ich später hinzugefügt. Danach kann der Fehler sich ja nur in der 4. Bedingung befinden.

    Gruß

    Michael

    Montag, 22. April 2013 08:25
  • Hallo Michael

    Was steht denn genau in der Fehlermeldung drin?
    Wo genau im Internet hast Du den Hinweis auf ein generelles Problem gesehen?
    Benutzt Du eine MDB (2003-Format) oder ACCDB (2007 Format und später)?

    Gruss
    Henry

    "Michael Pleick" schrieb im Newsbeitrag news:f8c8a7e7-902a-40ca-9163-f5665dad32bb@communitybridge.codeplex.com...

    ich versuche gerade in einem Formular bedingte Formatierungen
    bestimmten Textfeldern zuzuweisen. Bei der 4. Regel erhalte ich einen
    Fehler. Die Recherche im Internet weist auf ein generelles Problem hin.
    Daraus entnehme ich das man in der Version 2010 zwar per GUI mehr als 3
    Bedingungen einstellen kann, per VBA jedoch nicht.

    Dienstag, 23. April 2013 01:52
  • Hallo,

    die Meldung lautet: .... Die angegebene Nummer ist höher als die Anzahl tatsächlich vorhandener bedingter Formatierungen.

    Die Adresse für diesen Hinweis weis ich leider nicht mehr, da dort eine Anmeldung gefordert wurde um weitere Informationen zu diesem Problem zu erhalten. Solchen Seiten vertraue ich nicht unbedingt, aber diesen Hinweis habe ich behalten.

    Gruß

    Michael

    Dienstag, 23. April 2013 09:45
  • Hallo Michael

    Die Frage nach dem Datenbankformat hast Du noch nicht benatwortet...

    Setze mal einen Stop nach dem add der 4. FormatCondition. Kontrolliere dann, ob es dabei einen Fehler gegeben hat, indem Du im Direktfenster:

    ? err.description

    eingibst. Falls nicht, dann gib mal im Direktfenster:

    ? .FormatConditions.Count

    ein und schau, ob es jetzt deren 4 sind. Falls ja, müsste das gehen.

    Gehe dann weiter im Code im Debugmodus (Step-By-Step) und kontrolliere genau, wo der Fehler auftritt. Als Abwehrmassnahme würde ich übrigens noch den ControlType auf Textbox und Combobox untersuchen, weil nur diese FormatConditions haben können.

    Gruss

    Henry

    Dienstag, 23. April 2013 10:19
  • Hallo Henry,

    Die Version ist Access 2010. TextBoxen habe ich im Namen mit tb am Anfang gekennzeichnet.

    Deinen Vorschlag habe ich ausgeführt. Er bleibt genau bei der Zuweisung der 4. bedingten Formatierung an der 1. Textbox stehen. Im Direktfenster erhalte ich die gleiche Meldung, die ich bereits übermittelt habe. Das Ergebnis von Formatconditions.Count ist 3, bzw. bleibt der Zähler bei 3 stehen. Ich habe den Code dahingehend modifiziert, das hinter jeder bedingten Formatierung ein .Count steht und dieser im Direktfenster ausgegeben wird.

    Zusätzlich habe ich die Bedingung vereinfacht, um auch hier Fehler zu vermeiden. Diese ist jetzt:

         .FormatConditions.Add acExpression, , "[SafetyStk] > 0"
         .FormatConditions(3).BackColor = colRed
         Debug.Print .FormatConditions.Count

    Gruß

    Michael


    • Bearbeitet Michael Pleick Mittwoch, 24. April 2013 15:59 Erweiterung des Textes
    Mittwoch, 24. April 2013 15:56
  • Michael, was hast Du für ein _Datenbank_ Format. Ich glaube Dir ja, dass Du A2010 einsetzt, aber ist es eine ACCDB oder eine MDB?

    Gruss

    Henry

    Donnerstag, 25. April 2013 02:34
  • Hallo,

    ACCDB. Die Eigenschaften in den TextBoxen kann ich setzen.

    Sorrry, aber für mach war das selbstverständlich, da die Datenbank neu angelegt ist.

    Michael

    Samstag, 27. April 2013 09:50
  • Hallo Michael

    Ich habe nun mal versucht, das einfach nachzustellen. Es ist so, dass die Add Methode sich strikt weigert, mehr als 3 FormatConditions (FC) hinzuzufügen, aber keinen Fehler ausgibt. Wenn Du nach dem Add der 4. FC FormatConditions.Count ausliest, dann gibt dieser immer noch 3 zurück! Das sieht mir sehr nach einem Bug in Access/VBA aus und evt. noch eine Leiche von der A2003 Version, als es eben nur genau 3 FC gegeben hat.

    Überraschenderweise gibt der Count mehr als 3 zurück, wenn Du die FC über die Oberfläche eingibst und nicht versuchst, diese über VBA hinzuzufügen. Das hat aber nun den Vorteil, dass ich folgende Umgehungsmöglichkeit herausgefunden habe:

    Leg' zuerst soviele FormatConditions per Oberfläche an, die Du brauchst. Verzichte in jedem Fall auf das Löschen und Neuanlegen per VBA, sondern überschreibe dannach nur noch existierenden FormatConditions. In diesem Fall kannst Du mehr als 3 FCs per VBA pflegen und auch ansprechen.

    Statt der .Add Methode benutzt Du die .Modify Methode.

    Und noch was ist mir aufgefallen: Wenn Du die Format Conditions per VBA löschst, dann laufen die höheren FCs nicht mehr synchron mit den FCs des Forms. VBA meint dann, dass das Formaular 3 FCs habe, im Formular siehst Du aber 4, nur die 4. kannst Du erst dann wieder per VBA ansprechen, wenn Du diese zuerst im Formular geändert (oder gelöscht und neu angelegt hast).

    Ist in meiner Sicht ein eindeutiger Bug in A2010 in der FormatConditions.Add Methode. Ich habe kein A2013 und kann daher nicht kontrollieren, ob dieser Bug dort auch noch besteht.

    Gruss

    Henry

    Montag, 29. April 2013 06:52
  • Hallo Henry,

    ich habe die Bedingungen bereits von Hand eingestellt. Das funktioniert auch.

    Der Hinweis mit AC2013 ist gut. Ich kann das checken und melde mich dann erneut.

    Gruß

    Michael

    Samstag, 4. Mai 2013 12:53
  • Hallo Henry,

    ich habe die Datei mit Access 2013 gestartet. Der Fehler bleibt leider.

    Gruß

    Michael

    Freitag, 10. Mai 2013 20:25
  • Schade, ich hatte gehofft, dass der behoben wurde.
    Vielleicht kann einer der Access MVPs hier mal bei MS ein Bug hinterlegen.
    Alternative wäre ein Support Case bei Microsoft zu eröffnen.

    Gruss
    Henry

    Mittwoch, 22. Mai 2013 10:12
  • Hallo Henry,

    Henry Habermacher wrote:

    Schade, ich hatte gehofft, dass der behoben wurde.
    Vielleicht kann einer der Access MVPs hier mal bei MS ein Bug hinterlegen.
    Alternative wäre ein Support Case bei Microsoft zu eröffnen.

    Hab gerade mal folgenden Code runtergetippt (besser, gepasted ;-). Jedenfalls funktioniert das bei mir:

    Private Sub Form_Open(Cancel As Integer)
            Dim FC As FormatCondition
    
            Set FC = Me!MeinCtrl.FormatConditions.Add(acFieldValue, acEqual, Chr(34) & "C1" & Chr(34))
            FC.BackColor = RGB(255, 0, 0)
            Set FC = Nothing
    
            Set FC = Me!MeinCtrl.FormatConditions.Add(acFieldValue, acEqual, Chr(34) & "C2" & Chr(34))
            FC.BackColor = RGB(0, 255, 0)
            Set FC = Nothing
    
            Set FC = Me!MeinCtrl.FormatConditions.Add(acFieldValue, acEqual, Chr(34) & "F3" & Chr(34))
            FC.BackColor = RGB(0, 0, 255)
            Set FC = Nothing
    
            Set FC = Me!MeinCtrl.FormatConditions.Add(acFieldValue, acEqual, Chr(34) & "F6" & Chr(34))
            FC.BackColor = RGB(255, 0, 255)
            Set FC = Nothing
    
            Set FC = Me!MeinCtrl.FormatConditions.Add(acFieldValue, acEqual, Chr(34) & "G1" & Chr(34))
            FC.BackColor = RGB(255, 0, 0)
            Set FC = Nothing
    
            Set FC = Me!MeinCtrl.FormatConditions.Add(acFieldValue, acEqual, Chr(34) & "G2" & Chr(34))
            FC.BackColor = RGB(0, 255, 0)
            Set FC = Nothing
    
            Set FC = Me!MeinCtrl.FormatConditions.Add(acFieldValue, acEqual, Chr(34) & "G3" & Chr(34))
            FC.BackColor = RGB(0, 0, 255)
            Set FC = Nothing
    
            Set FC = Me!MeinCtrl.FormatConditions.Add(acFieldValue, acEqual, Chr(34) & "G4" & Chr(34))
            FC.BackColor = RGB(255, 0, 255)
            Set FC = Nothing
    
    End Sub

    Meine Umgebung:

    Access 2010 14.0.6129.5000 (32-bit) auf Windows 7 64-bit, neues Formular in
    Datenblattansicht.

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Freitag, 24. Mai 2013 09:36
    Moderator
  • Hallo Peter

    Ja, damit scheint es zu gehen.

    Hänge mal folgenden Code hinten an Deinen Code ran, dann bekommst Du den gleichen unerklärlichen Fehler:

      Dim Ctl As Control
      For Each Ctl In Me.Controls
      
        If Ctl.Name = "MeinCtrl" Then
            With Ctl
                .FormatConditions.Delete
                
                .FormatConditions.Add acExpression, , "[MeinCtrl] = ""AA"""
                .FormatConditions(0).BackColor = vbRed
                
                .FormatConditions.Add acExpression, , "[MeinCtrl] = ""BB"""
                .FormatConditions(1).BackColor = vbGreen
                
                .FormatConditions.Add acExpression, , "[MeinCtrl] = ""CC"""
                .FormatConditions(2).BackColor = vbBlue
                
                .FormatConditions.Add acExpression, , "[MeinCtrl] = ""DD"""
                .FormatConditions(3).BackColor = vbYellow
                
            End With
        End If
      Next

    Es scheint nicht zu funktionieren, wenn die FormatCondition nicht explizit instanziiert wird. Die FormatConditionCollection des Controls erlaubt nur 3 FCs, wenn diese direkt angeprochen wird, bei der 4. gibt's einen Fehler.

    Wie bereits geschrieben, hat da ein Programmierer irgendwo eine Limite von 3 vergessen zu entfernen und niemand hat's bisher bemerkt.

    Gruss

    Henry

    Montag, 27. Mai 2013 04:35
  • Hallo Henry,

    Henry Habermacher wrote:

    Hänge mal folgenden Code hinten an Deinen Code ran, dann bekommst Du den
    gleichen unerklärlichen Fehler:
    [...]
    Wie bereits geschrieben, hat da ein Programmierer irgendwo eine Limite
    von 3 vergessen zu entfernen und niemand hat's bisher bemerkt.

    Ja, das ist leider so.
    Man kann den Workaround erweitern, indem man alle FC durchlaeuft und die
    Schleife beendet, wenn die gewuenschte FC gefunden wurde. Da FCs bis auf
    die Position innerhalb der Collection kein Erkennungsmerkmal haben, stellt
    sich die Frage, wie man sie identifiziert. Da man aber sowieso deren
    Position kennen muss, wenn man sie per FormatConditions(3) ansprechen will,
    kann man auch einen Schleifenzaehler verwenden.

    Ich weiss, das ist kein sauberer Ansatz, aber als Workaround akzeptabel,
    wie ich finde, zumindest bis der Bug behoben wird ... wenn er denn mal
    behoben werden sollte.

    Ich stelle mal diese Funktion als Workaround zur Diskussion:

    Public Function GetFormatCondition(Ctrl As Control, Cnt As Long) As
    FormatCondition
        Dim FC As FormatCondition
        Dim I As Long
        On Error GoTo gGetFormatCondition_Error
    
        If Ctrl.FormatConditions.Count = 0 _
                        Or Cnt > Ctrl.FormatConditions.Count - 1 Then
            Set GetFormatCondition = Nothing
            Exit Function
        End If
    
        I = 0
        For Each FC In Ctrl.FormatConditions
            If I = Cnt Then
                    Set GetFormatCondition = FC
                    Exit For
            End If
            I = I + 1
        Next FC
        Set FC = Nothing
        Exit Function
    
    gGetFormatCondition_Error:
        MsgBox Err.Description, vbOKOnly
        Set FC = Nothing
    End Function

    Aufrufbeispiel:

    ? GetFormatCondition(Me!MeinCtrl, 3).BackColor
    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Sonntag, 2. Juni 2013 18:03
    Moderator