VBA - Range + Variable mobile
Bonjour tout le monde,
J'ai un problème que je n'arrive pas à régler au sujet de la fonction Range couplée à une variable qui peut se déplacer de ligne en ligne.
Je souhaiterai que mon code réalise l'algorithme suivant :
Mot = Trouver("Mot à chercher")
Si Position("Mot") = Position(A éviter)
Alors Checbox1 = Faux
Sinon Checbox1 = Vrai
Fin Si
Si Checkbox1 = Vrai ET Si Position(ColonneFixe, Ligne("Mot")) = ""
Alors Checbox11 = Faux
Sinon Checkbox11 = Vrai
Fin Si
J'ai alors codé sous VBA comme suit :
With Worksheets("Essai").Range("A5:A100")
Set Mot = .Find("Test")
Mot.EntireRow.Select
If Range(Mot) = Range("A12") Then
CheckPrestation.value = False
Else
CheckPrestation.value = True
If Range("E" & Mot) = "" Then
Check01.value = False
Else
Check01.value = True
End If
End If
End With
Ca fait maintenant plusieurs journées que je me prends la tête avec ce soucis, j'espère que mon explication sera suffisemment claire !
A très vite
Salut Tyurne,
on gagnera beaucoup de temps si tu nous dis en français ce que tu comptes faire et en nous présentant ton fichier!
A+
Je vais essayer de décrire le code de façon claire alors, mais ça risque de ne pas l'être énormément
J'ai une première CheckboxMaster qui en active 2 autres. Ces 2 CheckBoxSlave peuvent également en activer 3 autres chacune.
Je souhaite rechercher le texte retourné par la première CheckboxSlave, dans la 1ère colonne. Si elle est présente à sa place d'origine, alors je veux décocher cette CheckboxSlave, dans le cas contraire, je veux l'activer (recopie de son contenu)
Si elle est à un emplacement autre, je souhaite vérifier les CheckboxSlaveSlave de la CheboxSlave qui n'est pas en place, afin de pouvoir recopier également ses données dans la bonne ligne (tout en validant les CheckboxSlaveSlave correspondantes).
A terme je développerai ce code pour la seconde CheckBoxSlave également, une fois que la première arrêtera de buguer
J'espère que c'est assez clair, j'ai passé trop de temps à essayer de résoudre ce problème, donc je risque de donner des explications brouillons et sans avoir pris le recul nécessaire...
Désolé de ne pas avoir développé dès le 1er coup, j'ai d'abord pris le temps de refaire un fichier exploitable avant de l'expliquer :3
Le voici en pièce jointe
Salut Tyurne,
Que fabriques-tu, ici?
Private Sub Command_Click()
With Worksheets("Plan Prototype").Range("A5:A100")
Fonction.value = True
Set Cherche = .Find("Prestation A")
Cherche.EntireRow.Select
If Range(Cherche) = Range("A12") Then
PrestationA.value = False
Else
PrestationA.value = True
If Range("E" & Cherche) = "" Then
CheckA1.value = False
Else
CheckA1.value = True
End If
If Range("F" & Cherche) = "" Then
CheckA2.value = False
Else
CheckA2.value = True
End If
If Range("G" & Cherche) = "" Then
CheckA3.value = False
Else
CheckA3.value = True
End If
End If
End With
End SubA+
Bonjour,
Ça peut pas marcher !
Peut-être qu'en déclarant et typant les variables, cela mettra mieux les erreurs en évidence...
Salut MFerrand, curulis57, le forum
Le but de mon programme est de déplacer des données afin de les remettre à leur place initiale, tout en sélectionnant les checkbox correspondantes.
Dans mon code, je recherche si la première colonne est vide où non.
Si elle n'est pas vide, je recherche plus précisément le texte contenu dans cette colonne.
S'il correspond au nom de l'une de mes prestations, alors je coche cette prestation dans mon userform (ce qui revient à la déplacer à sa position d'origine).
Une prestation renseigne une ligne complète de données, je cherche donc ensuite les cases documentables. Si elles sont vides, alors je laisse mon userform tranquille, mais si elles sont remplies, alors je sélectionne mes checkbox correspondantes...
J'espère que c'est assez clair :3
Par contre je ne comprends pas ce besoin de déclarer et typer les variables :/ Je suis débutant en VBA et j'apprends à l'aide de forums, ne me tappez pas trop fort sur les doigts s'il vous plait :p
Pourquoi est-ce que ça ne pourrait pas marcher ? :/
Bonne journée ~
Bonjour,
Je n'ai pas trop regardé dans ton classeur...
Voilà le code juste remis sur pied :
Private Sub Command_Click()
Dim Cherche As Range
Fonction.Value = True
Set Cherche = Worksheets("Plan Prototype").Range("A5:A100").Find("Prestation A")
If Cherche.Row = 12 Then
PrestationA.Value = False
Else
PrestationA.Value = True
If Cherche.Offset(, 4) = "" Then
CheckA1.Value = False
Else
CheckA1.Value = True
End If
If Cherche.Offset(, 5) = "" Then
CheckA2.Value = False
Else
CheckA2.Value = True
End If
If Cherche.Offset(, 6) = "" Then
CheckA3.Value = False
Else
CheckA3.Value = True
End If
End If
End SubIl y a juste les éléments inutiles ou aberrants qui ont été ôtés. On peut ensuite simplifier.
Private Sub Command_Click()
Dim Cherche As Range
Fonction.Value = True
Set Cherche = Worksheets("Plan Prototype").Range("A5:A100").Find("Prestation A")
If Cherche.Row = 12 Then
PrestationA.Value = False
Else
PrestationA.Value = True
CheckA1.Value = IIf(Cherche.Offset(, 4) = "", False, True)
CheckA2.Value = IIf(Cherche.Offset(, 5) = "", False, True)
CheckA3.Value = IIf(Cherche.Offset(, 6) = "", False, True)
End If
End SubOu même, mieux :
Private Sub Command_Click()
Dim Cherche As Range, i%
Fonction.Value = True
Set Cherche = Worksheets("Plan Prototype").Range("A5:A100").Find("Prestation A")
If Not Cherche Is Nothing Then
If Cherche.Row = 12 Then
PrestationA.Value = False
Else
PrestationA.Value = True
For i = 1 To 3
Controls("CheckA" & i).Value = IIf(Cherche.Offset(, i + 3) = "", False, True)
Next i
End If
End If
End SubAvec ici en plus correction d'un petit défaut : quand on utilise Find, on n'est jamais sûr de trouver ! Il est toujours souhaitable de tester si la recherche est fructueuse pour éviter une erreur d'exécution.
Cordialement.
Bonjour MFerrand, le forum,
Merci beaucoup pour cette réponse
Pour mémoriser l'état des checkbox j'ai finalement réussi à faire quelque chose de beaucoup plus simple :
'Acquisition de l'état des variables à un moment précis
For Each ct In Controls
If TypeName(ct) = "CheckBox" Then
ThisWorkbook.Names.Add ct.Name, ct
End If
Next ct
'Retour de ces valeurs = retour à leur état des checkboxes
On Error Resume Next
For Each ct In Controls
If TypeName(ct) = "CheckBox" Then
ct.Value = ThisWorkbook.Names(ct.Name).RefersTo = "=TRUE"
End If
Next ct
Le truc qui me pose problème maintenant c'est de réussir à créer ma variable de sélection :
En fonction de ma recherche, je dois renseigner dans une variable le numéro de ligne contenant ma valeur recherchée pour ensuite pouvoir sélectionnée la plage "E & NumLigne : T & NumLign"
Sauf que je bloque sur la façon de faire, je n'arrête pas d'avoir des erreurs différentes en fonction de mes diverses tentatives
Encore merci pour l'aide apportée jusqu'à présent et à très vite !
Bonne jourée
Salut tout le monde,
Problème résolu ! Tout est fonctionnel, encore merci pour l'aide que vous m'aurez apporté
Bonne journée ~