Probleme Variable

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von EdgarKraft.

    Probleme Variable

    Moin,

    Ich habe Probleme bei der Deklaration von Variablen
    Ich habe ein Userform erstellt mir der ich eine Tabelle füllen möchte.
    Wobei ich Textboxen und ComboBoxen benutze.
    Die Combobox sorgt für eine Ausgabe die an Bedingungen geknüpft ist.
    Ich habe hier einmal meinen Code

    Visual Basic-Quellcode

    1. Private Sub Erstellen_Click()
    2. ' Variablen Deklaration
    3. Dim Ausgangsdatum As Date
    4. Ausgangdsdatum = TextBox2.Value
    5. Dim ReportInt As Integer
    6. ReportInt = Worksheets("Makrodaten").Range("D5")
    7. 'Quickcheck
    8. Dim Quick As Long
    9. Quick = Worksheets("Makrodaten").Range("C7")
    10. Dim QuickMo As Integer
    11. QuickMo = Worksheets("Makrodaten").Range("D7")
    12. Dim QuickTa As Integer
    13. QuickTa = Worksheets("Makrodaten").Range("H7")
    14. Dim QuickNews As Integer
    15. QuickNews = Worksheets("Makrodaten").Range("F7")
    16. 'Hinzufügen von Kundenname, Stardatum, Kursart, Incentive Anzahl
    17. Dim neuezeile As Long
    18. neuezeile = Cells(Rows.Count, 1).End(xlUp).Row + 1
    19. Cells(neuezeile, 1) = TextBox1.Value
    20. Cells(neuezeile, 5) = TextBox2.Value
    21. Cells(neuezeile, 3) = ComboBox1.Value
    22. Cells(neuezeile, 4) = ComboBox2.Value
    23. ' Folge Auswahl Quickcheck
    24. If ComboBox1.Value = Quick Then
    25. Cells(neuezeile, 6) = DateAdd("m", ReportInt, Ausgangdsdatum)
    26. End If
    27. Unload UserForm1
    28. End Sub
    29. Private Sub TextBox2_AfterUpdate()
    30. TextBox2 = Format(TextBox2, "DD.MM.YYYY")
    31. End Sub
    32. Private Sub TextBox2_Change()
    33. End Sub
    34. Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    35. If Not IsDate(TextBox2) Then
    36. TextBox2 = ""
    37. Cancel = True
    38. End If
    39. End Sub
    40. Private Sub UserForm_Activate()
    41. End Sub
    42. Private Sub UserForm_Click()
    43. End Sub
    44. Private Sub UserForm_Initialize()
    45. letzte = Worksheets("Makrodaten").Range("C" & Rows.Count).End(xlUp).Row
    46. For i = 1 To letzte
    47. ComboBox1.AddItem Sheets("Makrodaten").Cells(i + 6, 3)
    48. Next i
    49. With ComboBox2
    50. .AddItem "1"
    51. .AddItem "2"
    52. .AddItem "3"
    53. .AddItem "4"
    54. .AddItem "5"
    55. .AddItem "6"
    56. .AddItem "7"
    57. .AddItem "8"
    58. End With
    59. End Sub


    Mein Problem befindet sich in der Zeile

    Quick = Worksheets("Makrodaten").Range("C7")

    Hier zeigt er mir immer den Fehler "13" an.
    Ich wollte diesmal mit Variablen arbeiten da mich mehrer Forenuser darauf aufmerksamer gemacht haben, dass dies so saubrer wäre.
    Leider geht das nicht
    Alle anderen Variablen kann ich normal verwenden

    Wenn ich dann weiter unten
    If ComboBox1.Value = Quick Then
    Quick durch Worksheets("Makrodaten").Range("C7") ersetzte macht er genau das was ich will.

    Alle anderen Variablen funktionieren komischerweise. Der Teufel steckt wohl im Detail.

    Anbei befindet sich eine Testdatei zu der Problematik.

    Ich möchte mich aufjedenfall auf die Zellen im Zweiten Blatt referenzieren.
    Da ich diese Tabelle weitergebe und es sein kann das mein Kollege die Zeiträume ein wenig verändern muss.
    Dies kann er dann einfach durch das ändern der Zellen machen ohne den Code zu verändern.

    Mit freundlichen Grüßen Edgar Kraft
    Dateien
    Hi,
    in VBA müssen alle Referenztypen mit dem Befehlt "SET" zugewiesen werden.

    Also ein Integer zB geht:

    Visual Basic-Quellcode

    1. Dim i as Integer
    2. i=12

    Sämtliche "Objekte"

    Visual Basic-Quellcode

    1. Dim r as range
    2. set r = worksheet(1).Range("C7")


    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    Moin Danke für die schnelle Hilfe,

    Ich habe es ausprobiert und es funktioniert.

    Ich habe aber auch Dim as String ausprobiert und das geht auch wunderbar.

    Wo genau ist das der Unterschied?

    Kann ich String nur so lange benutzen solange ich mich genau auf eine Zelle mit einem Text referenziere?

    EdgarKraft schrieb:

    Quick = Worksheets("Makrodaten").Range("C7")
    Das ist ein Range-Objekt und müsste mit Set zugewiesen werden.

    Visual Basic-Quellcode

    1. Set CellC7 = Worksheets("Makrodaten").Range("C7")

    Was du aber eigentlich möchtest ist

    Visual Basic-Quellcode

    1. Quick = Worksheets("Makrodaten").Range("C7").Value
    bzw. um sicher zu gehen, dass du für dein Long auch eine Zahl bekommst

    Visual Basic-Quellcode

    1. ​Quick = Val(Worksheets("Makrodaten").Range("C7").Value)

    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Das Thema ist ziemlich umfangreich.
    Ein kleiner Exkurs.

    In VBA würde ich dir empfehlen in der ersten Zeile jedes Moduls/Class Option Explicit zu schreiben.
    Damit erzwingst du, dass du jede Variable deklarieren musst.

    Alle Variablen haben irgendeinen Typ.
    Schreibst du zB

    Visual Basic-Quellcode

    1. i = 34
    2. Debug.Print (TypeName(i))


    Dann erhälst du Integer.
    Es ist möglich in VBA auf explizite Datentypen zu verzichten. Aber dabei kommt man schnell zu Problemen deren Ursprung man dann oft nur schwer erkennt, vor allem als "Beginner".
    Grundsätzlich gibt es in VBA die Wertetypen, die man eben einfach zuweisen kann. Der Hintergrund ist kurz angerissen das diese Daten tatsächlich mit ihrem Wert auf dem Stack liegen.
    Diese sind von der Größe her begrenzt und daher kann man sie dort speichern und laden.

    Die sogenannten Referenztypen sind jene Variablen, die nahezu unbegrenzt groß werden können. Zum Beispiel ein Workbook.
    Das hat zig Eigenschaften und Methoden und daher werden diese Daten auf dem Heap gespeichert.
    Der Heap ist etwas "weiter" weg, komplexer in der Speicherung und daher langsamer. Man speichert sich zu diesen Daten dann nur die Adresse wo dein Workbookobjekt liegt.

    In VBA werden diese beiden Typen unterschiedlich zugewiesen, um den Unterschied quasi zu verdeutlichen.


    Ich will da jetzt aber gar nicht näher drauf eingehen.

    Warum aber kannst du nun schreiben:

    Visual Basic-Quellcode

    1. dim s as string
    2. s=Worksheets(1).Range("C7")


    Ja das liegt an einem weiteren "Feature" aus VBA. Jeder Referenztyp kann ein sogenanntes Default Property habe.
    Bei Range ist es Value. Value kann vom Typ String sein.
    Man kann also schreiben:

    Visual Basic-Quellcode

    1. Worksheets(1).Range("C7") = "Test"


    Obwohl das eigentlich ein Range Objekt ist verwendet der Compiler dann die Eigenschaft Value vom Rangeobjekt.

    Ein weiteres Feature in VBA ist das nahezu alles was geht implizit (also nicht extra anzugeben und im Hintergrund automatisch) Typen konvertiert.
    Wenn man weiß wie das läuft kann das ein angenehmes Feature sein, aber eigentlich ist es eher ein Fallstrick gerade wenn man anfängt programmieren zu lernen.

    Abschließend vll noch. Das Thema Datentypen ist ein Grundlagenthema in der Programmierung. Wenn man verstehen will was man macht dann sollte man sich damit zumindest halbwegs gut auskennen innerhalb seiner Sprache.


    LG
    Das ist meine Signatur und sie wird wunderbar sein!