Lameche15
Messages postés156Date d'inscriptionmardi 9 septembre 2008StatutMembreDernière intervention15 septembre 2022
-
9 sept. 2008 à 15:01
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 2012
-
11 sept. 2008 à 12:13
Bonjour à tous,
J'essaie de mettre au point une application permettant la saisie d'activité d'une entreprise.
J'ai donc une feuille de calcul sous excel pour chaque mois de l'année en cours
Un bouton me permet de lancer le code après avoir selectionner la plage de cellule à saisir.
Ce bouton m'envoie sur une Userform ou figurent plusieurs CheckBox (12) qui correspondent à des noms d'engins.
J'aimerais pouvoir en fonction des CheckBox cochées, inscrire le(s) Caption(s) correspondant(s) dans les cellules selectionnées.
Si qqn à une idée de code à me fournir je lui en serait très reconnaissant.
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 20126 9 sept. 2008 à 15:29
bonjour
le principe de base est simple if OptionButton1.valuetrue then cells(x,y).text OptionButton1.captionelseif OptionButton2.valuetrue then cells(x,y).text OptionButton2.caption
etc ...
end if
maintenant pour éviter d'avoir autant de ligne que de optionbutton
tu peux passer par la collection controle
For i = 1 To nombre d'optionbutton
if Me.Controls("optionbutton" & i).value= true then
cells(x,y).text = Me.Controls("optionbutton" & i).caption
exit for 'pour sortir de la boucle dès que le bon option button a été trouvé
end if
Next i
[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 20126 9 sept. 2008 à 18:19
avec des checkbox et donc des réponses multiples possibles il va te falloir utiliser plutot la premiere solution
par exemple:if checkbox1.valuetrue then cells(x,y).text checkbox1.captionelseif checkbox2.valuetrue then cells(x,y +1 ).text checkbox2.captionelseif checkbox3.valuetrue then cells(x,y +2 ).text checkbox3.caption
etc ...
end if
mais tout dépend de ce que tu veux exactement obtenir
tu peux aussi utiliser un combobox qui contiendrait tous les choix et dans ce cas il te suffirait de mettre
Private Sub UserForm_Activate()
'a l'ouverture de la userform remplissage du combobox avec tous les choix possibles
ComboBox1.AddItem "objet1"
ComboBox1.AddItem "objet2"
'etc...
End Sub
Private Sub ComboBox1_click()
Feuil1.cells(x,y) = ComboBox1.Text
UserForm1.Hide
End Sub
ce ne sont pas les solutions qui manquent
[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 20126 10 sept. 2008 à 10:07
oui dans l'évenement click de ton bouton il faut mettre
dim controls as control
de plus j'ai vu une erreur dans ce que je t'ai donnéil faut mettre cells(x,y) au lieu de cells(x,y).text
[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 20126 10 sept. 2008 à 12:18
if Range("D28") ="" then
Range("D28") = Me.Controls("OptionButton" & i).Caption
Range("D28").Interior.Color = Couleur
else
Range("D29") = Me.Controls("OptionButton" & i).Caption
Range("D29").Interior.Color = Couleur
end if
maintenant si tu as une grande plage possible pour cette légende
il te faut faire une recherche sur la zone de la premiere cellule vide
je te donne ci dessous des petits bouts de code pour trouver une cellule vide dans divers contextes tu peux t'en inspirer
se positionner sur la première ligne vide
MsgBox "La dernière ligne contenant des données est la ligne " & nbLignes & vbCrLf & _
"et la dernière colonne contenant des données est la colonne " & Chr(64 + nbColonnes)
End Sub
Et si tu veux savoir combien de lignes il y a dans une colonne particulière (ici B)
Lameche15
Messages postés156Date d'inscriptionmardi 9 septembre 2008StatutMembreDernière intervention15 septembre 2022 9 sept. 2008 à 15:47
Wouah super! Déjà une réponse!
Merci de ta réactivité
Il me semble que tu aies bien compris ma demande.
Une seule chose j'utilise des CheckBox et non des OptionButton mais je suppose que cela ne change pas grand chose.
Autre chose crois tu qu'avec ce code si l'utilisateur coche plusieurs cases, je vais pouvoir récupérer tous les captions et les mettre dans la cellule voulue?
Merci d'avance
Lameche15
Messages postés156Date d'inscriptionmardi 9 septembre 2008StatutMembreDernière intervention15 septembre 2022 10 sept. 2008 à 09:25
Merci encore pour ton aide précieuse.
Subsiste encore un soucis, j'ai une erreur sur la ligne Me.controls...
Objet non spécifié
Dois-je déclarer qqch dans les variables en debut de code?
Lameche15
Messages postés156Date d'inscriptionmardi 9 septembre 2008StatutMembreDernière intervention15 septembre 2022 10 sept. 2008 à 10:16
Ouais ca c pas un probleme car de toute façon je fais avec la cellule active.
Sinon j'ai un autre souci je voudrais modifier mon userform pour remettre des optionbutton a la place des checkbox et chaque fois que je relance mon programme c l'ancienne userform qui apparait.
Aurais-tu une solution avant que je ne recommence tout à zéro.
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 20126 10 sept. 2008 à 10:22
tu as créé une nouvelle userform ou dans la premiere tu as remplacé les checkbox par des optionbuton?
dans le premier cas il faut dans l'évenement click de ton bouton qui ouvre la userform lui mettre le bon nom
si c'est la deuxieme là je ne pige pas comment il peut t'afficher un truc qui n'existe plus !
[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
Lameche15
Messages postés156Date d'inscriptionmardi 9 septembre 2008StatutMembreDernière intervention15 septembre 2022 10 sept. 2008 à 10:46
C'est bien le second cas et du coup j'ai esayé d'exporter la userform et d'importer à chaque fois que je fais un changement, c lourd mais ca marche
Merci pour tout
A très vite pour mes prochaines difficultés
Lameche15
Messages postés156Date d'inscriptionmardi 9 septembre 2008StatutMembreDernière intervention15 septembre 2022 10 sept. 2008 à 11:27
Bon tu vois je n'aurais pas tardé à rencontrer de nouvelles difficultés. Au passage je te fais remarquer que je me suis mis à la programmation Excel sur ce projet et que la premiere partie de mon programme concernant la gestion des absences n'est pas du tout optimisé mais il marche bien et je gagne un temps énorme grace à tes conseils et à ceux que j'ai pu lire sur les différents forums.
Voila, quand l'utilisateur va selectionner une plage de cellule il va ensuite cliquer sur un bouton Activité placé dans la feuille et ainsi charger la userform. La il choisit le type d'activité une couleur qu'il souhaite associer à cette activité ainsi qu'un véhicule, le tout avec des optionbutton. (Le code ci-dessous)
J'arrive donc à mettre les cellules selectionnées avec la couleur et le nom de l'engin. J'arrive également à inscrire dans une cellule déterminée dans le code (fixe) le nom de l'activité choisie et la couleur pour créer une légende.
Seulement cela sera valable pour une activité et le problème que je rencontre est que si l'utilisateur resaisi pour un autre employé une autre activité et un autre engin j'aurai bien les bonnes données dans les cellules selectionnées mais ma légende sera écrasée.
Voici mon code, peux tu éventuellement me proposer une solution? Sinon moi je pensais carrément à créer un autre bouton sur la feuille pour créer la légende à part avec le meme système, selectionner les cellules avant de lancer la procédure:
Merci
Private Sub CommandButtonOK_Click()
Dim Cellule As Range
Dim i As Integer
Dim Couleur As Long
Dim Cpt As Integer
Dim cells As Range
'Choix de la couleur ( je sais que j'aurais pu encore optmiser avec une autre boucle for imbriquée! la flemme lol)
If OptionRouge = True Then
Couleur = vbRed
End If
If OptionBleu = True Then
Couleur = vbBlue
End If
If OptionVert = True Then
Couleur = vbGreen
End If
If OptionCyan = True Then
Couleur = vbCyan
End If
If OptionJaune = True Then
Couleur = vbYellow
End If
If OptionMagenta = True Then
Couleur = vbMagenta
End If
For Each Cellule In Selection
Cellule.Interior.Color = Couleur
For i = 1 To 21 'Récupération de l'activité
If Me.Controls("OptionButton" & i).Value = True Then
Range("D28") = Me.Controls("OptionButton" & i).Caption
Range("D28").Interior.Color = Couleur
For Cpt = 28 To 39
If Me.Controls("OptionButton" & Cpt).Value = True Then
Cellule = Me.Controls("OptionButton" & Cpt).Caption
Exit For 'pour sortir de la boucle dès que le bon option button a été trouvé
End If
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 20126 10 sept. 2008 à 11:52
la solution pour ta légende serait de tester si elle est vide. si c'est le cas tu la renseigne sinon tu ne fais rien
du genre si c'est bien D28 ta légende :
if Range("D28") ="" then
Range("D28") = Me.Controls("OptionButton" & i).Caption
Range("D28").Interior.Color = Couleur
end if
pour la couleurIf OptionRouge True Then Couleur vbRedElseIf OptionBleu True Then Couleur vbBlueElseIf OptionVert True Then Couleur vbGreenElseIf OptionCyan True Then Couleur vbCyanElseIf OptionJaune True Then Couleur vbYellowElseIf OptionMagenta True Then Couleur vbMagenta
End If
ça ira plus vite puisque dès qu'il a trouvé la bonne option il passera automatiquement au end if
[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
Lameche15
Messages postés156Date d'inscriptionmardi 9 septembre 2008StatutMembreDernière intervention15 septembre 2022 11 sept. 2008 à 10:29
Salut, décidemment ce matin je n'arrive à rien,
je lutte pour récupérer une plage de données sélectionnée par l'utilisateur et recopier celle-ci à un autre endroit de la feuille. Le collage ne me pose pas de problème mais je n'arrive pas à récupérer la plage de cellules
Lameche15
Messages postés156Date d'inscriptionmardi 9 septembre 2008StatutMembreDernière intervention15 septembre 2022 11 sept. 2008 à 11:36
Y'a un truc que je pige pas et que je n'arrive pas à cerner
if Range("D28") ="" then
Range("D28") = Me.Controls("OptionButton" & i).Caption
Range("D28").Interior.Color = Couleur
else if Range("D29") ="" then
Range("D29") = Me.Controls("OptionButton" & i).Caption
Range("D29").Interior.Color = Couleur
Else ...
end if
Evidemment ce code rempli tant que les cases sont vides.
N'ayant que 4 cases à tester, y a til un moyen rapide de sortir de la boucle dès que l'opération est réalisée.
Je ne maitrise pas suffisament pour me lancer dans des recherches de premiere case vide ou autre
mais si je n'ai pas le choix peut etre qu'avec un peu d'aide
Merci d'avance
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 20126 11 sept. 2008 à 11:54
dans une structure
if .... then
elseif.... then
elseif.... then
end if
il teste jusqu'à ce que la condition soit remplie il fait allors ce qui suit le then correspondant puis p)asse directement à la ligne end if
donc si tu as 15 elseif et que la condition soit vérifiée à la deuxième il ne testera pas les 13 suivantes qui par définition sont forcément fausses
puisque tu n'a que quatre cases à tester pas besoin de faire une boucle
if Range("D28") ="" then
Range("D28") = Me.Controls("OptionButton" & i).Caption
Range("D28").Interior.Color = Couleur
else if Range("D29") ="" then
Range("D29") = Me.Controls("OptionButton" & i).Caption
Range("D29").Interior.Color = Couleur
else if Range("D30") ="" then
Else
msbox("toutes les légendes sont déja écrites!")'tu peux ici mettre par exemple quelques lignes de code pour
' vider les quatres cellules et écrire ensuite dans la D28
end if
[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 20126 11 sept. 2008 à 12:03
maintenant tu peux aussi faire un boucle
x =0
for j = 28 to 31
if cells(j,4)="" then
cells(j,4) = Me.Controls("OptionButton" & i).Caption
cells(j,4).Interior.Color = Couleur
x= x+1
exit for
end if
next j
if x = 4 then msbox("toutes les légendes sont déja écrites!")
les deux solution auront exactement le meme résultat
[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 20126 11 sept. 2008 à 12:06
ou encore:
for j = 1 to 4
if cells(27+j,4)="" then
cells(27+j,4) = Me.Controls("OptionButton" & i).Caption
cells(27+j,4).Interior.Color = Couleur
exit for
end if
next j
if j = 4 then msbox("toutes les légendes sont déja écrites!")
[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE