Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: C# Code für VBA verfügbar machen

C# Code für VBA verfügbar machen
10.10.2020 20:29:34
Esther
Hallo liebes Forum,
vielleicht könnt ihr mir weiterhelfen. Ich habe einen Code für diverse Funktionen in C#. Jetzt soll dieser aber auf einen System verfügbar gemacht werden, wo alles am besten in VBA (für eine Excel) plaziert ist. Insbesondere da der C# Code ja eher für Fortgeschrittene ist und ich gerne in dem firmeninternen System alles in VBA haben will.
Vermutlich ist das ein gewisser Rückschritt, aber ich bin einfach nicht fit in C# und in VBA fange ich gerade erst an.
Falls ihr da irgendwie Ideen für Konvertierung, Add-Ons usw. habt. Würde mich sehr über Hilfe freuen.
Falls ihr sagt, dass ist doch Quatsch, weil... auch hilfreich für mich. Oder ihr sagt, es gibt Leute, die schreiben dir schnell den Code um von C# in VBA.
Gruß Esther
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: schwierige Antwort
11.10.2020 09:58:58
Fennek
Hallo,
gestern habe ich ein Beispiel gefunden, imdem mit VBA zuerst ein Powershell-Code und damit dann ein C#-Code gestartet wurde.
Es ist also möglich, aber ich muss mir noch überlegen ob und wie ich das kommunizieren möchte. Der Code stammt aus einer der bakannten Viren-Familien.
Es würde mich motivieren dir zu antworten, wenn du ein paar für mich offene Frage beantwortest:
- was ist der Vorteil für malware Autoren mit so einer (unnötig?) komplizierten Konstrktion
- wird C# weniger geloggt als Powershell
mfg
(Ich hoffe, dass andere hier im Forum Stellung beziehen, ob hier aus Viren zitiert werden sollte)
Anzeige
AW: schwierige Antwort
11.10.2020 11:16:32
Zwenn
Hallo Fennek,
das Aufrufen von Code, der in anderen Programmiersprachen entwickelt wurde, wird öfter nachgefragt. Ich lese davon zumeist im Zusammenhang mit Python. Das ist also per se erstmal nix böses.
Viele Grüße,
Zwenn
AW: Python ist einfach
11.10.2020 12:56:47
Fennek
Hallo,
mein AV-Programm blockiert zwar "set WSh = CreateObject("WScript.Shell"), aber ein "Shell Python test.py" geht ohne Probleme.
Was mich ärgert: Wenn die AV schon bestimmte Aufrufe blockt, warum nicht den Code des bekanntesten aller Makro-Viren "Emotet".
mfg
(der Aufrauf von C# über Powershell ist ziemlich "obfuscated" und damit nicht einfach zu kommunizieren. Natürlich habe ich das "IEX" uä entfernt)
Anzeige
AW: C# Code für VBA verfügbar machen
11.10.2020 11:13:36
Zwenn
Hallo Esther,
selbst habe ich das noch nie gemacht und kann auch kein C# programmieren. Aber Microsoft erklärt hier, wie man C# Methoden aus VBA heraus aufrufen kann:
https://docs.microsoft.com/de-de/visualstudio/vsto/walkthrough-calling-code-from-vba-in-a-visual-csharp-project?view=vs-2019
Das sieht mir relativ aufwändig aus. Vor allem, wenn Du nicht nur ein paar Methoden hast. Falls Du das testen möchtest, würde ich auch als erstes mittesten, ob sich so ein Projekt hinterher so in der ganzen Firma ausrollen lässt, wie es benötigt wird. Sprich, läuft das dann einfach auf anderen Rechnern oder muss da auch ein gewisser Aufwand betrieben werden?
Mir stellt sich bei Deinem Vorhaben vor allem die Frage, was macht der C# Code denn? In Excel wird VBA ja eigentlich dafür verwendet Abläufe innerhalb von Excel zu automatisieren. Dein C# Code dürfte aber völlig unabhängig von Excel sein.
Pauschal kann man schlecht eine Aussage darüber treffen, ob Dein Gedankengang sinnvoll ist oder nicht denke ich. Dafür müsste man wissen, was der C# Code macht, wie umfangreich er ist und warum Du meinst, die Codebasis in VBA einzubinden sei sinnvoll, sich also immer auch Excel für die Ausführung eines (eigentlich?) Excel-Unabhängigegn Codes, ans Bein zu binden. Weiterhin würde ich im Vorfeld auch versuchen in Erfahrung zu bringen, ob es Auswirkungen bei künftigen Versionswechseln von Excel geben kann.
Während so einer Erörterung tauchen sicher weitere Fragen auf. Am Ende ist es eine Analyse über Aufwand und Nutzen (Vor- und Nachteile).
Viele Grüße,
Zwenn
Anzeige
Hatte erst den ersten Kaffee
11.10.2020 11:23:23
Zwenn
Hallo noch einmal,
ich glaube, MS beschreibt unter der Verlinkung den Weg, wie man VBA aus C# heraus aufruft. Also genau falsch herum. Ohne jetzt tiefer gebohrt zu haben (Fennek weiß vielleicht mehr dazu), ist man hier der Meinung, dass der Aufruf von C# Methoden aus VBA heraus so ohne weiteres nicht möglich ist. Der Thread ist allerdings schon 10 Jahre alt:
https://stackoverflow.com/questions/3634126/can-we-write-a-macro-in-c-sharp-for-excel
Viele Grüße,
Zwenn
Anzeige
Beim zweiten Kaffee gefunden
11.10.2020 11:47:50
Zwenn
Wird hier eher so eine Recherche-Doku ;-)
Habe jetzt nochmal etwas weiter recherchiert. Du kannst mal einen Blick auf dieses Projekt werfen, vielleicht hilft Dir das weiter. Die Entwicklung begann 2011, also nach dem zuletzt verlinkten Thread:
https://www.codeproject.com/Articles/229280/Office-Programming-Helper-Indent-VB-Code
Ich habe damit nix ausprobiert, nehme aber an, dass sich damit nicht nur die Beispiele in VBA ausführen lassen, sondern auch eigener C# Code. Das folgere ich aus diesem Abschnitt:

Points of Interest
How to Write a VBA Addin
Create a new class library project that uses v2 of .NET Framework and ComVisible
The add in needs either PIA or Visual Studio Tools for Office
Add the following references:
System
System.Windows.Forms
Extensibility = Microsoft Add-In Designer
Microsoft.Vbe.Interop
Microsoft.Office.Core
Add a class that Implements IDTExtensibility2
Write your code in C# or VB:
Bei meinen Sichtungen ist mir Interop nun öfter begegnet. Vielleicht ist das sinnvoll für weitere Rechercheansätze deinerseits.
Viele Grüße,
Zwenn
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

C# Code für VBA verfügbar machen


Schritt-für-Schritt-Anleitung

  1. C# Code vorbereiten: Stelle sicher, dass dein C# Code gut strukturiert und kommentiert ist. Du kannst Funktionen aus deinem C# Code isolieren, die du in VBA verwenden möchtest.

  2. Visual Studio einrichten: Öffne Visual Studio und erstelle ein neues Projekt. Wähle „Class Library“ aus, um eine .NET-Bibliothek zu erstellen, die von VBA aufgerufen werden kann.

  3. COM-Interop aktivieren: Stelle sicher, dass du die Option „Make Assembly COM-Visible“ aktivierst. Dies ermöglicht es Excel, deine C#-Klasse zu erkennen.

  4. Referenzen hinzufügen: Füge die notwendigen COM-Referenzen in deinem Projekt hinzu. Du benötigst:

    • Microsoft.Office.Interop.Excel
    • Microsoft.Vbe.Interop
  5. Klasse implementieren: Erstelle eine Klasse, die die benötigten Methoden enthält. Verwende das Attribut [ComVisible(true)], um sicherzustellen, dass deine Klasse von VBA aufgerufen werden kann.

  6. Kompilieren und Registrieren: Kompiliere das Projekt und registriere die DLL-Datei im Windows-Registry mit regasm. Dies kannst du über die Eingabeaufforderung tun:

    regasm /codebase deinProjekt.dll
  7. VBA integrieren: Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten. Du kannst dann den C# Code aufrufen:

    Dim obj As New DeineCSharpKlasse
    obj.DeineMethode

Häufige Fehler und Lösungen

  • Fehler beim Registrieren der DLL: Stelle sicher, dass du die Eingabeaufforderung als Administrator ausführst, wenn du die DLL registrierst.

  • Methoden nicht gefunden: Überprüfe, ob deine Methoden im C# Code als public deklariert sind und das Attribut [ComVisible(true)] gesetzt ist.

  • Kompatibilitätsprobleme: Achte darauf, dass die .NET-Version mit der Version von Excel kompatibel ist, die du verwendest.


Alternative Methoden

  • VBA über PowerShell: Eine Möglichkeit ist, PowerShell zu verwenden, um C# Code auszuführen. Dies kann eine gute Lösung sein, wenn du nicht alles in VBA umschreiben möchtest.

  • Python in Excel einbinden: Wenn du mit Python vertraut bist, kannst du Python-Skripte in Excel verwenden und diese dann mit C# aufrufen.

  • Excel C# Makros: Du kannst auch C# Makros direkt in Excel verwenden, indem du die VSTO (Visual Studio Tools for Office) verwendest. Dies ist eine leistungsstarke Alternative zu VBA.


Praktische Beispiele

  1. Einfaches Beispiel für eine C# Methode:

    using System.Runtime.InteropServices;
    
    [ComVisible(true)]
    public class MeineKlasse
    {
       public void SageHallo()
       {
           System.Windows.Forms.MessageBox.Show("Hallo von C#");
       }
    }
  2. Aufruf in VBA:

    Sub TestCSharp()
       Dim obj As New MeineKlasse
       obj.SageHallo
    End Sub

Tipps für Profis

  • Code-Optimierung: Achte darauf, deinen C# Code so zu optimieren, dass er die Anforderungen von Excel erfüllt, ohne unnötige Ressourcen zu verbrauchen.

  • Debugging: Nutze die Debugging-Tools in Visual Studio, um sicherzustellen, dass dein C# Code fehlerfrei funktioniert, bevor du ihn in Excel verwendest.

  • Dokumentation: Halte deine C# Funktionen gut dokumentiert, um die Wartbarkeit zu erhöhen, besonders wenn andere Benutzer deinen Code in VBA verwenden werden.


FAQ: Häufige Fragen

1. Kann ich C# Code direkt in Excel verwenden? Ja, du kannst C# Code als COM-Objekt in Excel einbinden und dann in VBA aufrufen.

2. Ist es sinnvoll, C# anstelle von VBA zu verwenden? Es hängt von der Komplexität und den Anforderungen deines Projekts ab. C# bietet mehr Flexibilität und Funktionalität, während VBA einfacher zu lernen und zu implementieren ist.

3. Wie kann ich C# und VBA kombinieren? Du kannst C# Code als DLL erstellen und dann in deinem VBA-Projekt aufrufen, um die Vorteile beider Sprachen zu nutzen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige