VBA zu exe wie?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von Engelchen.

    VBA zu exe wie?

    Hallo ich suche jemanden, der mir helfen kann eine Exe Datei zu erstellen;
    In Sachen Programmiersprachen kenne ich mich noch gar nicht aus. Das Makro ist bereits fertig, jetzt geht es ans Eingemachte. :D
    Nun möchte ich diese Makro als exe datei in Visual Code programmieren. Ziel wäre es dann diese exe in ein Programm einzubetten, welche dann automatisiert Spalten in einem Report ersetzt und oder löscht und Datum per Eingabemaske eintippert. Somit hätte ich dieses Problem bewältigt und etwas zum ersten mal automatisiert.
    Könnte mir da bitte einer helfen? Ich bin neu hier und falls ihr Fragen habt, nicht verzagen, einfach Fragen.

    von Tipps&Tricks wegverschoben ~VaporiZed
    <Insert funny signature here>

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Quellcode

    1. Dim StartDatum As String ' Dies erstellt eine Eingabemaske, wo man erneut das Startdatum eingeben muss
    2. Dim EndDatum As String ' Hier ist das Enddatum an der Reihe
    3. StartDatum = InputBox("Start-Datum:", "Eingabe", Format(Now, "YYYYMMDD")) ' Hier werden jeweils InputBoxen generiert im Format YYYYMMDD
    4. EndDatum = InputBox("End-Datum:", "Eingabe", Format(Now, "YYYYMMDD")) ' Das Gleiche gilt für das End-Datum
    5. Columns("D:D").Select ' Springe zur Spalte D
    6. Cells.Replace _
    7. What:="Startdatum im Format JJJJMMTT",
    8. Replacement:=StartDatum,
    9. LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False,
    10. SearchFormat:=False, ReplaceFormat:=False



    Erkennt der Compiler nicht als Programmiersprache, das ist mir auch klar, nur wie umschreibe ich sowas?
    <Insert funny signature here>

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()

    Ziemlich abenteuerlich, deine Anfrage.
    Da ist nicht nur eine Ungereimtheit vergraben.
    Sondern auch sehr viele unverständliche Formulierungen.
    Du weisst vermutlich selbst nicht genau, was du willst und wo du ansetzen sollst.

    Einigen wir uns erst mal auf eine Entwicklungsumgebung.
    Dein Code ist VBA. Der läuft innerhalb Excel. Davon kannst du keine EXE erstellen.
    Aber relativ einfach Excel-Arbeitsmappen einlesen und modifzieren.

    Du sprichst von Visual Code als Programmierumgebung. Meinst du Visual Studio oder Visual Studio Code oder was ganz anderes?

    Um eine EXE zu generieren, wäre Visual Studio als Entwicklungsumgebung und VB.Net als Programmiersprache eine Möglichkeit.
    Um damit eine Excel-Datei zu modifizieren, musst du geeignete Bibliotheken dazu binden.

    Engelchen schrieb:

    Ziel wäre es dann diese exe in ein Programm einzubetten
    Ein EXE ist bereits ein eigenständiges Programm.
    Worin willst du die einbetten?


    Vielleicht versuchst du mal, deine Wünsche verständlich auszudrücken, dann lässt sich bestimmt eine Lösung finden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Huch, es tut mir leid, dass ich mich unverständlich ausgedrückt habe, ich bin noch relativ neu in diesem Segment.
    VIsual Studio meine ich.
    Ich möchte die EXE in ein Warenwirtschaftssystem einbetten, die dann einen Report in Excel automatisch bearbeitet.

    Wenn ich den VBA Code in Visual Studio eintipper, steht überall Methodenargumente müssen in Klammern stehen.
    Mir wurde gesagt ich soll das dann in C# schreiben. Nur hab ich noch nie in C# geschrieben, geschweige denn, dass ich irgendeine Programmiersprache beherrsche.
    <Insert funny signature here>

    Engelchen schrieb:

    Ziel wäre es dann diese exe in ein Programm einzubetten
    Ja, es gibt ein paar Unterschiede zwischen VBA und VB.Net,
    Zum Beispiel, dass bei Aufruf einer Sub die Aufrufparameter geklammert werden müssen.
    Aber das ist nur Syntax.

    Deine größere Herausforderung ist der Umgang mit Excel-Tabellen.
    Weil in Excel-VBA ist das Excel-Objektmodell eingebettet.
    In allen anderen Umgebungen (wie z.B. VB.Net) nicht, da musst du zusätzliche DLLs und Verweise integrieren.
    Wie hast du das vor zu lösen?

    Im übrigen sehe ich es als einfacher an, von VBA nach VB.Net zu migrieren, als nach C#.
    Da ist zumindest die Syntax ähnlich.
    C# und VB.Net sind beide an .Net gekoppelt und können beide ungefähr das Gleiche, nur halt mit unterschiedlicher Syntax.
    Es gibt auch Konverter, die von der einen in die andere Sprache übersetzen, aber wenn du keine anderen Vorgaben hast, dann migriere VBA nach VB.Net. Da sind noch genügend Stolperfallen dabei.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Okay, was ich nur noch nicht verstehe, ist:
    Wenn ich das Makro umschreiben will, dann steht da ja dann dort Collums(D:D), woran erkennt VB.net jetzt zu welcher Spalte er springen muss?

    Quellcode

    1. Columns("D:D").Select ' Springe zur Spalte D
    2. Cells.Replace _
    3. What:="Startdatum im Format JJJJMMTT",
    4. Replacement:=StartDatum,
    5. LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False,
    6. SearchFormat:=False, ReplaceFormat:=False

    Wie übersetze ich das für den Compiler?


    Glaube meine Vorgabe wäre C#.
    Aber eingentlich wäre die Hauptsache dass am Ende eine Exe da ist.

    <Insert funny signature here>

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „EaranMaleasi“ ()

    Erst mal muss dein Programm wissen, dass es sich um Excel handelt.
    Dafür musst du die passende Umgebung dazu laden (Stichwort Office.Interop).
    Dann kannst du die Excel-Datei öffnen und hast auch Zugriff auf die Sheets, Columns und Cells usw.

    Lies dich mal hier ein:
    docs.microsoft.com/de-de/previ…cel-from-visual-basic-net
    Wenn dein Vorgabe C# ist:
    docs.microsoft.com/de-de/previ…omate-excel-from-visual-c


    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ist doch in dem Link Schritt für Schritt beschrieben.
    Bei welchem Schritt hängst du gerade?
    Hier nochmal der Link: https://docs.microsoft.com/de-de/previous-versions/office/troubleshoot/office-developer/automate-excel-from-visual-basic-net

    Noch eine Frage vorab: Ist sichergestellt, dass auf dem Rechner, der später die EXE ausführen soll, Microsoft Office installiert ist?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ja, später wird dort auch Office laufen.
    Ich bin gerade an dem Schritt, diesen Code zu bearbeiten, sodass ich die Makro einfügen kann, wenn ich auf den Button klicke.
    Ist das verständlich ausgedrückt?
    Soll ich mal das Makro hier posten?

    Und bei dem Link bin ich bei Punkt 6.
    Ich verstehe nicht wo ich das mit FIllitwithStrings eingeben muss.
    Und bei Punkt 9 finde ich nicht den Code den ich ersetzen soll, bisher steht nur da:

    VB.NET-Quellcode

    1. Class MainWindow
    2. Private Sub CheckBox_Checked(sender As Object, e As RoutedEventArgs)
    3. End Sub
    4. Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    5. Imports Microsoft.Office.Interop
    6. End Sub
    7. End Class

    schaue mir jetzt erstmal Videos an und kucke ob ich das verstehe.

    Da nun mehr als nur Pseudo-Code vorahnden ist:
    Code-Tags eingefügt ~ EaranMaleasi

    <Insert funny signature here>

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „EaranMaleasi“ ()

    Oh je.
    Da müssen wir ja erst mal ganz von vorne mit den Grundlagen anfangen.
    Zuerst musst du entscheiden, ob dein Programm später mit GUI oder im Hintergrund als Konsolprogramm ausgeführt werden soll.
    Wie soll deine EXE denn in das Warenwirtschaftssystem integriert werden?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Kein Grund dafür, denke ich.
    Das Programm könnte per Doppelklick ausgeführt werden können und wird irgendwie ausführbar gemacht, wie - das überlasse ich jemand anderem.
    Ich habe jetzt herausgefunden wie ich die Excel öffne per Mausklick auf den Button und Jetzt frage ich mich wie er etwas sucht und ersetzt denn das muss ja umgeschrieben werden

    Cells.Replace _
    What:="Startdatum im Format JJJJMMTT", _
    Replacement:=StartDatum, _
    LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _
    SearchFormat:=False, ReplaceFormat:=False

    Das zum Beispiel.
    Wie ginge das?

    Habe es herausgefunden, es geht mit:

    VB.NET-Quellcode

    1. MyExcel.Range("D:D").Select()
    2. MyExcel.Range("D:D").Replace(("Startdatum im Format JJJJMMTT"), StartDatum)

    oder? also auf jeden fall funktioniert es :)

    Kann ich dich weiter fragen wie es mit dem folgenden Problem aussieht?

    VB.NET-Quellcode

    1. Dim loLetzte As Long
    2. With Worksheets("Sheet1")
    3. loLetzte = .Cells(.Rows.Count, "A").End(xlUp).Row
    4. If WorksheetFunction.CountBlank(.Range("H2:H" & loLetzte)) > 0 Then
    5. .Range("H2:H" & loLetzte).SpecialCells(xlCellTypeBlanks) = 0
    6. End If
    7. End With


    Wie umschreibe ich das?

    Bzw. kannst du mir einen Anhaltspunkt geben wie ich sowas googlen soll?
    Ich verstehe noch nicht ganz ob ich da vb.net oder visual studio dazu geben muss oder nur vba? weil das alles echt neu ist.

    Da nun mehr als nur Pseudo-Code vorahnden ist:
    Code-Tags eingefügt ~ EaranMaleasi

    <Insert funny signature here>

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „EaranMaleasi“ ()

    Engelchen schrieb:

    MyExcel.Range("D:D").Select()
    MyExcel.Range("D:D").Replace(("Startdatum im Format JJJJMMTT"), StartDatum)

    .Select wird zwar vom Macrorecorder häufig verwendet, ist aber schlechter Stil.
    Und in dem Fall völlig unnötig. Lass es weg.

    Engelchen schrieb:

    Dim loLetzte As Long
    With Worksheets("Sheet1")
    loLetzte = .Cells(.Rows.Count, "A").End(xlUp).Row
    If WorksheetFunction.CountBlank(.Range("H2:H" & loLetzte)) > 0 Then
    .Range("H2:H" & loLetzte).SpecialCells(xlCellTypeBlanks) = 0
    End If
    End With
    Du musst dir gewärtig werden, dass Worksheets ein Objekt innerhalb myExcel ist.
    myExcel ist die Arbeitsmappe.
    Dass der erste Zeil funktioniert hat, ist dem Umstand geschuldet, dass die Replace-Funktion auch auf der Arbeitsmappe angewendet werden kann.

    VB.NET-Quellcode

    1. ​Dim loLetzte As Long
    2. With MyExcel.Worksheets("Sheet1")
    3. loLetzte = .Cells(.Rows.Count, "A").End(xlUp).Row
    4. If ExcelApp.WorksheetFunction.CountBlank(.Range("H2:H" & loLetzte)) > 0 Then
    5. .Range("H2:H" & loLetzte).SpecialCells(xlCellTypeBlanks) = 0
    6. End If
    7. End With

    WorksheetFunction ist ein Objekt der Excel Application.
    Ich sehe in deinem Code nicht, wie die bei dir heißt.
    Ich habe sie mal ExcelApp genannt.

    Und noch was: Verwende Code-Tags, wenn du Code veröffentlichst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Super vielen Dank,
    ich bin schon fast fertig.
    Jetzt woltle ich noch eine letzte Sache wissen, wie geht das, dass ich

    Quellcode

    1. Dim StartDatum As String
    2. Dim EndDatum As String
    3. StartDatum = InputBox("Start-Datum:", "Eingabe", Format(Now, "YYYYMMDD"))
    4. EndDatum = InputBox("End-Datum:", "Eingabe", Format(Now, "YYYYMMDD"))


    Gleichzeitig in einem spezifischen Ordner speichere mit dem Namen 123_StartDatum_EndDatum.xls ?

    Macht man das mit MyExcel.SaveAs(FileName) und wenn ja wie gebe ich die Parameter Start Datum und End Datum ein



    Und wo finde ich die ANweisung zu einer Erstellung einer exe datei wenn der Code fertig ist?

    <Insert funny signature here>

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Engelchen“ ()

    Grundsätzlich würde StartDatum und EndDatum anstatt mittels InputBox mit einem DateTimePicker eingeben lassen.
    Dann bist du sicher, dass du ein gültiges Datum hast, das du nicht erst prüfen musst.
    Und du hast als Datentyp DateTime.
    Dann kannst du das so machen:

    VB.NET-Quellcode

    1. Dim DestinationFolder = "c:\temp"
    2. Dim DestinationFile = $"123_{StartDatum.ToString("yyyyMMdd")}_{EndDatum.ToString("yyyyMMdd")}.xlsx"
    3. MyExcel.SaveAs(IO.Path.Combine(Destinationfolder, DestinationFile), Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „petaod“ ()

    Speichert er irgendwie nicht, was tun?
    WIe muss ich denn den Code umschreiben, dass er das mittels Date TIme Picker macht? oder habe ich das falsch verstanden?
    Auf diesem Weg, wie du mir es gesagt hast, funktioniert der Code nicht. Er sagt zwar keinen Fehler an, trotzdem speichert er am Ende nicht unter meinem angegebem Pfad.

    Schönes Wochenende!
    <Insert funny signature here>

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Engelchen“ ()