Since it doesn't seem like you are going to get a solution, I will post one. (I pulled some some code from Chip Pearson about how to get the macro names.)
Note:
Before using these procedures, you'll need to set a reference in VBA to the VBA Extensibility library. In the VBA editor, go to the Tools menu, choose the References item, and put a check next to "Microsoft Visual Basic For Applications Extensibility" library. This enables VBA to find the definitions of these objects. If you are using Excel97, this library will appear in the References list without a version number: "Microsoft Visual Basic For Applications Extensibility". If you are using Excel 2000 or 2002, it will appear with a version number: "Microsoft Visual Basic For Applications Extensibility 5.3". It is very important that you reference the proper library. If you reference the wrong library, you will receive "Type Mismatch" errors. If you don't reference the extensibility library at all, you will receive "User Defined Type Not Defined Error".
Place your macros in module1 (i.e. Macro1, Macro2, Macro3, Macro4 from your post). Insert a new module and place the following code:
<pre>Sub RndChooseMacro()
Dim VBCodeMod As CodeModule
Dim StartLine As Long
Dim Macros As String
Dim ProcName As String
Dim x As Variant
Dim RndMacro As Long
Set VBCodeMod = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
With VBCodeMod
StartLine = .CountOfDeclarationLines + 1
Do Until StartLine >= .CountOfLines
Macros = Macros & " " & .ProcOfLine(StartLine, vbext_pk_Proc)
StartLine = StartLine + _
.ProcCountLines(.ProcOfLine(StartLine, _
vbext_pk_Proc), vbext_pk_Proc)
Loop
End With
Macros = Application.Trim(Macros)
x = Split(Macros, " ")
RndMacro = Int((UBound(x) * Rnd) + 1)
Run x(RndMacro)
End Sub</pre>
Assign button 5 to RndChooseMacro.