Jeg ville flytte randomize uden for løkken, da den opretter en stor liste af tilfældige tal, hvilket der ikke er nogen grund til den skal gøre hver gang. Jeg ved ikke hvad der er default, men jeg plejer også at tilføje 'Time'-parametret bagefter.
Mortens brug af Round() gør at de yderste to tegn ikke bliver brugt lige så ofte som resten af tegnene. Det første tegn bliver fx kun valgt i intervallet [0;0,5[ for Round's parameter, mens det næste tegn bliver valgt i hele intervallet [0,5;1,5[. Derfor har jeg ændret det til Int() som altid runder ned.
'Rnd' giver altid en værdi i intervallet [0;1[, og Mid-funktionen tæller fra 1 (vækker forvirring da array-indeksering tæller fra 0). Derfor bliver man nødt til at tilføje +1 efter multiplikationen.
Denne sidste fejl havde Morten nok også opdaget under sin test, hvis ikke han havde tilføjet en tom 'On Error' til sin funktion.
Det resulterer alt sammen i:
Dim PasswordString As String
Dim i As Long
Dim Password As String
PasswordString = "!#¤%&/()=?`|´+£${[]}^¨~'*-_.:;<>\\123456789qwertyuiopåasdfghjklæøzxcvbnm½§"
Randomize Time
For i = 1 To 10 'Antal tegn der skal være i passwordet!
Password = Password & Mid(PasswordString, Int(Rnd * Len(PasswordString)) + 1, 1)
Next i
'Debug.Print Password
- Hvis du vil kan du også ændre 'PasswordString' til en 'const' så den ikke skal allokeres hver eneste gang.
- Hvis koden her indsættes som det eneste i en funktion, kan funktionens navn bruges istedet for variablen 'Password'.
Indlæg senest redigeret d. 16.07.2006 19:06 af Bruger #2165