routine lien cellule-bouton-image

routine lien cellule-bouton-image - VB/VBA/VBS - Programmation

Marsh Posté le 30-06-2006 à 09:25:59    

Bonjour :hello:  
pour faire suite à mes précédents topics, je suis toujours sur ma programmation de démineur. Je prends la présentation Windows...
J'ai donc un userform avec 100 boutons de jeu + 1 de reset.
J'ai déjà géré le tirage aléatoire des mines, et les valeurs des cases selon la proximité de mines ou non.
Mon problème est maintenant le suivant.
Est-il possible de créer une ou plusieurs routines (le minimum étant le mieux) permettant d'avoir une automatisation de
- l'image de départ lors du clic sur le bouton "reset" => mise à zéro du jeu, mise à zéro des images
- la liaison cellule des mines (zone A1:J10), cellule du nombre (zone A11:J20)
mon code pour un bouton étant celui-ci :
 

Code :
  1. Private Sub bouton001_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  2. Dim image As String
  3. 'le bouton 001 étant la case en haut à gauche
  4. 'récupération de la valeur dans le tablo 2
  5. With Cells(11, 1)
  6.     For i = 0 To 8
  7.         If .Value = i Then
  8.             image = "E:\" & i & ".gif"
  9.         End If
  10.     Next i
  11. 'gestion clic gauche
  12.     If Button = 1 Then
  13.         If Cells(1, 1).Value = "1" Then
  14.             'perdu
  15.             bouton001.Picture = LoadPicture("E:\elmer.gif" )
  16.             Reset.Picture = pictureload("E:\dead.gif" )
  17.             'Call findejeu
  18.         Else
  19.            'affichage valeur
  20.             bouton001.Picture = LoadPicture(image)
  21.         End If
  22.     ElseIf Button = 2 Then
  23.         'gestion clic droit =>il y aurait une mine là
  24.         bouton001.Picture = LoadPicture("E:\mine.gif" )
  25.     End If
  26. End With
  27. End Sub


 
et tout ca pour 100 boutons donc (10x10)
pourriez vous m'aider ?
Merci d'avance  :jap:

Reply

Marsh Posté le 30-06-2006 à 09:25:59   

Reply

Marsh Posté le 30-06-2006 à 11:05:47    

Une proposition de procédure à appliquer à tous les boutons
 
Private Sub EcrireProcClick(Nom As String)
    Dim code As String
    code = ""
    code = "Sub " & Nom & "_Click()" & vbCrLf
    code = code & "  <ton code ligne 1>" & vbCrLf
    code = code & "  <ton code ligne 2>" & vbCrLf
    code = code & "End Sub"
     
    '   Ecriture du code dans le module de la feuille (fs)
    With ThisWorkbook.VBProject.VBComponents("<Ton UserForm>" ).CodeModule
      NextLine = .CountOfLines + 1
      .InsertLines NextLine, code
    End With
End Sub

Reply

Marsh Posté le 30-06-2006 à 11:21:18    

ca doit le faire oui :D
et la sub EcrireProcClick() je l'appelle à quel niveau et avec quel paramèetre stp ?  :ange:

Reply

Marsh Posté le 30-06-2006 à 11:24:16    

En fait ca génére le code en dur dans ton userform.
 
Moi j'ai créé un bouton et j'ai associé le code suivant à adapter
For Each bout In UserForm3.Controls
 If bout.Name Like "bouton*" Then Call EcrireProcClick(bout.Name)
Next

Reply

Marsh Posté le 30-06-2006 à 11:40:28    

Paul Hood a écrit :

En fait ca génére le code en dur dans ton userform.
 
Moi j'ai créé un bouton et j'ai associé le code suivant à adapter
For Each bout In UserForm3.Controls
 If bout.Name Like "bouton*" Then Call EcrireProcClick(bout.Name)
Next


je sens que ca va le faire au final ca ^^
par contre, comme j'ai des string avec du code comme ca
image ="E:\plop.gif", comment faire comprendre le " comme un " et pas dans le code en lui même... :sweat:

Reply

Marsh Posté le 30-06-2006 à 11:48:50    

jpcheck a écrit :

je sens que ca va le faire au final ca ^^
par contre, comme j'ai des string avec du code comme ca
image ="E:\plop.gif", comment faire comprendre le " comme un " et pas dans le code en lui même... :sweat:


j'ai mis le chr(34) à la place
code= code & "image ="E:\prout.gif"" & vbCrLf
donne donc
code= code & "image =" & chr(34) & "E:\prout.gif" & chr(34) & vbCrLf

Reply

Marsh Posté le 30-06-2006 à 11:53:39    

Ca  l'air de fonctionner avec ca :
 
MaString = "Tata"
code = "toto et " & """" & MaString & """"
MsgBox code
 
En fait pour mettre un " il faut en mettre 4 ("""" ) dans la variable

Reply

Marsh Posté le 30-06-2006 à 13:48:18    

Paul Hood a écrit :

Ca  l'air de fonctionner avec ca :
 
MaString = "Tata"
code = "toto et " & """" & MaString & """"
MsgBox code
 
En fait pour mettre un " il faut en mettre 4 ("""" ) dans la variable


le code est bien généré, je l'affiche dans une msgbox pour m'en assurer, mais le bloc suivant

Code :
  1. '   Ecriture du code dans le module de la feuille (fs)
  2.     With ThisWorkbook.VBProject.VBComponents("Jeu" ).CodeModule 'Jeu étant le nom de ma userform
  3.       NextLine = .CountOfLines + 1
  4.       .InsertLines NextLine, code
  5.     End With


est mal encaissé, retour 1004.

Reply

Marsh Posté le 30-06-2006 à 14:36:14    

C'est quoi "Retour 1004" ?

Reply

Marsh Posté le 30-06-2006 à 14:43:28    

Paul Hood a écrit :

C'est quoi "Retour 1004" ?


L'accès au projet visual basic n'est pas fiable.

Reply

Marsh Posté le 30-06-2006 à 14:43:28   

Reply

Marsh Posté le 04-07-2006 à 10:48:01    

Je répond sans doute un peu tard, je ne suis pas ce forum de très prêt....
 

Code :
  1. Dim ctrlButton As Control
  2.    
  3.     For Each ctrlButton In frmMain.Controls
  4.         Debug.Print ctrlButton.Name
  5.     Next


 
Tu peux facilement boucler sur les contrôles de ta feuille.
 


---------------
J'ai un message.."Cliquez OK pour continuer."...Qu'est ce que je fais ?
Reply

Marsh Posté le 04-07-2006 à 11:05:39    

merci, pas de pb pour le retard, cette macro était en mode pause, en attente de propositions, car je me suis taperles 100*12 lignes de codes pour chaque bouton à la main...
en quoi consiste la fonction debug.print ?

Reply

Marsh Posté le 04-07-2006 à 11:09:37    

Re,
  Debug.print te permets d'imprimer dans la fenêtre "Exécution" pour des raisons de debogage. (Ne s'affiche qu'en mode édition. Sans effet quand le code est compilé).


---------------
J'ai un message.."Cliquez OK pour continuer."...Qu'est ce que je fais ?
Reply

Marsh Posté le 04-07-2006 à 15:43:43    

Proposition pour générer un form avec tes 100 boutons et le code associés :  
Dans un form1 tu créé le bouton CommandButton1 avec le code ci-dessous
Private Sub CommandButton1_Click()
    Dim Nom As String
    Dim Usf As Object, btn As Object
  'Application.VBE.SelectVBComponent.Designer.Controls.Count
    Set Usf = ThisWorkbook.VBProject.VBComponents("UserForm2" )
    For j = 1 To 10
        For i = 1 To 10
            Nom = "bouton" & Format(j, "0#" ) & Format(i, "0#" )
            Set bout = Usf.Designer.Controls.Add("Forms.CommandButton.1", Nom)
            bout.Name = Nom
            bout.Left = (i - 1) * 25
            bout.Top = (j - 1) * 25
            bout.Height = 25
            bout.Width = 25
            With Usf.CodeModule
                X = .CountOfLines
                .InsertLines X + 1, "Sub " & Nom & "_Click()"
                .InsertLines X + 2, "  MsgBox ActiveControl.Name"
                .InsertLines X + 3, "End Sub"
            End With
        Next
    Next
    VBA.UserForms.Add (Usf.Name)
    UserForms(UserForms.Count - 1).Show
End Sub
Pour que ca fonctionne il faut qu'un form "UserForm2" existe. dimensionne le en conséquence pour recevoir 100 boutons de 25x25.
 
Ca génére les 100 boutons (10 par 10) et le code de chaque bouton (ici tout simple, il retourne le nom du bouton sur lequel el clic est effectué).
Le nom du boutons est donné en fonction de sa position :
En haut à gauche bouton_0101 : 1ere ligne 1ere colonne
en bas à gauche bouton_1001 : 10 eme ligne 1ere colonne.
A partir des 4 dernier carateres du nom du bouton tu tapes dans la feuille la bonne colonne et la bonne ligne pour connaître le nombre de bombe.
 
remarquesur ton code (en haut)
pas la peine de faire une boucle au début mais plutôt
   'affichage valeur            
   bouton001.Picture = LoadPicture("E:\" & cells(ligne,colonne) & ".gif" )
avec ligne et colonne issue du nom du bouton.
 
J'sais pas si c'est tres clair... mais dis moi si ca correspond à ce que tu cherches.

Reply

Marsh Posté le 04-07-2006 à 15:53:26    

là ou j'enrage, c'est que je me dis que ton code c'est du pain bénni. par contre, j'ai toujours cette fichue erreur 1004 avec mon usf qui vaut nothing :s
j'ai trouvé sur ce site ici, l'idée d'ajouter la référence Microsoft Visual Basic For Applications Extensibility 5.3 mais ca ne fait rien...

Reply

Marsh Posté le 04-07-2006 à 16:13:01    

il m'envoie paitre dès le activeworkbook.vbproject
une idée pour réparer ca ? :pt1cable:

Reply

Marsh Posté le 04-07-2006 à 16:24:45    

Tu as bien créé un form "UserForm2" ou équivalent ?

Reply

Marsh Posté le 04-07-2006 à 16:34:27    

Paul Hood a écrit :

Tu as bien créé un form "UserForm2" ou équivalent ?


oui oui :s

Reply

Marsh Posté le 04-07-2006 à 16:34:52    

jpcheck a écrit :

il m'envoie paitre dès le activeworkbook.vbproject
une idée pour réparer ca ? :pt1cable:


Il dit quoi comme erreur ? :??:

Reply

Marsh Posté le 04-07-2006 à 16:39:09    

Paul Hood a écrit :

Il dit quoi comme erreur ? :??:


erreur 1004, L'accès au projet visual basic n'est pas fiable.

Reply

Marsh Posté le 04-07-2006 à 16:44:48    

Les variables sont bien déclarées et typées

Reply

Marsh Posté le 04-07-2006 à 16:48:48    

Paul Hood a écrit :

Les variables sont bien déclarées et typées


voila  le code en question :

Code :
  1. Private Function EcrireProcClick(Nom As String, cellule As String)
  2.     Dim code As String
  3.     code = ""
  4.     code = " Private Sub " & Nom & "_MouseDown()" & vbCrLf
  5.     code = code & "Dim image As String " & vbCrLf
  6.     code = code & "Dim cpt As Integer" & vbCrLf
  7.     code = code & "With Range(" & Chr(34) & cellule & Chr(34) & " )" & vbCrLf
  8.     code = code & " For i = 0 To 8" & vbCrLf
  9.     code = code & "     If .Value = i Then" & vbCrLf
  10.     code = code & "        image = " & Chr(34) & "E:\" & Chr(34) & "& i &" & Chr(34) & ".gif" & Chr(34) & vbCrLf
  11.     code = code & "     End If" & vbCrLf
  12.     code = code & " Next i" & vbCrLf
  13.     code = code & " If Button = 1 Then" & vbCrLf
  14.     code = code & "     If Cells(1, 1).Value = " & Chr(34) & "1" & Chr(34) & " Then" & vbCrLf
  15.     code = code & "         " & Nom & ".Picture = LoadPicture(" & Chr(34) & "E:\elmer.gif" & Chr(34) & " )" & vbCrLf
  16.     code = code & "         Reset.Picture = Loadpicture(" & Chr(34) & "E:\dead.gif" & Chr(34) & " )" & vbCrLf
  17.     code = code & "     Else" & vbCrLf
  18.     code = code & "         " & Nom & ".Picture = LoadPicture(image)" & vbCrLf
  19.     code = code & "     End If" & vbCrLf
  20.     code = code & " ElseIf Button = 2 Then" & vbCrLf
  21.     code = code & "     " & Nom & ".Picture = LoadPicture(image)" & vbCrLf
  22.     code = code & "  End If" & vbCrLf
  23.     code = code & "End With" & vbCrLf
  24.     code = code & "End Sub"
  25.     X = MsgBox(code & "code OK", vbOKOnly)
  26.     '   Ecriture du code dans le module de la feuille (fs)
  27.    
  28.  
  29.     With ThisWorkbook.VBProject.VBComponents("Jeu" ).CodeModule
  30.       NextLine = .CountOfLines + 1
  31.       .InsertLines NextLine, code
  32.     End With
  33.  
  34. End Function

Reply

Marsh Posté le 04-07-2006 à 16:55:25    

Et avec une "code" simple ca marche ou pas ?

Reply

Marsh Posté le 04-07-2006 à 16:58:34    

Paul Hood a écrit :

Et avec une "code" simple ca marche ou pas ?


à quel endroit  ? :sweat:

Reply

Marsh Posté le 04-07-2006 à 17:04:22    

Code= "msgbox nom" par exemple pour savoir si l'écriture qqui merd.. ou si c'est dans ta variable code.
Remarque:
Tu lui passes pas de paramêtre à ta fonction mousedown ?
Ceci dis, chez moi ca marche nickel..enfin la crétaion de la procedure apres à l'utilisation il plante puisque pas de parametre pour mousedown.

Reply

Marsh Posté le 04-07-2006 à 17:09:10    

le msgbox nom me donne bien commandbutton1, la deuxieme msgbox me donne bien mon code cherché, par contre, le thisworkbook.etc plante

Reply

Marsh Posté le 04-07-2006 à 17:15:27    

Comme je te disais, la création fonctionne nickel chez moi... par contre a l'execution ca plante..mais c'est normal.

Reply

Marsh Posté le 04-07-2006 à 17:19:45    

Paul Hood a écrit :

Comme je te disais, la création fonctionne nickel chez moi... par contre a l'execution ca plante..mais c'est normal.


y a-t-il une sécurité qu'il faille faier suater ??
on échange nos pc ? :p

Reply

Marsh Posté le 04-07-2006 à 17:20:31    

jpcheck a écrit :

y a-t-il une sécurité qu'il faille faier suater ??
on échange nos pc ? :p


sinon, connais tu un moyen d'afficher la liste des vbcomponents, ca vient surement de la ...

Reply

Marsh Posté le 04-07-2006 à 17:25:39    

jpcheck a écrit :

sinon, connais tu un moyen d'afficher la liste des vbcomponents, ca vient surement de la ...


il me sort aussi un variable de bloc with non défini...

Reply

Marsh Posté le 04-07-2006 à 17:25:41    

j'ai pas mieux :
 
 For Each obj In ThisWorkbook.VBProject.VBComponents
        MsgBox obj.Name
 Next

Reply

Marsh Posté le 04-07-2006 à 17:27:15    

ca me jette dès que je veux accéder au VBProject...

Reply

Marsh Posté le 04-07-2006 à 17:29:29    

Code :
  1. Une méthode ou une propriété ne peut pas être utilisée en raison des paramètres de sécurité. Par exemple, les propriétés et les méthodes de l'objet VBE servant à manipuler le code VBA (Microsoft Visual Basic pour Applications) stocké dans un document Microsoft Office sont, par défaut, inaccessibles.
  2. Pour activer l'accès autorisé à Visual Basic Projects :
  3. Dans le menu Outils, pointez sur Macro, puis cliquez sur Sécurité.
  4. Sous l'onglet Sources fiables , activez la case à cocher Faire confiance au projet Visual Basic.



---------------
J'ai un message.."Cliquez OK pour continuer."...Qu'est ce que je fais ?
Reply

Marsh Posté le 04-07-2006 à 17:31:12    

Faut que je m'en va !
je m'y remet demain !!

Reply

Marsh Posté le 04-07-2006 à 17:34:01    

JihemAir a écrit :

Code :
  1. Une méthode ou une propriété ne peut pas être utilisée en raison des paramètres de sécurité. Par exemple, les propriétés et les méthodes de l'objet VBE servant à manipuler le code VBA (Microsoft Visual Basic pour Applications) stocké dans un document Microsoft Office sont, par défaut, inaccessibles.
  2. Pour activer l'accès autorisé à Visual Basic Projects :
  3. Dans le menu Outils, pointez sur Macro, puis cliquez sur Sécurité.
  4. Sous l'onglet Sources fiables , activez la case à cocher Faire confiance au projet Visual Basic.



JMR je t'aime  :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed