Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Passwort aus Zahlen und Buchstaben
#11
(08.09.2022, 08:16)EarlFred schrieb:
Code:
Option Explicit

Function chkPwd2(ByVal Password As String) As Boolean
Dim i As Byte
Dim CheckSum As Byte

If Len(Password) >= 6 Then
   CheckSum = 16
   For i = 1 To Len(Password)
      Select Case AscW(Mid(Password, i, 1))
         Case 48 To 57                 '0-9
            CheckSum = CheckSum Or 1
         Case 65 To 90                 'A-Z
            CheckSum = CheckSum Or 2
         Case 97 To 122                'a-z
            CheckSum = CheckSum Or 4
         Case Else
            CheckSum = CheckSum Or 8
      End Select
   Next i
End If
chkPwd2 = CheckSum = (1 Or 2 Or 4 Or 16)
End Function
Ich Dussel habe die Prüfung auf mind. 6 Zeichen vergessen. Eingebaut.

Noch ein letzter: Code mit Rückgabe, welche der Regeln missachtet wurden:
Code:
Function chkPwd3(ByVal Password As String) As String 'Boolean
Dim i As Byte
Dim CheckSum As Byte

CheckSum = IIf(Len(Password) >= 6, 16, 0)
For i = 1 To Len(Password)
   Select Case AscW(Mid(Password, i, 1))
      Case 48 To 57                 '0-9
         CheckSum = CheckSum Or 1
      Case 65 To 90                 'A-Z
         CheckSum = CheckSum Or 2
      Case 97 To 122                'a-z
         CheckSum = CheckSum Or 4
      Case Else
         CheckSum = CheckSum Or 8
   End Select
Next i

chkPwd3 = "Passwort"
If (CheckSum And 1) = 0 Then chkPwd3 = chkPwd3 & " und enthält keine Ziffern"
If (CheckSum And 2) = 0 Then chkPwd3 = chkPwd3 & " und enthält keine großen Buchstaben"
If (CheckSum And 4) = 0 Then chkPwd3 = chkPwd3 & " und enthält keine kleinen Buchstaben"
If (CheckSum And 8) = 8 Then chkPwd3 = chkPwd3 & " und enthält unzulässige Zeichen"
If (CheckSum And 16) = 0 Then chkPwd3 = chkPwd3 & " und ist kürzer als 6 Zeichen"
If chkPwd3 = "Passwort" And CheckSum = (1 Or 2 Or 4 Or 16) Then
   chkPwd3 = chkPwd3 & " ist gültig"
Else
   chkPwd3 = Replace(chkPwd3, " und", "", 1, 1)
End If
End Function
[-] Folgende(r) 1 Nutzer sagt Danke an Gast für diesen Beitrag:
  • Primo Centurio
Antworten Top
#12
Moin allerseits,

es ist toll, dass es jetzt  hier solche eine rege Beteiligung und gute Lösungen gibt. Schade ist nur, dass Centurio, der ja ausdrücklich um einen Einstieg gebeten hatte, jetzt sich gar nichts mehr selbst erarbeiten/lernen kann, sondern nur noch Cut'nPaste braucht ...

Den Hinweis mit Unicode-Ersatzzeichen, finde ich klasse, weil er in anderen Passwort-Szenarien bestimmt zur Sicherheit beiträgt, die es in der  XL/VBA-Welt -wie schon erwähnt- nicht wirklich gibt. In meinem persönlichen Archiv habe ich Arbeitsmappen und Beschreibungen mit rund einem halben Dutzend Hintertürchen, um (mit einigen sogar unbemerkt) an PW-geschützte Daten zu gelangen.

@EarlFred: Eine Frage noch: Du verpackst die Prüfungen in Functions statt in Subs. Hat das einen tieferen Grund?

Grüße

d`r Bastler von den VBAsteleien.de
Win 10 & 11, Office 2019 & 2021 & macOS X.15, XL 2019
[-] Folgende(r) 1 Nutzer sagt Danke an d'r Bastler für diesen Beitrag:
  • Primo Centurio
Antworten Top
#13
(08.09.2022, 13:52)d'r Bastler schrieb: @EarlFred: Eine Frage noch: Du verpackst die Prüfungen in Functions statt in Subs. Hat das einen tieferen Grund?
Es dient der Übersichtlichkeit des Codes, der Wiederverwendbarkeit, der einfachen Wartung.

In der eigentlichen Prozedur liegt dann nicht mehr der ganze Code zur Prüfung, sondern nur noch der Aufruf und die Auswertung der Rückgabe der Function. 
Brauchst du diese Funktionalität in einem anderen Projekt, bindest du die Function nur noch ein. 
Weiterhin könntest du die Function auch als UDF (unter Beachtung der Limitationen von UDFs) verwenden. 
Und nicht zuletzt lassen sich Funktionen auch gut in AddIns (xlam) sammeln, um sie mappenübergreifend nutzen (und updaten) zu können.
[-] Folgende(r) 2 Nutzer sagen Danke an Gast für diesen Beitrag:
  • Primo Centurio, d'r Bastler
Antworten Top
#14
Hi Bastler,

eine Function wird immer dann verwendet, wenn man einen Rückgabewert braucht.

Hier gibt die Funktion chkPwd2 einfach True oder False zurück, je nachdem ob Ok oder nicht. Im Hauptprogramm kann dann entsprechend reagiert werten:

PHP-Code:
If chkPwd3(EingegebenesPasswortThen
    MsgBox
("Passwort OK")
Else
    MsgBox("Passwort nicht OK")
End If 

chkPwd3 gibt gleich einen entsprechenden Stringwert, der direkt verwendet werden kann:
PHP-Code:
MsgBox chkPwd3(EingegebenesPasswort

Bei einem PasswortCheck ist es idR besser diesen als Funktion zu programmieren. Du kämest ja wahrscheinlich auch nicht auf die Idee so etwas wie IstBlau() als Sub zu programmieren.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
[-] Folgende(r) 2 Nutzer sagen Danke an HKindler für diesen Beitrag:
  • Primo Centurio, d'r Bastler
Antworten Top
#15
Mahlzeit!
Der auswertbare Rückgabewert ist doch das Entscheidende.
Mittels CVErr()-Function kann man das sogar so gestalten, dass keine MsgBox notwendig ist.  21

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • Primo Centurio
Antworten Top
#16
(08.09.2022, 14:20)HKindler schrieb: eine Function wird immer dann verwendet, wenn man einen Rückgabewert braucht.
(Mehrere) Rückgabewerte sind auch mit Subs möglich. Auch Kombinationen sind möglich. 

Beispiele:
Code:
Option Explicit

Sub test()
Dim Wort As String: Wort = "Hallo"
Call machwas(EinUndAusgabe:=Wort)
MsgBox Wort

Dim Fehler As String
Dim Ergebnis As Double
Ergebnis = machWasAnderes(Zähler:=7, Nenner:=0, ReturnedError:=Fehler)
If Fehler <> "" Then
   MsgBox Fehler
Else
   MsgBox Ergebnis
End If
End Sub

Sub machwas(ByRef EinUndAusgabe As String)
EinUndAusgabe = Replace(EinUndAusgabe, "a", "e")
End Sub

Function machWasAnderes(ByVal Zähler As Integer, ByVal Nenner As Integer, ByRef ReturnedError As String) As Double

On Error GoTo ErrExit
machWasAnderes = Zähler / Nenner

Exit Function

ErrExit:
ReturnedError = "Fehler!" & vbLf & Join(Array(Err.Number, Err.Description), ": ")
machWasAnderes = 0
End Function
[-] Folgende(r) 2 Nutzer sagen Danke an Gast für diesen Beitrag:
  • Primo Centurio, HKindler
Antworten Top
#17
Halli Hallo zusammen

Danke vielmals für eure Hilfe, Inputs, Vorschläge und Codes :)
Ich werde mir alles in Ruhe anschauen und ausprobieren.

Ich lege schon Mal Kreuz, Hammer und Nägel für meine nächste Frage bereit, falls mich jemand ans Kreuz nageln will  05

Ich kenne mich mit Funktionen überhaupt nicht aus und ich habe den Unterschied zum Sub noch nicht ganz verstanden, aber da bin ich eigen und der Groschen wird dann irgendwann auch bei mir bei einem praktischen Beispiel fallen.

Ich lege den Code dieser Funktion in ein Modul ab und werde den wohl in meiner UserForm einen Bezug zum Modul resp. zur Funktion erstellen müssen? 17
Beim Sub (witzig Autokorrektur schreibt immer "Pub", ja da wäre ich auch gerne   19 ) geht das ja über "Call".

LG Primo
Antworten Top
#18
Hi,

(08.09.2022, 15:38)EarlFred schrieb: (Mehrere) Rückgabewerte sind auch mit Subs möglich. Auch Kombinationen sind möglich.
Variablen ByRef zu übergeben hat aber auch so seine Tücken. So ist z.B. eine automatische Typumwandlung nicht mehr gegeben.

Wenn man denn unbedingt auf Function verzichten will, dann könnte man auch globale Variablen verwenden. Aber beides (ByRef und globale Variablen) trägt mMn. nicht wirklich zu übersichtlichem Code bei.

@Prime Centurio: Functions werden so verwendet wie jede VBA-Funktion wie z.B. Int oder UCase
PHP-Code:
Sub t()
dim s
"Test"
MsgBox s
testFun(s)
MsgBox s
MsgBox testFun
(s)
End Sub

Function testFun(Str As String) As String
TestFun 
Str Str
end 
Function 
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
[-] Folgende(r) 1 Nutzer sagt Danke an HKindler für diesen Beitrag:
  • Primo Centurio
Antworten Top
#19
Moin Centurio, 
ganz großes Kino:

Zitat:... im Sub (witzig Autokorrektur schreibt immer "Pub", ja ....


Pub?! In welchem Editor schreibst Du?? Falls nicht VBE, vergibst Du Dir unendlich viele kleine Hilfen für korrektes Coden.
Was ist der VBE? Der Visual Basic Editor in Office-Produkten, direkt aufzurufen über Alt+F11 oder Alt+F8 zur Auswahl des zu bearbeitenden Makros.
Auch wenn's jetzt staubtrocken klingt, aber dort gibt es definitiv keinen Pub, es sei denn Du schreibst Dir einen ...  15

Moin Forumskollegen,

das mit der Function wegen Rückgabewert, wusste ich und glaubte es auch verstanden zu haben. Den sicher großen Vorteil des Auslagerns hatte ich allerdings noch nicht erkannt. Bisher habe ich das mit Sub + Parameter hin und zurück gelöst. Auch von einer Datei zur nächsten, siehe Anhang.

Herzlichen Dank für diesen kleinen Grundkurs!! Wieder was gelernt!   Smile

Grüße

.zip   _RTausD.zip (Größe: 21,78 KB / Downloads: 1) Beide Dateien müssen geöffnet sein.

d`r Bastler von den VBAsteleien.de
Win 10 & 11, Office 2019 & 2021 & macOS X.15, XL 2019
[-] Folgende(r) 1 Nutzer sagt Danke an d'r Bastler für diesen Beitrag:
  • Primo Centurio
Antworten Top
#20
(08.09.2022, 20:06)HKindler schrieb: Variablen ByRef zu übergeben hat aber auch so seine Tücken. So ist z.B. eine automatische Typumwandlung nicht mehr gegeben.
Ich bin ohnehin kein Freund von automatischen Typecasts, daher wäre das kein Verlust. Typgenaue Übergaben von Argumenten gehören m. E. auch zu sauberer Programmierung.
[-] Folgende(r) 1 Nutzer sagt Danke an Gast für diesen Beitrag:
  • HKindler
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste