myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- Office-Technologien (https://www.mycsharp.de/wbb2/board.php?boardid=73)
--- Excel – Formen (Rechtecke) mit zugewiesenen Makros als Schaltfläche (https://www.mycsharp.de/wbb2/thread.php?threadid=122086)


Geschrieben von pollito am 06.08.2019 um 21:52:
  Excel – Formen (Rechtecke) mit zugewiesenen Makros als Schaltfläche
Hallo!

Ich habe die Aufgabe bekommen, aus einem über Jahre gewachsenen Excel-Formular, welches aus vielen Datenblättern besteht, Daten zu extrahieren. In meinem ganzen Leben habe ich nicht so was Grausiges gesehen: Das Ding ist von mehreren Leuten entwickelt worden, nicht in einer Gruppe, sondern nacheinander, ohne dass irgendjemand jemals etwas dokumentiert hätte. Das nur am Rande...

Nun zu meinem ersten Problem:

Auf dem ersten Arbeitsblatt ist eine eine Liste mit "Schaltflächen", die über die 2. Spalte ("B") platziert wurde. Diese Schaltflächen wurden mit der Form "Rechteck" realisiert. Jeder dieser Schaltflächen wurde zudem ein Makro zugewiesen, welches beim Anklicken auf ein bestimmtes Datenblatt wechselt.
  1. Wie kann ich mit C# auf diese Rechtecke zugreifen?
  2. Kann ich eine Auflistuing der Rechtecke erhalten?
  3. Sollte eine Auflistung möglich sein, wie sind die einzelnen Elemente darin angeordnet? Wild, in der Reihenfolge ihrer Erzeugung oder in der Reihenfolge, in der sie auf dem Datenblatt erscheinen?
Und dann gleich die nächste Frage:

Wenn ich schon so ein Rechteck ermittelt habe, wie komme auf das Makro, das dem Rechteck zugewiesen wurde?

Ich muss mich als Excel-Neuling outen, wenngleich mir die Zugriffstechniken einigermaßen bekannt sind.

Ich hoffe, ich konnte das Problem mehr oder weniger verständlich erklären.

Im Voraus vielen Dank!

LG

René


Geschrieben von muhtanten am 07.08.2019 um 12:18:
 
Moin René,

du solltest dir  OpenXML anschauen.
Dort gibt es auch das OpenXML Productivity Tool zum download. Damit kannst du dir die Datei anschauen und herausfinden wie ein Rechteck innerhalb eines Arbeitsblattes gespeichert und auch mit einem Makro verknüpft wird.

Ich habe mal kurz so ein Arbeitsblatt nachgebastelt. Das sieht dann ungefähr so aus:

C#-Code:
Shape shape1 = new Shape(){ Macro = "[0]!Test", TextLink = "" };

Und der zugehörige Xml - Teil:

XML-Code:
<xdr:sp macro="[0]!Test" textlink="">
      <xdr:nvSpPr>
        <xdr:cNvPr id="2" name="Rechteck 1" />
        <xdr:cNvSpPr />
      </xdr:nvSpPr>
      <xdr:spPr>
        <a:xfrm>
          <a:off x="666750" y="209550" />
          <a:ext cx="542925" cy="200025" />
        </a:xfrm>
        <a:prstGeom prst="rect">
          <a:avLst />
        </a:prstGeom>
usw.

Gruß
muhtanten


Geschrieben von pollito am 07.08.2019 um 12:41:
 
Herzlichen Dank! Allerdings, befürchte ich, findet das nur bei XLSX-Dokumenten Anwendung. Die mir vorliegenden Dokumente sind jedoch XLS-Dokumente, welche in sehr großer Zahl draußen bei Kunden sind.

Gut, ich könnte diese öffnen und dann als XLSX speichern. Ich weiß aber nicht, welche Probleme ich mir damit einhandeln kann. Bisher greife ich über die COM-Schnittstelle auf Excel zu.

Oder meinst du, damit man in das Dokument schauen kann, aber weiterhin das Office-Objektmodell verwenden?

LG

René


Geschrieben von Taipi88 am 07.08.2019 um 12:47:
 
Hi,

in der Tat keine schöne Aufgabe...^^

Naja - da du via C# mit Excel sprechen sollst - wirst du Interop betreiben müssen.

Grundsätzlich würde ich dir an dieser Stelle die Bibliothek "NetOffice" empfehlen.
(Hier wird u.a. vollautomatisch mit LateBinding gearbeitet - das spart wirklich viele Probleme)

Mit "Shape" hast du das richtige Stichwort zur Interaktion mit Formen bereits erhalten - abseits davon kann ich nur empfehlen immer in Verbinding mit "VBA" nach Code zu suchen - lässt sich leicht in C# umwandeln und es gibt um ein vielfaches mehr an Beispielen. Ab davon - kann man auch immer den Makrorecorder anwerfen und so entsprechendes Verhalten nachbauen...

LG


Geschrieben von pollito am 07.08.2019 um 14:13:
 
Wie ich jetzt sehe, hilft mir "Shape" nur bedingt weiter. Der Grund dafür ist, dass diese Formen keinen direkten Bezug zu einer Zeile haben – sie schweben quasi auf dem Arbeitsblatt.

Ich werte Zeilen aus und je nach Ergebnis muss ich über das Makro, welches mit der jeweiligen Form verbunden ist, auf das entsprechende Arbeitsblatt wechseln. Und genau hier sehe ich schwarz, denn die Formen stehen zwar visuell in der jeweils richtigen Zeile, haben aber keine Verbindung dazu.

Ich glaube, ich muss mir hier was anderes überlegen.

Nochmals vielen Dank, eure Tipps haben mich wirklich inspiriert!

LG

René


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 15.10.2019 21:08