Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
649 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  routine lien cellule-bouton-image

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

routine lien cellule-bouton-image

n°1397708
jpcheck
Pioupiou
Posté le 30-06-2006 à 09:25:59  profilanswer
 

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:

mood
Publicité
Posté le 30-06-2006 à 09:25:59  profilanswer
 

n°1397830
Paul Hood
Posté le 30-06-2006 à 11:05:47  profilanswer
 

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

n°1397856
jpcheck
Pioupiou
Posté le 30-06-2006 à 11:21:18  profilanswer
 

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

n°1397859
Paul Hood
Posté le 30-06-2006 à 11:24:16  profilanswer
 

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

n°1397877
jpcheck
Pioupiou
Posté le 30-06-2006 à 11:40:28  profilanswer
 

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:

n°1397893
jpcheck
Pioupiou
Posté le 30-06-2006 à 11:48:50  profilanswer
 

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

n°1397901
Paul Hood
Posté le 30-06-2006 à 11:53:39  profilanswer
 

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

n°1398000
jpcheck
Pioupiou
Posté le 30-06-2006 à 13:48:18  profilanswer
 

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.

n°1398046
Paul Hood
Posté le 30-06-2006 à 14:36:14  profilanswer
 

C'est quoi "Retour 1004" ?

n°1398058
jpcheck
Pioupiou
Posté le 30-06-2006 à 14:43:28  profilanswer
 

Paul Hood a écrit :

C'est quoi "Retour 1004" ?


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

mood
Publicité
Posté le 30-06-2006 à 14:43:28  profilanswer
 

n°1400007
JihemAir
Je sais pas
Posté le 04-07-2006 à 10:48:01  profilanswer
 

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 ?
n°1400021
jpcheck
Pioupiou
Posté le 04-07-2006 à 11:05:39  profilanswer
 

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 ?

n°1400028
JihemAir
Je sais pas
Posté le 04-07-2006 à 11:09:37  profilanswer
 

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 ?
n°1400369
Paul Hood
Posté le 04-07-2006 à 15:43:43  profilanswer
 

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.

n°1400380
jpcheck
Pioupiou
Posté le 04-07-2006 à 15:53:26  profilanswer
 

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...

n°1400394
jpcheck
Pioupiou
Posté le 04-07-2006 à 16:13:01  profilanswer
 

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

n°1400406
Paul Hood
Posté le 04-07-2006 à 16:24:45  profilanswer
 

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

n°1400438
jpcheck
Pioupiou
Posté le 04-07-2006 à 16:34:27  profilanswer
 

Paul Hood a écrit :

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


oui oui :s

n°1400441
Paul Hood
Posté le 04-07-2006 à 16:34:52  profilanswer
 

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 ? :??:

n°1400451
jpcheck
Pioupiou
Posté le 04-07-2006 à 16:39:09  profilanswer
 

Paul Hood a écrit :

Il dit quoi comme erreur ? :??:


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

n°1400467
Paul Hood
Posté le 04-07-2006 à 16:44:48  profilanswer
 

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

n°1400477
jpcheck
Pioupiou
Posté le 04-07-2006 à 16:48:48  profilanswer
 

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

n°1400483
Paul Hood
Posté le 04-07-2006 à 16:55:25  profilanswer
 

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

n°1400486
jpcheck
Pioupiou
Posté le 04-07-2006 à 16:58:34  profilanswer
 

Paul Hood a écrit :

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


à quel endroit  ? :sweat:

n°1400500
Paul Hood
Posté le 04-07-2006 à 17:04:22  profilanswer
 

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.

n°1400514
jpcheck
Pioupiou
Posté le 04-07-2006 à 17:09:10  profilanswer
 

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

n°1400523
Paul Hood
Posté le 04-07-2006 à 17:15:27  profilanswer
 

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

n°1400531
jpcheck
Pioupiou
Posté le 04-07-2006 à 17:19:45  profilanswer
 

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

n°1400533
jpcheck
Pioupiou
Posté le 04-07-2006 à 17:20:31  profilanswer
 

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 ...

n°1400542
jpcheck
Pioupiou
Posté le 04-07-2006 à 17:25:39  profilanswer
 

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...

n°1400543
Paul Hood
Posté le 04-07-2006 à 17:25:41  profilanswer
 

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

n°1400546
jpcheck
Pioupiou
Posté le 04-07-2006 à 17:27:15  profilanswer
 

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

n°1400548
JihemAir
Je sais pas
Posté le 04-07-2006 à 17:29:29  profilanswer
 

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 ?
n°1400551
Paul Hood
Posté le 04-07-2006 à 17:31:12  profilanswer
 

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

n°1400559
jpcheck
Pioupiou
Posté le 04-07-2006 à 17:34:01  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  routine lien cellule-bouton-image

 

Sujets relatifs
vba excel et bouton de barre d'outils + separateur [résolu]HTML - mettre une image de fond une seule fois
JTable : pb affichage cellule ! ne se refresh pas sauf si scroll/clic[VBA Excel] Lien vers une page précise
[résolu] gérer le clic droit sur un bouton[FLASH 8] Garder un bouton cliqué
[Resolu] [SDL] taille d'une image en pxEnvoi Mail html avec inline image
Problème envoie image + redimenssionnement : marche passupprimer les points dans une cellule
Plus de sujets relatifs à : routine lien cellule-bouton-image


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR