26865
Nicht registrierter Gast
(08.09.2022, 09: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:1 Nutzer sagt Danke an Gast für diesen Beitrag 28
• Primo Centurio
Registriert seit: 29.04.2022
Version(en): 2019 & 2021 32-Bit & 2019 mac
08.09.2022, 14:52
(Dieser Beitrag wurde zuletzt bearbeitet: 08.09.2022, 14:54 von d'r Bastler.)
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
26865
Nicht registrierter Gast
(08.09.2022, 14: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:2 Nutzer sagen Danke an Gast für diesen Beitrag 28
• Primo Centurio, d'r Bastler
Registriert seit: 28.08.2022
Version(en): 365
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(EingegebenesPasswort) Then 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
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
Mahlzeit! Der auswertbare Rückgabewert ist doch das Entscheidende. Mittels CVErr()-Function kann man das sogar so gestalten, dass keine MsgBox notwendig ist. 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:1 Nutzer sagt Danke an RPP63 für diesen Beitrag 28
• Primo Centurio
26865
Nicht registrierter Gast
(08.09.2022, 15: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:2 Nutzer sagen Danke an Gast für diesen Beitrag 28
• Primo Centurio, HKindler
Registriert seit: 14.08.2017
Version(en): 10
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 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? Beim Sub (witzig Autokorrektur schreibt immer "Pub", ja da wäre ich auch gerne ) geht das ja über "Call". LG Primo
Registriert seit: 28.08.2022
Version(en): 365
08.09.2022, 21:06
(Dieser Beitrag wurde zuletzt bearbeitet: 08.09.2022, 21:07 von HKindler.)
Hi, (08.09.2022, 16: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 s = "Test" MsgBox s 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
Registriert seit: 29.04.2022
Version(en): 2019 & 2021 32-Bit & 2019 mac
08.09.2022, 21:30
(Dieser Beitrag wurde zuletzt bearbeitet: 08.09.2022, 21:35 von d'r Bastler.)
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 ... 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! Grüße
_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
26865
Nicht registrierter Gast
(08.09.2022, 21: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:1 Nutzer sagt Danke an Gast für diesen Beitrag 28
• HKindler
|