Laden...

Gelöst - Kann aus Excel Datei (mit Makro) die CheckBoxen nicht auswerten

Erstellt von oehrle vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.471 Views
O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 5 Jahren
Gelöst - Kann aus Excel Datei (mit Makro) die CheckBoxen nicht auswerten

Hallo, versuche schon über einen halben Tag aus einem Exceldokument die Zustände der CheckBoxen auszulesen.
Ich habe eine Excel.xlsm-Datei die ich automatisch auswerten soll.

Ich habe das zum einen mit den OleObjekten versucht (Fehler: ".Value" nicht bekannt):


 foreach(OLEObject obj in oleObjekte)
            {
                if(obj.Name == "Vc")
                {
                    var dd = WrkSheet.Shapes.Item("Vc").OLEFormat.Object.Value;
                    var test = obj.LinkedCell.ToString();
                }
                else if(obj.Name == "Werkstoff")
                {
                  
                }
                else if(obj.Name == "Maschine")
                {

                }

            }

Probier ich das ganze mit den Shapes wie so oft propagiert, dann funktioniert es auch nicht:



// A checkbox is considered a shape by Excel and accessed using that object model
            Excel.Shapes shapes = worksheet.Shapes;
            foreach (Excel.Shape shape in shapes)
                if (shape.Name == checkBoxName) // Only give me the value for the checkbox I’m looking for
                    response = DetermineIfCheckboxIsChecked(shape.ControlFormat.Value); // Value returned is a double (not a bool)
                    //response = DetermineIfCheckboxIsChecked(shape.OLEFormat.Object.Value); // Value returned is a double (not a bool)


Hat jemand eine Idee?

16.806 Beiträge seit 2008
vor 5 Jahren

Dein Quellcode ist evtl. etwas unglücklich, daher die Nachfrage:

obj aus der Schleife ist auch wirklich das gleiche wie rkSheet.Shapes.Item("Vc").OLEFormat.Object ?
Sieht irgendwie nicht ganz so aus...

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 5 Jahren

Ja, das ist es. Hänge nachher den Code noch vollständig rein.

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 5 Jahren
Bessere Code-Doku zum Problem ...

Hallo, hier noch vervollständigter Code zur besseren Lesbarkeit (war heute etwas hektisch).

Also, ich versteh das nicht, warum ich die CheckBoxen nicht auswerten kann.
Da gibt es noch eine verlinkte Zelle in der das Ergebnis steht um diese abzufragen.
Mein Ziel wäre aber das direkte Control auszuwerten. Habe das wie in einigen Beispielen im Netz demonstriert wird. Es kommt aber immer die Exception oder Meldung, wie weiter oben gezeigt

==> Keine Definition für "Value" !!!

Versteh ich nicht.
Kann es ein Problem der Versoin der Office.Interop (Excel) sein, oder x86/x64 Problem?




            WorkSheet WrkSheet = (Worksheet)WrkBook.Worksheets.get_Item("Eingabedokument");

            //// Methoden aus Beispiel im Netz, aber eigentlich identische Vorgehensweise (ohne Erfolg)
            var checkBox1 = GetCheckboxValue(WrkSheet, "Werkstoff");
            var checkBox2 = GetCheckboxValue(WrkSheet, "Maschine");
            var checkBox3 = GetCheckboxValue(WrkSheet, "Vc");
            var checkBox4 = GetCheckboxValue(WrkSheet, "Dc");

          
            OLEObjects oleObjekte = WrkSheet.OLEObjects();

            foreach(OLEObject obj in oleObjekte)
            {
                //// Forms.CheckBox "Vc" erfassen
                if(obj.Name == "Vc")
                {
                    var dd = WrkSheet.Shapes.Item("Vc").OLEFormat.Object.Value;
                    var test = obj.LinkedCell.ToString();
                }
                //// Forms.CheckBox "Werkstoff" erfassen
                else if (obj.Name == "Werkstoff")
                {
                  
                }
                //// Forms.CheckBox "Maschine" erfassen
                else if (obj.Name == "Maschine")
                {

                }
            }

            //// Test direkte Abfrage, auch ohne Erfolg(OleObject)
            var ddd = WrkSheet.Shapes.Item("Vc").OLEFormat.Object.Value;

            //// Test direkte Abfrage, auch ohne Erfolg(Controls)
            var eee = WrkSheet.Shapes.Item("Vc").ControlFormat.Value;
        }

        /* ========================================================================================================================================================================*/

        public static bool GetCheckboxValue(Excel.Worksheet worksheet, string checkBoxName)
        {

            var response = false;
            //// A checkbox is considered a shape by Excel and accessed using that object model
            Excel.Shapes shapes = worksheet.Shapes;
            foreach (Excel.Shape shape in shapes)
                if (shape.Name == checkBoxName) // Only give me the value for the checkbox I’m looking for
                    response = DetermineIfCheckboxIsChecked(shape.ControlFormat.Value); // Value returned is a double (not a bool)
                    ////response = DetermineIfCheckboxIsChecked(shape.OLEFormat.Object.Value); // Value returned is a double (not a bool)
            return response;
        }

        /* ========================================================================================================================================================================*/

        public static bool DetermineIfCheckboxIsChecked(double value)
        {

            var response = false;
            if (value > 0) // Checkbox is checked == 1.0
                response = true;
            else // Checkbox is not checked == -4713.0
                response = false;
            return response;
        }

        /* ========================================================================================================================================================================*/


O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 5 Jahren

Wie es aussieht, sind das ActiveX-CheckBoxen. Wenn ich auf die "Properties" bei markiertem Control gehe, bekommt man auch das AuswahlGrid. Bei einem Form-Control bekommt man nur das Excel-Fenster angezeigt, siehe Bild:

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 5 Jahren
Problem gelöst

Hallo, ihr lacht euch bestimmt kaputt wenn ich euch erzähle an was die Auswertung gescheitert hat...

>> Meistens sitzt das Problem vor dem Computer <<

Ich habe immer den Namen vom Shape ausgewertet (shape.Name == "Vc" als Beispiel), weil in dem Excel auch die Bezeichnung "Vc" als Label dran steht. Das ist aber der AlternativeText .

Also, bei der Abfrage weiss man entweder ganau die Namen der Controls, oder man frägt über .AlternativText die Zustände ab.

Also, aufpassen nicht das mal ein anderer in die Falle tappt.