Luc,
'k Heb je ding nog eens bekeken :-)
enkele losse tips: ('t wordt weer een lange reply)
1. Maak meer gebruik van WITH ... END WITH om je code overzichtelijk te "bundelen".
2. "gaan naar" werkbladen of bereiken is zelden nodig. Vermijd dus "select": het spaart je ook enkele regels.
in plaats van
x = Sheets("Blad2").Cells(Rows.Count, 1).End(xlUp).Row + 1
Sheets("Blad2").Range("A" & x) = "Naam"
Sheets("Blad2").Range("A" & x) = Sheets("Blad1").Range("U1")
Sheets("Blad2").Range("B" & x) = Date
Sheets("Blad2").Range("C" & x) = UserForm1.Label2.Caption
Application.ScreenUpdating = False
Sheets("Blad2").Select
Range("A1:C" & x).Select
Selection.Sort Key1:=Range("C2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Range("A1").Select
Sheets("Blad1").Select
Application.ScreenUpdating = True
krijgen we
With Sheets(2)
x = .Cells(Rows.Count, 1).End(xlUp).Row + 1
.Range("A" & x) = "Naam"
.Range("A" & x) = Sheets("Blad1").Range("U1")
.Range("B" & x) = Date
.Range("C" & x) = UserForm1.Label2.Caption
.Range("A1:C" & x).Sort Key1:=.Range("C2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
3. Binnen de userform-code maak je best gebruik van het sleutelwoord "Me" in plaats van de naam van de userform UserForm1. Dat is korter en duidelijker en als je ooit de naam van je userform veranderd, blijft je code werken.
4. De sub "Toevoegen" kan je in de userformcode integreren binnen de "for next". Het is waar dat de code mooi indelen in procedures een goede zaak is, maar voor deze enkele regels leek het me beter zo. Zie ook hoe de "Redim" nu slechts 1 keer "gelezen" wordt, dus niet in de "loop".
(ik plaatste 52 in een constante nrBtns, zo is meteen je hele code up to date, wanneer je dit wijzigt. Er zijn zelfs nog betere technieken naargelang ...)Dim clsCBN() As New Klasse1
Const nrBtns = 52
Private Sub cmbLaden_Click()
'andere code
Dim btn As MSForms.CommandButton
ReDim Preserve clsCBN(nrBtns)
For n = 1 To nrBtns
Set btn = Me.Controls("CommandButton" & n)
Set clsCBN(n).CBN = btn
With btn
.Caption = Range("B" & n)
.Enabled = True
.BackColor = &H80FFFF
End With
Next n
5. Deze lijn
If Range("rngAantalGoed").Value < 26 Then
stond 2 keer in je code: dit kan je beter samenzetten.
6. Ook lijkt het me logisch om de userform te sluiten wanneer men wil stoppen. (unload me)
resultaat
If Range("rngAantalGoed").Value < 26 Then
If MsgBox("Het spel is nog niet klaar! (tijd loopt wél door!)" & Chr(13) & Chr(13) & _
"Wil je stoppen?", vbYesNo, "Niet smokkelen") = vbNo Then
Exit Sub
Else
'Vroegtijdig afbreken, dan geen score
Range("rngAantalGoed") = 0
Range("rngAantalFout") = 0
Unload Me
Exit Sub
End If
End If
7. in verband met
ActiveWorkbook.Save
Application.Quit
Je bedoelt eigenlijk "ThisWorkbook".
Het is niet fijn voor mij als gebruiker om mijn Excel gesloten te zien, wanneer ik tussendoor eens een spelletje wou spelen
.
mijn voorstel
ThisWorkbook.Close True
Hier en daar paste ik nog enkele dingen aan en de "lichtkrant schiet in actie vanaf 20 (kan je aanpassen)
Range("rngAantalGoed") = Range("rngAantalGoed") + 1
'ingevoegde regel
If Range("rngAantalGoed") = 20 Then UserForm1.move_buttons
toevoegen aan userform1-code
Sub move_buttons()
Dim n As Integer
Dim w As Single
w = CommandButton2.Left - CommandButton1.Left
'Application.EnableCancelKey = xlErrorHandler
On Error GoTo stopit
Do
For n = 1 To nrBtns
With Me.Controls("CommandButton" & n)
.Left = IIf(.Left < -w / 2, w * 12.5, .Left - 2)
End With
DoEvents
Next n
Loop While Me.Visible = True
stopit:
End Sub
Hiermee is niet alles gezegd
, het testen in de werkelijkheid zal nog veel leren.
voorbeeld in bijlage
beste groeten,
Erik