Eigenschaft ist nicht gesetzt, soll aber abgefragt werden

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Eigenschaft ist nicht gesetzt, soll aber abgefragt werden

    Hallöchen,

    in einem zweidimensionalen Array sammele ich die Eigenschaften eines größeren Ranges. Ich sammele die bedingten Formatierungen in einer Schleife und frage diese hinterher ab. Wenn etwas zutrifft, wird der betreffende Bereich verändert. Ich habe 6 verschieden Zuständen in der etwas zutreffen kann und jeweils was anderes verändert wird. Bsp: Ich frage ab, ob FormatCondition.Interior.Pattern <> Grid ist UND Hintergrundfarbe gelb. Oder FormatCondition.Font.Color = rot ist UND Hintergrundfarbe NICHT gelb.

    An sich funktioniert dies ganz gut. Leider habe ich das Problem, dass manchmal Eigenschaften gar nicht gesetzt werden. Trotzdem muss ich diese in einer Schleife abfragen. Wenn die Eigenschaften nicht gesetzt sind, laufe ich auf einen Fehler hinaus. Dieser kann lauten "In System.AccessViolationException ist eine Ausnahme vom Typ "mscorlib.dll" aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet." Oder aber auch "Die LineStyle-Eigenschaft des Borders-Objektes kann nicht zugeordnet werden." Z.B: hat FormatCondition.Interior.Pattern nicht immer einen Wert. In einem Fall DBNull oder auch gar nichts.

    Hat jemand einen guten Tipp parat? Vielen Dank schon einmal.

    VB.NET-Quellcode

    1. Dim dings As Excel.Range 'Zählvariable, durchläuft alle Zellbereiche
    2. Dim arrBFs(,) As Microsoft.Office.Interop.Excel.FormatCondition 'Array zum Sammeln aller bedingten Formatierungen
    3. 'BEREICH SELEKTIEREN
    4. rngSelectedRange = app.Selection
    5. 'WERT ZUWEISEN
    6. j = 0
    7. n = 0
    8. nDings = rngSelectedRange.Count
    9. ReDim arrDings(0 To (nDings - 1))
    10. ReDim sIntColor(0 To (nDings - 1))
    11. ReDim arrBFs(0 To (nDings - 1), 10)
    12. 'WERTE IN ARRAY SAMMELN
    13. For Each dings In rngSelectedRange
    14. 'WERT ZUWEISEN
    15. arrDings(n) = dings.MergeCells And dings.MergeArea.Cells(1, 1).Address = dings.Address And dings.FormatConditions.Count > 0
    16. 'BEI ÜBEREINSTIMMUNG AKTIVIEREN (Falls Bereich Zellverbund beinhaltet)
    17. If arrDings(n) = True Then
    18. 'WERT ZUWEISEN
    19. sIntColor(n) = If(CStr(dings.Interior.Color.ToString), "")
    20. ncond = dings.FormatConditions.Count
    21. 'SCHLEIFE STARTEN (Wert zuweisen, Array füllen mit bedingten Formatierungseigenschaften)
    22. For j = 1 To ncond
    23. arrBFs(n, j - 1) = dings.FormatConditions(j)
    24. 'sBF_BorderLinestyle(n,j - 1) = If(CStr(dings.FormatConditions(j).Borders.LineStyle.ToString),"")
    25. Next j
    26. End If
    27. 'WERT ZUWEISEN
    28. n = n + 1
    29. Next dings
    30. 'WERT ZUWEISEN
    31. j = 0
    32. n = 0
    33. 'usw.
    34. 'SCHLEIFE STARTEN (Zellbereiche durchsuchen)
    35. For Each dings In rngSelectedRange
    36. 'BEI ÜBEREINSTIMMUNG AKTIVIEREN (Falls Bereich Zellverbund beinhaltet)
    37. If arrDings(n) = True Then
    38. 'WERT ZUWEISEN
    39. ncond = dings.FormatConditions.Count
    40. 'SCHLEIFE STARTEN (Rangfolge bedingter Formatierung)
    41. For j = 1 To ncond
    42. 'BF-REGEL BESTIMMEN (Regel "A" (Schriftfarbe Weiß))
    43. If arrBFs(n, j - 1).Interior.Pattern <> XlPattern.xlPatternGrid Then 'HIER FUNKTIONIERT ES NICHT BEI DB NULL!
    44. arrBFs(n, j - 1).Interior.Pattern.ToString <> CStr(15) And _
    45. arrBFs(n, j - 1).Interior.Color.ToString = CStr(RGB(255, 255, 255)) Then
    46. 'usw


    Dieser Beitrag wurde bereits 12 mal editiert, zuletzt von „Soti“ ()

    @Soti Vielleicht fragst Du einfach ab, ob Dein Wert DbNuss ist:

    VB.NET-Quellcode

    1. If IsDBNull(Value) Then
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    DbNull ist ADO - also Datenbänkerei.
    Ist bei Excel-Interop höchstwahrscheinlich fehl am Platze.

    Mir scheint, dass da Strict Off programmiert ist, also egal welcher Datentyp wird ans selbe Objekt zugewiesen, und wenns zufällig passt hat man Glück gehabt.

    Der TE will in dem Array ja auch alles mögliche verschiedene speichern - wenn ich recht verstund.

    Also wir haben ein Array mit vielen Objekten drinne, und keine Ahnung, welchen Datentyps.
    Jo, da muss man halt mit TryCast herum-tryCasten, und wenn Erfolg kann man die für diesen Datentyp vorgesehene Methode aufrufen.

    Ansonsten fehlt dem gezeigten Code Kopf und Fuss, und von entscheidenden Objekten kann man den Datentyp nicht erkennen, weil die wohl ausserhalb der Methode (oder was das ist) deklariert sind.
    Danke erst einmal für eure hilfreichen Antworten!

    Ich habe es jetzt hiermit probiert:

    VB.NET-Quellcode

    1. 'BF-REGEL BESTIMMEN (Regel "A" (Schriftfarbe weiß))
    2. If Not (IsDBNull(sIntColor(n)) Or _
    3. IsDBNull(arrBFs(n, j - 1).Interior.Pattern) Or _
    4. IsDBNull(arrBFs(n, j - 1).Interior.Color)) Then


    Das komische ist, dass es manchmal geht und manchmal folgende Fehlermeldung auftaucht:
    "Eine Ausnahme (erste Chance) des Typs "System.AccessViolationException" ist in mscorlib.dll aufgetreten."
    Und zwar, wenn ich mit dem Debugger Schritt für Schritt durchgehe.

    Gebe ich die Frage ins Direktfenster ein, dann kommt folgendes:

    VB.NET-Quellcode

    1. ? IsDBNull(arrBFs(n, j - 1).Interior.Pattern)
    2. {"Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist."}


    Lass ich meine Sub so durchlaufen, überspringt er manche Anweisung innerhalb meines Codes, die er eigentlich machen sollte. Lasse ich die Sub nochmals drüber laufen, werden alle Anweisungen durchgeführt.

    Zur TryCasterei :)
    Ich habe schon einen Trycast drin. Insgesamt müsste ich dann 7 Trycast einarbeiten, die auch nacheinander durchlaufen. Das geht ja dann leider nicht, oder gibt es einen Trick?
    @Soti Du greifst ja auf Instanzen in Instanzen zu.
    Wenn die Parent-Instanz Nothing ist, kommt bei Zugriff auf die Child-Instanz diese unmanaged Exception.
    Probiere mal in dieser Reihenfolge:

    Quellcode

    1. ? IsDBNull(arrBFs(n, j - 1))
    2. ? IsDBNull(arrBFs(n, j - 1).Interior)
    und erweitere dann Deinen Test entsprechend.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany Danke schön für den Hinweis!
    Ich habe es jetzt so versucht, leider hat es nicht funktioniert:

    VB.NET-Quellcode

    1. 'BF-REGEL BESTIMMEN (Regel "A" (Schriftfarbe weiß))
    2. If Not IsDBNull(arrBFs(n, j - 1)) Then
    3. If Not IsDBNull(arrBFs(n, j - 1).Interior) Then
    4. If Not (IsDBNull(sIntColor(n)) Or _
    5. IsDBNull(arrBFs(n, j - 1).Interior.Pattern) Or _
    6. IsDBNull(arrBFs(n, j - 1).Interior.Color)) Then
    7. If arrBFs(n, j - 1).Interior.Pattern <> XlPattern.xlPatternGrid And _
    8. arrBFs(n, j - 1).Interior.Color = RGB(255, 255, 255) Then
    9. 'BEDINGTES FORMAT NEU SETZEN (Regel "A" (Schriftfarbe weiß))
    10. dings.FormatConditions(j).Font.Color = RGB(255, 255, 255)
    11. dings.FormatConditions(j).Interior.ColorIndex = XlColorIndex.xlColorIndexAutomatic
    12. dings.FormatConditions(j).Interior.Pattern = XlPattern.xlPatternNone
    13. dings.FormatConditions(j).StopIfTrue = True
    14. 'dings.FormatConditions(j).ModifyAppliesToRange(app.Range(dings.MergeArea.Address))
    15. Continue For
    16. End If
    17. End If
    18. End If
    19. End If


    Das Direktfenster sagt folgendes:

    VB.NET-Quellcode

    1. ? IsDBNull(sIntColor(n))
    2. False
    3. ? IsDBNull(arrBFs(n, j - 1))
    4. False
    5. ? IsDBNull(arrBFs(n, j - 1).Interior)
    6. False
    7. ? IsDBNull(arrBFs(n, j - 1).Interior.Pattern)
    8. {"Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist."}
    9. ? IsDBNull(arrBFs(n, j - 1).Interior.Color)
    10. {"Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist."}


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Soti“ ()

    @Soti Jou, Dein Code ist falsch. Machst Du

    VB.NET-Quellcode

    1. If Not IsDBNull(sIntColor(n)) AndAlso _
    2. Not IsDBNull(arrBFs(n, j - 1)) AndAlso _
    3. Not IsDBNull(arrBFs(n, j - 1).Interior) AndAlso _
    4. Not IsDBNull(arrBFs(n, j - 1).Interior.Pattern) AndAlso _
    5. Not IsDBNull(arrBFs(n, j - 1).Interior.Color) Then

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Soti Was für Typen sind Interior, Interior.Pattern und Interior.Color?
    Wahrscheinlich müssen wir die als solche abfragen:

    VB.NET-Quellcode

    1. If Not IsDBNull(sIntColor(n)) AndAlso _
    2. Not IsDBNull(arrBFs(n, j - 1)) AndAlso _
    3. arrBFs(n, j - 1).Interior IsNot Nothing AndAlso _
    4. arrBFs(n, j - 1).Interior.Pattern IsNot Nothing AndAlso _
    5. arrBFs(n, j - 1).Interior.Color IsNot Nothing Then
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany Danke nochmal!

    Hier alle Deklarationen. Interior, Interior.Pattern und Interior.Color sind ja durch das Array "arrBFs" deklariert als "Microsoft.Office.Interop.Excel.FormatCondition".

    VB.NET-Quellcode

    1. Dim dings As Excel.Range 'Zählvariable, durchläuft alle Zellbereiche
    2. Dim j As Integer 'Zählvariable, durchläuft die Rangfolge bedingter Formate
    3. Dim ncond As Integer 'Zählvariable für Anzahl bedingter Formate
    4. Dim rngSelectedRange As Excel.Range 'Kompletter selektierter Bereich, der durchsucht werden soll
    5. Dim Formel1 As String 'Zelladresse der Formel in bedingter Formatierung (Wert wird an Subprozedur übergeben)
    6. Dim nMergedZeilen As Integer 'Anzahl Zeilen in einem Zellverbund
    7. Dim StartZeit As Date 'Variable zur Überwachung der Programmlaufzeit
    8. Dim wsSourceSheet As Excel.Worksheet 'zu bearbeitendes Arbeitsblatt (selektiertes Arbeitsblatt)
    9. Dim sIntColor() As String 'Variable zum Sammeln der Eigenschaft: Hintergrundfarbe
    10. Dim arrBFs(,) As Microsoft.Office.Interop.Excel.FormatCondition 'Variable zum Sammeln aller Bedingte Formatierungen
    11. Dim sBF_BorderLinestyle(,) As String 'Variable zum Sammeln der Eigenschaft: Bedingte Formatierung Rahmenstärke
    12. Dim nDings As Long 'Anzahl Zellen im selektierten Bereich
    13. Dim arrDings() As Boolean 'Array für alle Zelladressen
    14. Dim n As Integer 'Zähler für Anzahl zu bearbeitender Zellbereiche
    15. nDings = rngSelectedRange.Count
    16. ReDim arrDings(0 To (nDings - 1))
    17. ReDim sIntColor(0 To (nDings - 1))
    18. ReDim arrBFs(0 To (nDings - 1), 10)
    19. ReDim sBF_BorderLinestyle(nDings - 1, 10)

    Soti schrieb:

    "Microsoft.Office.Interop.Excel.FormatCondition"
    Sorry, da kenn ich mich nicht aus. :/
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich werde keine 4000 DM ziehen! Wüsste eh nicht, wo ich noch DM bekommen könnte :)

    Ich habe 6 Variationen, die nacheinander abgefragt werden. Somit komme ich durchaus in den Genuss mehrere TryCasts in Abfolge zu durchlaufen. Aber das geht doch nicht, oder doch?
    nein - von TryCatch lass blos die Finger weg!

    Ich sprach von TryCast, und meinte auch TryCast.
    Vermutlich musste das Schlüsselwort erst noch recherchieren.
    msdn.microsoft.com/de-de/library/dd409611(v=vs.140).aspx

    Evtl. musste überhaupt noch mehr OOP lernen, was ein Datentyp ist, was ein (Direct)Cast (Typumwandlung), und unter welchen Bedingungen ein (Try)Cast erfolgreich ist, und wann nicht.

    Erster ganz allgemeiner Guck zum Thema OOP vlt. Grundlagen: Fachbegriffe
    Aber dann musste dir doch den Löffelmann downloaden, und den Kram richtig durchlesen. Link aufs Löffelmann-Buch (kannst auch ein anderes empfohlenes nehmen) findeste hier: Entwickler-Ressourcen und Tools, Bücher und WebCasts

    Soti schrieb:

    OK, hab runtergeladen und reingeschaut und Bahnhof verstanden.
    Ich nehme an, du meinst das Löffelmann-Buch.

    Ich kann dir da nicht weiter helfen, jedenfalls nicht, solange du nicht genau ins Auge fasst, was du nicht verstehst.

    Grundsätzlich nämlich kann man alles erklären - es muss nur danach gefragt werden.

    "Bahnhof" hingegen kann man nicht erklären. "Bahnhof" ist genau genommen ein Ausdruck dafür, dass so viele Fragen offen sind, dass man angesichts der Kosten-Nutzen-Rechnung ("Lohnt es, die Fragen alle zu bearbeiten?") aufgibt.
    Dann sollteste jetzt das Proggen bleiben lassen, denn um proggen zu lernen geht kein Weg dran vorbei, das zu erlernen, was im Löffelmann (oder gleichartigen anderen Büchern) steht.

    Aber das braucht viel Geduld, und dein aktuelles Projekt ist auch schlecht dazu geeignet, vb.net zu erlernen.
    Weil bei Excel-InterOp ist man oft fast gezwungen Strict Off proggen, aber unter Strict Off kann man es kaum erlernen, Datentypen zu unterscheiden.

    Aber du weißt auch nicht, was Strict On ist - das ist eine Compiler-Option, die den Compiler alle Datentyp-Fehler anmeckern lässt.
    Kannst mal Option Strict On als erste Zeile deiner Datei schreiben - da müssten sich auf Anhieb viele Fehler auftun.

    Diese Fehler waren schon vorher da, nur jetzt sind sie sichtbar.