Zelleigenschaft über Zellname bearbeiten

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Zelleigenschaft über Zellname bearbeiten

    Hallöchen,

    ich habe einen VBA-Code, den ich in VB.Net übersetzen möchte. Leider komme ich nicht weiter und zwar dort, wo ich z.B die Hintergrundfarbe eine Zelle via Zellnamen abfragen bzw, setzen möchte. Der VBA-Code sieht so aus:

    VB.NET-Quellcode

    1. For Each dings In wbkopie.Names
    2. 'BEI ÜBEREINSTIMMUNG AKTIVIEREN
    3. If dings.Cells(1, 1).Interior.color = GELB _
    4. Or CStr(dings.MergeArea.Cells(1, 1).Value) <> "" _
    5. Or dings.MergeArea.Cells(1, 1).HasFormula = True Then
    6. Else
    7. 'AUFFÄLLIGE BEREICHE MARKIEREN
    8. dings.Interior.ColorIndex = 4
    9. dings.FormatConditions.Delete()
    10. dings.ClearComments()
    11. dings.UnMerge()
    12. dings.Cells(1, 1).AddComment()
    13. dings.Cells(1, 1).Comment.Visible = True
    14. End If
    15. Next dings


    Dies hier z.B. geht:

    VB.NET-Quellcode

    1. dings.name
    2. 'ERGEBNIS: "ZellnameABC" {String} / String: "ZellnameABC"
    3. dings.RefersToRange.Address
    4. 'ERGEBNIS: "$J$22" {String} / String: "$J$22"


    Aber dies hier funktioniert leider nicht:

    VB.NET-Quellcode

    1. dings.RefersToRange.Address.Interior.color
    2. dings.Interior.ColorIndex

    etc

    Kann mir jemand helfen?
    Danke und Grüße, Soti
    Das alte Lied: Es gilt, verschiedene Datentypen auseinanderzuhalten, denn der Datentyp eines Objekts definiert, was geht und was nicht.

    Ist wie im richtigen Leben: Die Art eines Objekts bestimmt, was geht und was nicht: Ein Vogel kann fliegen, ein Taucher kann tauchen.

    Also finde heraus, welchen Datentyp dings hat.
    Dann kannst du im Objectbrowser nachgucken, was es alles kann.
    Wenn du Option strict On hast, hilft dir glaub Intellisense auch besser, mit sinnvollen Vorschlägen - viele proggen ja fast nur über Intellisense, und gucken kaum je in den OB.

    Allerdings kanns bei Excel-Interop auch mühsam sein, den Datentyp rauszukriegen - mach mal kleinen Test:
    1. öffne den Objectbrowser (zB mit F2, kann aber auch anderes Tastenkürzel sein, dann such ihn im Menü)
    2. Gib Range in die OB-Suche ein
    Findet er was, so ists gut eingerichtet, und Excel-Interop-Datentypen sind dem System bekannt.
    Andernfalls nicht so gut.
    @ErfinderDesRades Danke für deine Antwort.

    Der Objektkatalog zeigt schon mal eine große Auswahl an, wenn man nach Range sucht.
    Range kann auch Interior As Microsoft.Office.Interop.Excel.Range.Interior. Also das was ich unter anderem Suche.
    dings habe ich als Object deklariert und dings2 As Excel.Range.

    Muss ich jetzt Trycast anwenden? In etwa so, was aber nicht funktioniert:

    VB.NET-Quellcode

    1. dings2 = TryCast(dings, Excel.Range)
    eigentlich ergibt sich der Datentyp von dings hierraus:

    VB.NET-Quellcode

    1. For Each dings In wbkopie.Names

    wbkopie.Names ist offsichtlich eine Auflistung, die man mit ForEach durchlaufen kann. Da müsste man jetzt gucken, welchen Datentyp das hat, und welchen Datentyp von dem Datentyp die Item-Property hat - wenns eine gibt.
    Weil bei InterOp-Auflistungen ist Item(index) meist eine Property, die denselben Datentyp hat wie die Elemente, die bei ForEach ausgegeben werden.
    Also wenn du glück hast, kannst du ganz ohne Cast auskommen:

    VB.NET-Quellcode

    1. For Each dings As Range In wbkopie.Names
    und dings ist ein Range

    Beim gucken, welchen Datentyp etwas hat, hilft dir auch Intellisense - guggemol eine kleine Übung dazu: Video-Tut: Welchen Datentyp hat das Objekt?
    dings ist vom Typ Range
    dings.RefersToRange ist ebenfalls vom Typ Range
    dings.Name, dings.Address und dings.RefersToTange.Address sind vom Typ String
    dings.RefersToRange.Address.Interior.color kann also nicht funktionieren, wohl aber dings.RefersToRange.Interior.Color
    dings.Interior.ColorIndex sollte allerdings schon funktionieren.

    Wie @ErfinderDesRades ja schon deutlich gemacht hat, solltest du dich mit Datentypen beschäftigen.
    Der Rest wurde ja soweit auch schon erläutert.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Super. Danke ihr zwei! Das hat mich weiter gebracht. Auch das Video ist toll! Danke!

    dings.RefersToRange.Address.Interior.Color klappt schon mal!
    Leider funst das nicht bei dings.RefersToRange.HasFormula = True, wenn der Zellname sich nicht auf eine einzige Zelle bezieht, sondern einen Zellbereich.
    Bei VBA hatte ich dafür dies hier: dings.MergeArea.Cells(1, 1).HasFormula = True
    Hättet ihr da auch noch einen guten Tipp?

    Halt. Jetzt muss ich mich selbst korrigieren. HasFormula kann ich an sich ja gar nicht auswerten, wenn es ein Zellbereich ist. Deshalb hatte ich ursprünglich nur die erste Zelle eines Bereiches ausgewertet. Trifft man auf einen Zellbereich, bekommt man DBnull. Damit müsste ich weiterarbeiten, oder von vornherein Zellbereiche ausschließen.

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

    Soti schrieb:

    Trifft man auf einen Zellbereich, bekommt man DBnull.
    glaub ich nicht.
    Aber ich kanns auch nicht nachprüfen.
    kannst du Bildle machen vom Objectbrowser, mit angewählter Range.HasFormula - Property?
    Und wenn anhängen, dann bitte mit der Forum-Funktionalität - gugge hier:
    jo, dann ists vlt. tatsächlich über dbNull geregelt, wenn ein Zellbereich mit nur teilweisen Formeln auftritt.
    Wenn es so ist, so ists nicht schön gelöst, denn eiglich drückt man unbestimmte Boolean-Zustände mit Nullable(Of Boolean) aus - nicht mit DbNull. Wie gesagt: DbNull ist eine Angelegenheit der Datenbänkerei, nicht von (Excel-)InterOp.

    Was ich dir noch empfehlen würde ist, den ObjectBrowser effizient einzurichten.
    Kannst ühaupt mal Video gucken, wie man mit VS debuggt: VisualStudio richtig nutzen
    Dort ist in post#4 auch ein Weiter-Link zu einem Thread, wo die effiziente Einrichtung erläutert wird.