Laden...

Übernahme Inhalt von Excelzellen mit Add-In Button Klick

Erstellt von clowny90 vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.939 Views
C
clowny90 Themenstarter:in
13 Beiträge seit 2016
vor 7 Jahren
Übernahme Inhalt von Excelzellen mit Add-In Button Klick

Guten Abend zusammen,
Ich bin neu hier und allgemein hab ich sonst noch nie in einem Forum geschrieben, daher verzeiht mir bitte eventuelle Verhaltensfehler.
Ich bin aktuell dabei ein Add- In zu programmieren, das mir aus Excel Daten (X,Y,Z Werte) ein 3D Diagramm erzeugen soll. Leider klappt hierbei die Datenaufnahme nicht so wie ich sie mir Vorgestellt habe. Aktuell muss ich dem Programm direkt sagen wo (z.B. A1:C25) die Daten liegen.

Ich suche aber nach einem Weg, die Zellen einfach mit der Maus auszuwählen, so dass die Datenauswahl genau wie bei "normalen" Excelfunktionen funktioniert.

Gesucht hab ich schon ne Menge, hab auch was unter Java gefunden was total einfach funktioniert, aber leider funktionieren die sachen die ich unter C# gefunden habe nicht.

Wie z.B.


Excel.Range R = this.Application.ActiveCell as Excel.Range; 
if (R != null) MessageBox.Show(R.Value2);

Leider schmeißt er mir da immer die Fehlermeldung, dass mein Ribbon keine Definition für Application enthält.

Hat da jemand ne Lösung?

H
523 Beiträge seit 2008
vor 7 Jahren

Ich hab' das in einem VBA-Makro mal wie folgt gelöst:


    Dim auswahl As Range
    Set auswahl = Application.InputBox("Bitte wählen Sie die Zellen aus...", "Titel", Type:=8)

Die Range kannst Du dann wieder mittels SetSourceData als Datenbasis für das Diagramm verwenden.

C
clowny90 Themenstarter:in
13 Beiträge seit 2016
vor 7 Jahren

Guten Morgen, Ich muss gestehen, das ich nicht der größte Programmierprofi bin, quasi eher Neuling, ich verstehe nicht, wie ich die Daten auf diesem Wege in mein C# Array laden kann.

H
523 Beiträge seit 2008
vor 7 Jahren

Was denn für ein Array? Du fragtest nach einem Weg "die Zellen einfach mit der Maus auszuwählen, so dass die Datenauswahl genau wie bei "normalen" Excelfunktionen funktioniert."

Genau das macht die Funktion InputBox:


            Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
            excelApp.Visible = true;
            Workbook wbook = excelApp.Workbooks.Add();
            Range auswahl = excelApp.InputBox("Bitte wählen Sie die Zellen aus", 
                                             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 8);

Am besten postest Du etwas mehr Code und schreibst nochmal genau an welcher Stelle Du nicht weiterkommst.

C
clowny90 Themenstarter:in
13 Beiträge seit 2016
vor 7 Jahren

Das ist genau das was ich suche, nur würde ich gerne die Daten aus einem schon geöffneten Dokument lesen wollen und nicht aus einem neuen. Diese Daten möchte ich dann ein Array double[x,3] übergeben, wobei x genau die Anzahl der Datensätze angibt(Zahl der Zeilen die im Dokument ausgwählt sind).

Vielen Dank

H
523 Beiträge seit 2008
vor 7 Jahren

Du musst eigentlich nur


Range auswahl = Application.InputBox("Bitte wählen Sie die Zellen aus", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 8);

aufrufen. Dann hast Du den Bereich der markiert wurde und kannst den Inhalt des Bereichs verwenden.

In ein Array bekommst Du den Inhalt mit:


object[,] deinarray = auswahl.Value;

C
clowny90 Themenstarter:in
13 Beiträge seit 2016
vor 7 Jahren

private void button1_Click(object sender, EventArgs e)
        {

            Excel.Range auswahl = Excel.Application.InputBox("Bitte wählen Sie die Zellen aus", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 8);

        }

-->
CS0120

Was mache ich falsch?
wie soll ich ein Application Objekt erstellen, und dem sagen dass es die aktuell geöffnete application inkl dem geöffnetem Excel Dokument ist?

versteht mich jemand?^^

16.807 Beiträge seit 2008
vor 7 Jahren

Das sind C# Grundlagen und steht auch in der Fehlerbeschreibung.
Du verwendest Excel.Application.InputBox als sei es eine statische Methode - ist es aber nicht.

hypersurf hat Dir die (vermutlich) korrekte Verwendung doch um 15.05.2016 23:07 gezeigt.
Nur Code kopieren ohne nachzudenken ist oft keine gute Idee.

C
clowny90 Themenstarter:in
13 Beiträge seit 2016
vor 7 Jahren

Ich habe auch erst seit ein paar Tagen mit C# Programmierung zu tun,habe bisher nur einwenig in vba gearbeitet , daher hapert es halt an den Grundlagen. Ich habe das jetzt grade mal versucht im Guide zu finden und auch gegoogelt, aber ich versteh es einfach nicht, es wäre sehr nett wenn mir das jemand erklären könnte.

Vielen Dank

1.029 Beiträge seit 2010
vor 7 Jahren

Hallo,

erstmal als Tipp an dich:

Egal was du eigentlich programmieren möchtest - führ dir erstmal vollständig ein Buch über C# zu Gemüte. So wie wir alle auch - das sind nämlich die Basics, die wir in der Regel nicht beantworten, da man weit ausholen muss um bestimmte Grundlagenfehler so zu klären.

Benötigen wirst du es ohnehin, da du sonst niemals fertig wirst.

Zu deinem Problem:

Davon ausgehend, dass du ein Excel AddIn entwickelst und dort ein Ribbon hinzugefügt hast und dort wahrscheinlich schlicht auf einen ButtonClick oder ähnliches reagierst - fehlt dir sicher eine Referenz auf das Application-Objekt von Excel, weshalb die kopierten Code-Aussschnitte nicht funktionieren.

Das ist soweit nichts neues - denn die Referenz auf dieses Objekt gibts halt nicht unbedingt geschenkt, wie du bereits an mehreren Beispielcodes schon gesehen hast. Sofern du in einem AddIn arbeitest - gibt es diese Referenz allerdings sehr einfach - es gibt nämlich in deinem Addin eine verstecke Datei die nennt sich "ThisAddIn.Designer.cs", welche dir in deinem Addin die Klasse "Globals" schenkt, mit deren Hilfe du eine Referenz auf die Instanz deines AddIns selbst erhälst, welche wiederum eine Referenz auf das Application-Objekt von Excel hält.

Noch zum merken: Die Klasse Globals hilft dir hier nur, weil Microsoft da ein Singleton im Designer zusammenbaut - deswegen kann man die Klasse so einfach verwenden.

Einfach gemacht sollte dir folgender Code weiterhelfen:

private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
        {
            Globals.ThisAddIn.Application.InputBox("Test", null, null, null, null, null, null, 8);
        }

"ThisAddIn" kann bei dir allerdings je nach Name bei dir abweichen - aber das wirst du denke ich schon sehen.

LG

C
clowny90 Themenstarter:in
13 Beiträge seit 2016
vor 7 Jahren

Guten Abend zusammen, vielen Dank für die Hilfe es hat so funktioniert wie ich es wollte;-)