Schulprojekt hängt bei der Variablenübergabe ??

  • Excel

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

    Schulprojekt hängt bei der Variablenübergabe ??

    Hallo ihr Meister des VBA.

    Bitte dreht euch nicht gleich um, wenn ichr das schlampig programmierte im Anhang seht, aber ein echter Newbie hat einige Probleme.

    Wir sollen für ein Projekt eine Zugangskontrolle für 10 Teilnehmer realisieren. Dabei soll alles in einem jeweiligen Unterprogramm ablaufen. d.h. die Benutzer- und Passwortliste in einem initialisiert, die Eingaben auch in einem, die Verarbeitung auch in einem und die Ausgabe jeweils auch.
    Dabei hängt er bei der Überprüfung, ich glaube es bekommt das PW und den Beutzer nicht durchgereicht.
    Das ist so ein augenscheinlicher Fehler, ihr findet sicher 10000 mehr.

    Bitte gebt mir einen Hinweis, ich sitze da schon einige Tage dran............
    (wer sich sowas ausgedacht hat, gehört ......)

    Danke



    Visual Basic-Quellcode

    1. 'Unterprogramm Initialisierung
    2. Sub Zugangskontrolle_intialisierung()
    3. Dim BNL(1 To 10) As String
    4. Dim PWL(1 To 10) As String
    5. BNL(1) = "Peter"
    6. BNL(2) = "Paul"
    7. BNL(3) = "Pia"
    8. BNL(4) = "Petra"
    9. BNL(5) = "Hans"
    10. BNL(6) = "Klaus"
    11. BNL(7) = "Erna"
    12. BNL(8) = "Lothar"
    13. BNL(9) = "Udo"
    14. BNL(10) = "Xantippe"
    15. PWL(1) = "PW1"
    16. PWL(2) = "PW2"
    17. PWL(3) = "PW3"
    18. PWL(4) = "PW4"
    19. PWL(5) = "PW5"
    20. PWL(6) = "PW6"
    21. PWL(7) = "PW7"
    22. PWL(8) = "PW8"
    23. PWL(9) = "PW9"
    24. PWL(10) = "PW10"
    25. End Sub
    26. 'Unterprogramm Benutzernamen eingeben
    27. Sub Benutzernamen_eingabe()
    28. Dim EingabeBN As String
    29. EingabeBN = InputBox("Name:")
    30. End Sub
    31. 'Unterprogramm Passwort eingeben
    32. Sub Passwort_eingabe()
    33. Dim EingabePW As String
    34. EingabePW = InputBox("Das Passwort bitte:")
    35. End Sub
    36. 'Passwortüberprüfung
    37. Sub Ueberpruefung(ByVal EingabePW, EingabeBN As String)
    38. Dim Zugang As Boolean
    39. Dim BNL(1 To 10) As String
    40. Dim PWL(1 To 10) As String
    41. Dim i As Byte
    42. i = 1
    43. For i = 1 To 10
    44. If PWL(i) = EingabePW And BNL(i) = EingabeBN Then
    45. Zugang = True
    46. i = 11
    47. Else
    48. MsgBox "Test"
    49. End If
    50. Next i
    51. End Sub
    52. Sub Entscheidung()
    53. Dim Zugang As Boolean
    54. Anzahl_Versuche = 1
    55. For Anzahl_Versuche = 1 To 3
    56. If Zugang = True Then
    57. Zugang_erteilt
    58. Anzahl_Versuche = 4
    59. Else
    60. Anzahl_Versuche = Anzahl_Versuche + 1
    61. kein_Zugang
    62. End If
    63. Next Anzahl_Versuche
    64. End Sub
    65. 'Unterprogramm Zugang
    66. Sub Zugang_erteilt()
    67. MsgBox "Zugang!!"
    68. End Sub
    69. 'Unterprogramm Kein Zugang
    70. Sub kein_Zugang()
    71. MsgBox "Kein Zugang!!"
    72. End Sub
    73. 'Hauptprogramm!
    74. Sub Zugangskontrolle()
    75. Dim BNL(1 To 10) As String
    76. Dim PWL(1 To 10) As String
    77. Dim EingabeBN As String
    78. Dim EingabePW As String
    79. Zugangskontrolle_intialisierung
    80. Benutzernamen_eingabe
    81. Passwort_eingabe
    82. Ueberpruefung
    83. Entscheidung
    84. End Sub
    Wenn du innerhalb einer Routine (eines sub) die Variablen mit DIM initialisierst, stehen diese VAriablen nur innerhalb der Routine zur Verfügung.

    Da du die Variablen aber in verschiedenen Subs benötigst, musst du sie anstatt mit Dim mit

    Visual Basic-Quellcode

    1. Public BWL(10) as String


    deklarieren.

    Diese Zeilen müssen VOR der ersten Zeile stehen.

    Visual Basic-Quellcode

    1. ' Zum Definieren eines Arrays gibt man in Klammern die Größe des Arrays an. Somit wird aus
    2. Public BWL(1 to 10) as String
    3. ' ganz schnell diese kürzere Schreibweise
    4. Public BWL(10) as String


    mfg



    Me_Hide
    Eine etwas genauere Beschreibung als "stockt irgendwie" wäre hilfreich.

    Du musst JEDE Variable als public defnieren. Das ist zwar kein guter Stil, aber dafür kannst du erst einmal nichts falsch machen.

    Okay, nach etwas genauerer Betrachtung:

    Zeile 85, 89, 124 - 128 fehlt das Call vor den Routinenamen

    Zeile 81 gehört in die Initialisierung.

    In Zeile 53 können die Klammern samt Inhalt weg.

    Wenn dann immer noch Fehler sind, lass das Programm Zeilenweise mit F8 debuggen.

    mfg



    Me.Hide
    Danke me_hide,

    habe alles geändert, d.h alle Variablen als public deklariert, dementsprechend die Dim aus den Prozeduren entfernt.
    Des weiteren im Hauptprogramm alles mit call aufgerufen und die zu übergebenen Werte dahinter in Klammern gesetzt. Bei Versuch das Programm schrittweise mit F8 laufen zu lassen, stoppt er bereits bei der Variablen deklaration mit der Meldung: "Mehrdeutiger Name: Zugang".
    Ich habe diesen Wert als boolean gesetzt, da er ja nur 0 oder 1 haben soll und später bei der Entscheidung die dementsprechende Msgbox steuern soll.
    Anbei findest du den geänderten Code.......

    Danke nochmal für deine Hilfe

    'Unterprogramm Initialisierung

    Public BNL(10), PWL(10) As String
    Public EingabeBN As String
    Public Zugang As Boolean
    Public i As Byte
    Public EingabePW As String
    Public Zugang As Boolean


    Sub Zugangskontrolle_intialisierung()



    BNL(1) = "Peter"
    BNL(2) = "Paul"
    BNL(3) = "Pia"
    BNL(4) = "Petra"
    BNL(5) = "Hans"
    BNL(6) = "Klaus"
    BNL(7) = "Erna"
    BNL(8) = "Lothar"
    BNL(9) = "Udo"
    BNL(10) = "Xantippe"
    PWL(1) = "PW1"
    PWL(2) = "PW2"
    PWL(3) = "PW3"
    PWL(4) = "PW4"
    PWL(5) = "PW5"
    PWL(6) = "PW6"
    PWL(7) = "PW7"
    PWL(8) = "PW8"
    PWL(9) = "PW9"
    PWL(10) = "PW10"

    End Sub

    'Unterprogramm Benutzernamen eingeben

    Sub Benutzernamen_eingabe()

    EingabeBN = InputBox("Name:")

    End Sub

    'Unterprogramm Passwort eingeben

    Sub Passwort_eingabe()



    EingabePW = InputBox("Das Passwort bitte:")

    End Sub

    'Passwortüberprüfung

    Sub Ueberpruefung()



    i = 1
    For i = 1 To 10

    If PWL(i) = EingabePW And BNL(i) = EingabeBN Then
    Zugang = True
    i = 11
    Else
    MsgBox "Test"

    End If

    Next i



    End Sub

    Sub Entscheidung()



    Anzahl_Versuche = 1
    For Anzahl_Versuche = 1 To 3

    If Zugang = True Then
    Call Zugang_erteilt
    Anzahl_Versuche = 4
    Else
    Anzahl_Versuche = Anzahl_Versuche + 1
    Call kein_Zugang

    End If

    Next Anzahl_Versuche

    End Sub


    'Unterprogramm Zugang

    Sub Zugang_erteilt()

    MsgBox "Rein gehts!!"

    End Sub

    'Unterprogramm Kein Zugang

    Sub kein_Zugang()

    MsgBox "Kein Rein!!"

    End Sub

    'Hauptprogramm!

    Sub Zugangskontrolle()

    Call Zugangskontrolle_intialisierung
    Call Benutzernamen_eingabe(EingabeBN)
    Call Passwort_eingabe(EingabePW)
    Call Ueberpruefung(Zugang)
    Call Entscheidung

    End Sub
    Hallo,



    Der Fehler tritt auf, weil du die Variable Zugang zwei mal initialisierst. Da musst du nur die letzte Deklaration Public Zugang as Boolean löschen.

    In den Call-Aufrufen im Sub Zugangskontrolle müssen die Klammern samt Inhalt hinter den Routinenamen verschwinden.

    Und in der letzten Zeile wäre ein End Sub nicht schlecht.

    mfg

    Me.Hide