That's a very good implementation of the game - nice job!
The only minor complaint I have is that the score disappears as soon as the game is finished, it would be nicer if it stayed (but perhaps in a different colour) until a new game is started.
In terms of the code there are a few bits that can be shortened/simplified, one of which is the repetition of code in Clicked. The code for rows 3,4,5 are identical, so rather than have a Case for each one you could use a single case for all three, eg:
Code:
Case 5, 4, 3 'Bottom/second/third row of layout
alternative syntax using a range:
Code:
Case 3 to 5 'Third/second/bottom row of layout
As most of the code is also identical for row 2, you could even merge them all, like this:
Code:
Case 2 To 5 'layout
CellRef = Xlate(Target.Column, Target.Row)
...
Range(CellRef).Interior.ColorIndex = 10
If Target.Row = 2 Then 'Top row of layout
Finished = Finished + 1
If Finished = 3 Then 'All 3 cards at the top of the peaks used
Score = Score + (Unused - 11) 'Bonus based on no of cards unused
[A3] = Score
[K7] = ""
Range("K7").Interior.ColorIndex = 10
cmdShuffle_Click
End If
Else 'other rows
CheckOpening (CellRef)
End If
End If
End If
Most of the routines in Module11 aren't really needed, as there are already equivalents built in (which should be faster than yours), eg:
ToUpper: UCase
ToLower: LCase
StringSearch: InStr
Replace: Replace (but slightly different behaviour to your version, so probably not apt).
FindNumber and FindLetter can be simplified slightly by replacing this:
Code:
Asc(Mid(Ref, f, 1)) <= 57 And Asc(Mid(Ref, f, 1)) >= 48
with this:
Code:
IsNumeric(Mid(Ref, f, 1))