Sub aus Modul Abrufen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Sub aus Modul Abrufen

    Hallöchen,

    ich wollte in einer Form ein Modul abrufen, erhalte aber eine Fehlermeldung (siehe Bild 1)...
    ist vermutlich nur etwas kleines aber wichtiges :) hatte sowas bisher nur mit VBA gemacht.

    freue mich über Feedback.

    Das Modul

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module rkl_mwst
    2. Sub Mwstv1()
    3. With rkl_mwstrechner
    4. 'deklaration
    5. Dim net As Double = CDbl(.tb_netto.Text), count As Double = CDbl(.nud_count.Text), mwstA As Double = CDbl(0.07), mwstB As Double = CDbl(0.19)
    6. 'ea stück
    7. Dim eat7 As Double = Math.Round(CDbl((net * (mwstA + 1)) / 10), 2), eat19 As Double = Math.Round(CDbl((net * (mwstB + 1)) / 10), 2)
    8. 'steuer und summe ohne ea
    9. .tb_7a.Text = Math.Round(CDbl(net * count * mwstA), 2)
    10. .tb_7b.Text = Math.Round(CDbl(net * count + .tb_7a.Text), 2)
    11. .tb_19a.Text = Math.Round(CDbl(net * count * mwstB), 2)
    12. .tb_19b.Text = Math.Round(CDbl(net * count + .tb_19a.Text), 2)
    13. 'befreit
    14. If .cb_befreit.Checked = True Then
    15. .tb_ea7.Text = 0
    16. .tb_ea19.Text = 0
    17. .cb_asone.Enabled = False
    18. .cb_asone.Checked = False
    19. ElseIf .cb_befreit.Checked = False Then
    20. .cb_asone.Enabled = True
    21. 'ea gesamt
    22. If eat7 < 10 And eat7 > 5 Then .tb_ea7.Text = Math.Round(CDbl(eat7 * count), 2)
    23. If eat7 < 5 Then .tb_ea7.Text = Math.Round(CDbl(5 * count), 2)
    24. If eat7 > 10 Then .tb_ea7.Text = Math.Round(CDbl(10 * count), 2)
    25. If eat19 < 10 And eat19 > 5 Then .tb_ea19.Text = Math.Round(CDbl(eat19 * count), 2)
    26. If eat19 < 5 Then .tb_ea19.Text = Math.Round(CDbl(5 * count), 2)
    27. If eat19 > 10 Then .tb_ea19.Text = Math.Round(CDbl(10 * count), 2)
    28. 'count as one
    29. If .cb_asone.Checked = True Then
    30. .tb_ea7.Text = Math.Round(CDbl(.tb_ea7.Text / 2))
    31. .tb_ea19.Text = Math.Round(CDbl(.tb_ea19.Text / 2))
    32. End If
    33. End If
    34. 'summe mit ea
    35. .tb_sum7.Text = Math.Round(CDbl(.tb_7b.Text - .tb_ea7.Text), 2)
    36. .tb_sum19.Text = Math.Round(CDbl(.tb_19b.Text - .tb_ea19.Text), 2)
    37. 'differenz
    38. .tb_diff.Text = Math.Round(CDbl(.tb_sum19.Text - .tb_sum7.Text), 2)
    39. End With
    40. End Sub




    Die Form

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class rkl_mwstrechner
    2. Private Sub b_calc_Click(sender As Object, e As EventArgs) Handles b_calc.Click
    3. rkl_mwst.Mwstv1()
    4. End Sub


    Bilder
    • Bild 1.PNG

      54,64 kB, 483×439, 127 mal angesehen
    @Sam85 Das geht nicht, es sei denn, Du übergibst die Instanz der aufzurufenden Klasse als Parameter.
    Das selbe gilt für vergleichbare Aufrufe aus Shared Prozeduren heraus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Sam85 schrieb:

    Oder funktioniert das anders?
    Offensichtlich.
    In VBA, VB6 und so gibt es keine expliziten Instanzen. Module und Shared Variablen / Shared Prozeduren stehen "instanzlos" in dem Raum.
    Das kannst Du testen, indem Du mit Me die eigene Instanz abfragst. Wo das nicht geht (=> Compilerfehler), kannst Du keine Prozeduren aufrufen, die in einer zu instanziierenden Klasse liegen.
    Das sind wichtige Grundbegriffe der objektorientierten Programmierung, da solltest Du Dich mal mit befassen, bevor Du hier weitermachst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    In VBA, VB6 und so gibt es keine expliziten Instanzen.
    Das stimmt so nicht.
    Das "einzige" Problem ist, dass man keine eigenen Klassen programmieren kann.
    Also es gibt durchaus Klassen in VBA/VB6, allerdings nur vorgegebene.
    VBA/VB6 würde ich daher als "bedingt objektorientiert" bezeichnen.

    Und wenn ich mich recht erinnere, konnte man sogar Structures definieren in VB6 - aber nicht in der Freeware-Version.

    Wie dem auch sei: Klassen und Instanzen von Klassen gibts durchaus auch in VBA/VB6.

    ErfinderDesRades schrieb:

    Das "einzige" Problem ist, dass man keine eigenen Klassen programmieren kann.
    Und selbst da möchte ich widersprechen.
    Man kann eigene Klassen programmieren und diese auch mehrfach instantiieren.
    Was jedoch nicht unterstützt ist, ist Vererbung.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --