Hintergrund
Letztes Jahr wurde ich gebeten, ein Tool für die Unternehmensplanung für etwa 10 Benutzer zu erstellen. Dies geschah im Auftrag eines anderen IT-Teams, das die Arbeit an mich "vergeben" hatte, und da die Projektfristen auf ihrer Seite ein wenig ungeplant waren, musste ich sie schnell umsetzen.
Zu dieser Zeit entschieden wir, dass die schnellste Möglichkeit darin besteht, eine Excel-Arbeitsmappe mit VBA zu erstellen und die Benutzer dann diese VBA-erweiterte Arbeitsmappe aus einem Intranet herunterladen zu lassen, um sie auf ihren PCs zu verwenden. Excel war in diesem Fall eine Einschränkung, da das von uns verwendete Planungssystem (dh die Datenbank) nur über ein Excel-Add-In interagieren kann, das geladen werden muss, wenn die Planungsarbeitsmappe geöffnet ist. VBA war zu diesem Zeitpunkt jedoch keine Einschränkung.
In der Arbeitsmappe habe ich rund 4.000 Zeilen VBA-Code erstellt. Obwohl ich versucht habe, Daten- und Präsentationsebenen zu trennen, konnte ich dies aufgrund der Projektfristen nicht in allen Fällen tun. Um ehrlich zu sein, bin ich zwar stolz darauf, dieses Arbeitsbuch zu erstellen, gleichzeitig aber etwas enttäuscht darüber, dass es sowohl hinsichtlich der Codierung als auch der Bereitstellung für die Benutzer besser hätte durchgeführt werden können.
Heute
Zurück zu heute und das IT-Team ist wieder zu mir gekommen, um eine ähnliche Arbeitsmappe anzufordern (damit ich Teile der anderen Arbeitsmappe oben wiederverwenden kann), aber diesmal ist es viel komplizierter und wird von einer größeren Anzahl von Benutzern verwendet ( etwa 200).
Dieses Mal ist es jedoch etwas besser geplant und ich kann sehen, dass wir etwas mehr Zeit haben, um Dinge zu planen. Auf dieser Grundlage habe ich über die Lösung und Infrastruktur nachgedacht, da die Programmierung für 100 Benutzer eine größere Auswirkung hat als für 10 Benutzer. Aus diesem Grund schlug ich dem Team vor, den vorhandenen Code möglicherweise auf eine C # -Lösung zu migrieren, damit der Code genauer verwaltet werden kann. Ich betrachte es immer noch als Add-In, das mit VSTO / Excel-DNA geschrieben wurde und dann für die Benutzer bereitgestellt werden kann.
Ich habe dies vor zwei Wochen mit dem IT-Team besprochen und alles schien in Ordnung zu sein. Bis gestern erhielt ich eine E-Mail von einem Teammitglied (das weder VBA noch C # kennt), in der gefragt wurde, warum wir dieses neue Projekt in C # starten sollen, anstatt das zu verwenden Gleicher Ansatz wie zuvor. Einige ihrer Anliegen waren:
- Es ist ein ziemlich wichtiges Projekt, daher muss es funktionieren - eine C # -Lösung wäre nicht so stabil oder funktioniert nicht so gut wie die vorhandene VBA-basierte Lösung.
- Wir müssten verwerfen, was wir in der VBA-Lösung getan hatten, und es in C # von Grund auf neu erstellen.
- Jemand muss zwei separate Lösungen unterstützen, eine in VBA und eine in C #. [Eigentlich haben sie derzeit niemanden, den ich normalerweise unterstütze].
Jetzt kann ich einige ihrer Bedenken bis zu einem gewissen Grad verstehen, aber ich muss eine Entscheidung über die nächsten Schritte treffen und darüber, womit ich zu ihnen zurückkehren soll. Persönlich würde ich gerne in C # implementieren, da ich der Meinung bin, dass es sich besser eignet, eine "Enterprise" -Lösung wie diese zu erstellen. Darüber hinaus möchte ich diese Gelegenheit nutzen, um meine C # -Fähigkeiten aufzufrischen, da ich derzeit nicht so kompetent in C # bin wie VBA, und ich möchte, dass ein Projekt wie dieses mich auf die "nächste Ebene" bringt.
Ich habe eine Liste mit Punkten erstellt, mit denen ich versuchen könnte, sie davon zu überzeugen, dass eine C # -Lösung für dieses Projekt besser wäre. Das habe ich bisher:
- Unit-Test.
- Quellcodeverwaltung.
- Code-Dokumentation - zum Wissenstransfer an andere Support-Personen.
- Bessere Kodierungskonventionen - können Dinge wie ReSharper verwenden, um eine bessere Benennung und Struktur zu erzwingen.
- Bessere IDE - weniger Fehler durch Fehlerhervorhebung.
- Mehr Modularität durch Baugruppen - kann die Wiederverwendung in zukünftigen Werkzeugen fördern.
- Verwaltete Bereitstellung - kann steuern, von wem dieses Tool verwendet wird.
Frage: Welche weiteren Punkte könnte ich hinzufügen, um sie zu überzeugen? Oder versuche ich mehr abzubeißen, als ich mit diesem Projekt kauen kann? Soll ich es trotzdem in VBA machen?
Mir ist bewusst, dass der Wechsel zu einer neuen Sprache, weil sie "neuer" oder "cooler" ist, keine Grundlage für eine Entscheidung sein sollte. Ich habe mich daher geweigert, sie als Entscheidungspunkt aufzunehmen - hier geht es um Fakten.
Außerdem fordere ich keinen wörtlichen Vergleich zwischen C # und VBA als Sprachen, da es zahlreiche Vergleiche zu SO gibt.
quelle
Antworten:
Die drei Punkte, die Sie aufgelistet haben, scheinen fair zu sein:
In der Tat sagen Sie später: "Ich möchte diese Gelegenheit nutzen, um meine C # -Fähigkeiten aufzufrischen, da ich derzeit nicht so kompetent in C # bin wie ich VBA bin " (Hervorhebung von mir).
Mit anderen Worten, Sie haben eine Lösung, die funktioniert und intensive Benutzertests durchlaufen hat. Du willst das alles werfen und alles in einer Sprache umschreiben, die du nicht gut kennst. Sehen Sie das Problem?
Dinge, die Sie niemals tun sollten, fallen Ihnen ein . Sie werfen den Code sowie die Benutzertests. Keine gute Sache.
Wenn die VBA-Version weiterhin verwendet wird, ist das Umschreiben in der Tat noch problematischer. Warum sollten Sie zwei unterschiedliche Systeme haben, die Ihre Aufmerksamkeit erfordern, wenn Sie vielleicht nur eines haben, das bereits funktioniert und das Sie überarbeiten und Funktionen hinzufügen können?
Einige Ihrer Punkte können dagegen kritisiert werden:
Unit-Test.
Sie können auch Ihr aktuelles Projekt Unit-testen. Wenn es dafür keinen geeigneten Rahmen gibt, erstellen Sie einen.
Quellcodeverwaltung.
Die Quellcodeverwaltung befasst sich mit Text. Ihr aktueller Code ist Text, daher können Sie die Quellcodeverwaltung verwenden.
Die Sprache, das Betriebssystem, das Framework oder das Ökosystem sind völlig irrelevant. Sie können (und sollten) die Quellcodeverwaltung für jeden Code verwenden, den Sie schreiben: Code in Visual Studio oder Code, den Sie in wenigen Minuten in LINQPad erstellen, oder PowerShell-Skripts, die eine Aufgabe, ein Datenbankschema oder Excel-Makros automatisieren .
Code-Dokumentation - zum Wissenstransfer an andere Support-Personen.
Einverstanden.
Bessere Kodierungskonventionen - können Dinge wie ReSharper verwenden, um eine bessere Benennung und Struktur zu erzwingen.
Definiere "besser". Gibt es Kodierungskonventionen für Excel-Makros? Wenn ja, verwenden Sie sie: Sie sind nicht besser oder schlechter als alle anderen. Wenn nicht, erstellen Sie diese und veröffentlichen Sie sie, damit auch andere Personen sie verwenden können. Die Antworten auf eine Frage aus dem Jahr 2010 scheinen eher enttäuschend, aber seitdem sind möglicherweise neue Tools verfügbar.
Beachten Sie, dass der wichtige Teil der Codierungskonventionen darin besteht, dass sie beim Festschreiben erzwungen werden sollen.
Bessere IDE - weniger Fehler durch Fehlerhervorhebung.
Einverstanden. Die Tatsache, dass wir in Visual Studio keine Makros schreiben können, ist sehr bedauerlich.
Mehr Modularität durch Baugruppen - kann die Wiederverwendung in zukünftigen Werkzeugen fördern.
Ich bin mir ziemlich sicher, dass Ihr aktuelles Produkt auch einen gewissen Grad an Modularität aufweisen kann.
Verwaltete Bereitstellung - kann steuern, von wem dieses Tool verwendet wird.
Einverstanden.
Anstelle eines vollständigen Umschreibens können Sie auch nach einer Möglichkeit suchen , Code schrittweise aus dem Makro in eine in VB.NET geschriebene normale Assembly zu verschieben. Warum in VB.NET? Drei Gründe:
Es gibt weniger Unterschiede zwischen VBA und VB.NET als zwischen VBA und C #.
Sie kennen VBA besser und dies allein ist ein guter Grund, VB.NET anstelle von C # zu verwenden. Wenn Sie Ihre C # -Fähigkeiten auffrischen möchten, sollten Sie dies mit Ihren persönlichen Projekten tun, nicht mit geschäftskritischen Dingen.
Jedes Umschreiben von einer Sprache in eine andere führt zu möglichen Fehlern. Das brauchen Sie für dieses Projekt nicht.
Wenn Sie zu einer .NET-Assembly wechseln, erhalten Sie die komfortable Umgebung von Visual Studio, in der Unit-Tests, TFS- und Fehlerhervorhebungen angezeigt werden, die Sie derzeit in anderen Projekten verwenden.
Wenn Sie Ihren Code Schritt für Schritt verschieben, gehen Sie nicht das Risiko eines vollständigen Umschreibens ein (dh Sie müssen vier Monate damit verbringen, etwas zu erstellen, das aufgrund der hohen Anzahl neuer Fehler niemand verwenden möchte). Zum Beispiel müssen Sie an einer bestimmten Funktion arbeiten? Überlegen Sie zunächst, wie Sie diese spezielle Funktion nach .NET verschieben können.
Dies ist dem Refactoring ziemlich ähnlich. Anstatt das Ganze neu zu schreiben, weil Sie einige neue Designmuster und Sprachfunktionen kennengelernt haben, nehmen Sie einfach kleine Änderungen an dem Code vor, an dem Sie gerade arbeiten.
quelle
Ich würde es unterstützen, zu C # zu gehen. Andere haben Ihre Punkte sehr gut abgedeckt, so dass ich nicht wieder aufbereiten werde, was sie gesagt haben. Es gibt auf jeden Fall viele gute Gründe, bei VBA zu bleiben.
jedoch , eine meiner Arbeitgeber hat einen hervorragenden Job bei aussagekräftiger Dokumentation. So sehr, dass Konstruktionsentscheidungen tatsächlich mit Recht niedergeschrieben wurden - wenn nur alle Softwareprojekte das hätten! Mein Punkt? Eine der Entwurfsentscheidungen lautete: "Wir haben uns entschieden, dieses Programm in Java zu schreiben, weil Mr. So-and-so x Jahre Java-Erfahrung in seinen Lebenslauf aufnehmen möchte." Wenn dies ein wichtiger Grund für Sie ist, zu C # zu wechseln, kann dies nicht als Trivialität ignoriert werden. Es kann einfach nicht einer der Gründe sein, die Sie verwenden, um es dem IT-Team zu rechtfertigen, da sie sich nicht wirklich darum kümmern, was Sie in Ihrem Lebenslauf wollen, sondern um das funktionierende Produkt.
Es gibt auch die Wahrnehmung von VBA zu bedenken. Ich weiß, dass es nicht wahr ist, aber ich kenne einige Leute, die 'VBA' in einem Lebenslauf sehen und denken: "Was, dieser Typ war festgefahren, um Praktika zu machen? Warum hat er keine Erfahrung mit einer echten Sprache?" Sie sehen "VBA" und denken "Excel-Makro-Entwickler". Kopieren / Einfügen einer Zelle in eine andere, Ausführen einfacher Berechnungen usw. Normalerweise sind es diejenigen, die eine echte Entwicklung in VBA zu schätzen wissen, und das scheint, zumindest nach meiner Erfahrung, ein immer kleinerer Pool zu sein. Sie haben vielleicht ein besseres Gefühl für die Wahrnehmung von VBA in Ihrer Nähe, aber ich habe viel ungerechtfertigte Negativität gesehen.
Das andere, worauf ich eingehen möchte: MainMa erwähnte die Ähnlichkeiten zwischen VBA und C #. Dies ist absolut richtig, und die Antwort von JMK bietet einige Technologien zum Nachlesen. Versuchen Sie, Ihren VBA-Code in ein C # -Projekt zu kopieren oder einzufügen, und überprüfen Sie, wie einfach die Syntaxfehler zu korrigieren sind.
Sie sagten, Sie hätten 4.000 Codezeilen, was ein gutes Stück Code ist und wahrscheinlich viele Funktionen umfasst ... aber es sind nur 4.000 Codezeilen. Versuchen Sie das Kopieren und Einfügen. Ich wäre wirklich nicht überrascht, wenn Sie diese Syntaxfehler beseitigen und ein funktionierendes Projekt haben könnten. Ohne die Details Ihres Codes oder die Menge an verfügbarer Freizeit zu kennen, würde ich denken, dass Sie dies in einem Wochenende ausschalten könnten.
Es folgt möglicherweise nicht den bewährten Methoden von C #, ist möglicherweise ineffizient, führt jedoch zu einem funktional äquivalenten Projekt in C #. Sie können auch relativ sicher sein, dass Ihr neuer C # -Code nicht fehleranfälliger ist als Ihr alter VBA-Code.
Das Konvertieren Ihres VBA-Codes in C # in Ihrer Freizeit würde ein paar Dinge für Sie tun:
Und zurück zu den drei Punkten der IT:
Wie bereits erwähnt, bietet Ihr C # -Code dieselbe Funktionalität und ist genauso stabil wie Ihr VBA. Streng genommen besteht die Möglichkeit, dass Sie Bugs / Defekte oder Ineffizienzen einführen, aber das scheint unwahrscheinlich. Es handelt sich nicht um einen Port von iOS / Objective C zu Android / Java, sondern um einen Port zwischen zwei Sprachen, die in der Syntax viele Gemeinsamkeiten aufweisen und dieselbe Technologie verwenden können - Excel-Arbeitsmappen.
Auf diese Weise werfen Sie weder Aufwand noch Code weg.
Sie haben nur 1 Lösung, alles in C #.
Alles in allem sieht Ihr Kunde viel Risiko. Wenn Sie die erforderlichen Maßnahmen ergreifen können, um dieses Risiko zu minimieren, wird möglicherweise die Änderung in C # übernommen.
quelle
Ich hasse es, es zu sagen, aber Ihre Argumente halten einfach nicht Wasser.
Unit-Test.
Dies ist seit sehr langer Zeit ein gelöstes Problem. Es gibt viele Unit-Testing-Frameworks. Wähle eins. Das hättest du schon tun sollen. Ich empfehle unsere , weil sie in die IDE integriert ist und andere großartige Funktionen bietet.
Quellcodeverwaltung
Dies ist etwas schwieriger, es gibt nur wenige fertige Lösungen, aber es geht nur darum, Ihren Code in ein Repository und aus diesem heraus zu bringen. Hier ist eine einfache Möglichkeit, es zu tun , aber es gibt auch andere bessere Optionen .
Code-Dokumentation
Auch ein gelöstes Problem. MZ-Tool verfügt über eine XML-Dokumentationsfunktion , die den XML-Kommentardokumenten von .Net sehr ähnlich ist.
Bessere Kodierungskonventionen
Genau wie Visual Studio das ReSharper-Plugin hat, haben sowohl MZ-Tools als auch Rubberduck solche Funktionen.
Bessere IDE
Auch hier gibt es Plug-Ins für die VBA-IDE.
Mehr Modularität durch Baugruppen - kann die Wiederverwendung in zukünftigen Werkzeugen fördern.
Auch ein gelöstes Problem. Nein, Sie können keine Assemblys erstellen, aber Sie können auf andere VBA-Projekte verweisen.
Verwaltete Bereitstellung - kann steuern, von wem dieses Tool verwendet wird.
Ein bisschen Aufkleber, müssen Sie Code schreiben, um zu steuern, wer auf das Programm zugreifen kann und wer nicht, aber Sie (wieder) sollten wahrscheinlich bereits Sicherheitscode geschrieben haben.
Bei der Bereitstellung handelt es sich ebenfalls um ein gelöstes Problem. Ja, es ist Code erforderlich, aber es gibt Beispiele, die Sie verwenden / ändern können .
Hinzu kommt, dass Sie von vorne anfangen würden. Auch ich werde Joel Spolskys Artikel weiterempfehlen .
Ihre IT-Leute haben Recht. Sie sollten dies nicht von Grund auf neu schreiben. Sie sollten die Probleme mit Ihrer aktuellen Lösung lösen.
Nach alledem kann ich absolut verstehen, warum Sie dies entweder in C # oder in VB.Net tun möchten. Sie sind wirklich eine bessere Lösung, wenn Sie ein neues Projekt starten , aber nach den Klängen ist es kein neues Projekt. Es ist viel besser, das zu verbessern, was man hat, als es zu brechen, indem man von vorne anfängt.
quelle
Sie können darauf hinweisen, dass sogar Microsoft in diesem Artikel Folgendes festhält:
Der Artikel befasst sich mit verschiedenen Ansätzen für die Entwicklung von Office-basierten Inhalten. Vielleicht können Sie in Ihrer Diskussion auch andere Vor- und Nachteile daraus ziehen.
quelle
Es hängt wirklich davon ab, wie Sie beabsichtigen, auf C # umzusteigen (dh welche Technologie Sie verwenden werden).
Wenn Sie OpenXML verwenden möchten, sprechen Sie von einem vollständigen Umschreiben, das, wenn Sie eine funktionierende Lösung haben, nicht empfohlen wird.
Wenn Sie über die Verwendung von Interop sprechen, stellen Sie möglicherweise fest, dass der Prozess überraschend reibungslos ist. Ich habe in der Vergangenheit viel Code von VBA nach C # (mit Interop) verschoben, und sobald Sie mit der Arbeitsmappe verbunden sind, sehen Sie folgendermaßen aus:
In vielen Fällen können Sie Ihren VBA-Code kopieren / einfügen, Funktionsaufrufe voranstellen
workbook.
, Dim gegebenenfalls durch var usw. ersetzen und am Ende Semikolons hinzufügen.Es ist im Wesentlichen dasselbe Framework wie unter (Excel), Sie ändern lediglich die Syntax von VBA in C #.
Wenn Sie fertig sind, müssen Sie die Anwendung speichern und schließen:
Dann geben Sie die Anwendung mit dem Marschall frei:
Ich würde wahrscheinlich eine Wrapper-Klasse schreiben, die IDisposable um das Excel-Anwendungsobjekt implementiert, und dann sicherstellen, dass sie verwendet wird,
using
wenn dieses Objekt verwendet wird.Ein guter Weg, um Ihre Argumente zu erörtern, besteht darin, eine Stunde oder so damit zu verbringen, was in kurzer Zeit zeigt, wie schnell Sie Code portieren können, und Ihre Kollegen davon zu überzeugen, dass dies eine gute Idee ist.
Der Code würde in gewisser Weise weitgehend unverändert bleiben, aber Sie haben alle Vorteile, die Sie für ein C # -Projekt in Visual Studio erwähnt haben.
quelle
Ich bin in der gleichen Position, eine sehr große (20k + Zeilen VBA-Code) Anwendung in eine EXCEL-Arbeitsmappe eingebaut zu haben. Beim Testen mit Office 2013 funktioniert es einfach nicht, was auf Änderungen in der Reihenfolge des Startereignisses im neuen Büromodell und möglicherweise auf eine strengere Durchsetzung von EMET zurückzuführen ist. Ich bin daher in der Lage, vor der Einführung von Office 2013 in diesem Jahr eine Absturzkonvertierung auf C # und VB.NET durchzuführen. Andere, einfachere (VBA-erweiterte) Arbeitsmappen, die in der Organisation verwendet werden, waren nicht immun, manche funktionierten und andere nicht.
Die Fehler treten im Workbook_Open- Ereignis auf, in dem die Arbeitsblätter der Arbeitsmappe nicht mehr verfügbar sind, und im internen EXCEL-Code, bevor auf einen VBA-Code verwiesen wird.
Da ich mich in VBA, C # und VB.NET wohl fühle, schreibe ich die Konvertierung in den beiden letzteren. Framework-Code wird in C # geschrieben, da ich mit den Sprach-Idiomen bestimmte Funktionskonstrukte in dieser Sprache 3-4 mal schneller schreiben kann als in VB.NET. Der Großteil des Codes befindet sich in VB.NET, da mein Umschreiben dann weniger umfangreich ist und es bestimmte Redewendungen gibt, die in C # nicht vorhanden sind.
Bevor Sie eine Entscheidung treffen, empfehle ich dringend, dass Sie die vorhandene Anwendung mit OFFICE 2013 und dem größtmöglichen Umfang der EMET-Durchsetzung, den die Organisation für die nächsten 2-3 Jahre vorsieht, testen. Vielleicht stellen Sie wie ich fest, dass die vorhandene Anwendung in dieser Umgebung ohnehin nicht ohne Umschreiben ausgeführt werden kann. In diesem Fall kann das Umschreiben auch in DOT NET und VSTO erfolgen.
Nachtrag:
Das Schreiben eines kleinen automatisierten Extraktionsprogramms, das den gesamten Inhalt der Arbeitsmappe VBA durchläuft und alle Module, Klassen und Formulare in Dateien exportiert, dauert je nach Lust und Laune 1-2 Tage. Ebenso umgekehrt, um die Dateien aus einem Verzeichnis in eine leere Arbeitsmappe zu importieren. Mit diesen beiden ist es durchaus möglich, Ihren gesamten VBA-Code in der richtigen Quellcodeverwaltung zu haben und einen Build- Prozess aus dem Quellcode für Ihre Arbeitsmappe zu erstellen.
ODER - Verwenden Sie ein kostenloses Dienstprogramm wie Excel VBA Code Cleaner
quelle
Sei ehrlich. Planen Sie, diese Informationen mit den anderen Personen zu teilen, die an dieser Entscheidung beteiligt sind? Wenn nicht, würde ich Ihnen die ganze Schuld geben, wenn das Projekt fehlschlägt. Da bereits ein ähnliches Projekt erstellt und auf den Markt gebracht wurde, hat jeder das, was er erwartet, in seinem eigenen Kopf geformt. Sie wissen, wie lange es gedauert hat, den letzten zu erstellen, und werden glauben, dass Sie diesen in kürzerer Zeit erstellen können (was möglicherweise aufgrund der zusätzlichen Anforderungen zutrifft oder nicht). Sind Sie bereit, diese Verantwortung zu übernehmen und gleichzeitig eine neue Sprache zu lernen?
Ich empfehle, die alte App so schnell wie möglich nach C # zu portieren. Vielleicht können Sie dabei genug lernen, bevor eine Entscheidung getroffen wird. Zumindest wirst du dein Ziel erreichen, deine Fähigkeiten mit der neuen Sprache zu verbessern und das Projekt trotzdem pünktlich fertig zu stellen.
Andererseits, wenn Sie das Gefühl haben, dass das Projekt so stark ist und alles auf Ihren Schultern ruht, machen Sie es so, wie Sie es wollen. Vergebung ist immer einfacher als Erlaubnis.
quelle