Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA recherche valeur->écrire dans ligne correspondante

1 réponse
Avatar
ngotte
Bonjour,

Si ce n'est pas la bonne place, merci de m'indiquer le bon newsgroup (je
n'en ai pas trouvé de meilleur !)

grand débutant en programmation, je me suis attaqué à quelque chose qui me
dépasse complètement
(c'est comme ça qu'on apprend parait-il ;) )

Alors voila
Dans un cadre professionnel je dois permettre à mes utilisateurs de filtrer
un fichier excel en fonction de cases à cocher cochées ou non.

Le but : mettre un X au bout des lignes qui contiennent la ou les valeurs
recherchées
La méthode : 1. rassembler les valeurs à rechercher 2.les rechercher dans
chaque ligne 3. mettre un X au bout de chacune de ces ligne 4.filtrer sur
tous les X dans la colonne M

Je commence donc par rassembler les Caption de ces cases dans une variable
String :

If TypeName(Ctrl) = "CheckBox" Then
If Ctrl.Value = True Then
strTemp = strTemp & Ctrl.Caption & ";"
End If
End If

Ensuite le but est de rechercher cette valeur dans la colonne K de chaque
ligne, et pour chaque ligne dans laquelle se trouve cette valeur, mettre un
X dans la colonne M. Ce X me permettra ensuite de filtrer tranquillement mon
fichier. Sauf que :

nbLignes = Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To nbLignes
If (InStr(1, CStr(Range("K" & i).Value), strTemp, vbTextCompare) =
1) Then
Range("M" & i) = "X"
End If

ne marche pas !! j'ai beau faire ce que je peux, il me met un X dans toutes
les lignes, meme la ligne d'en-tete de colonne >_<

une idée mes bons messieurs-dames ? ;)

1 réponse

Avatar
PMO
Bonjour,

Une piste avec le code ci-dessous.
J'ai supposé que les "cases à cocher" sont dans un UserForm.

Au lieu d'utiliser une variable String qui sera affectée des concaténations
des Captions des CheckBox (strTemp = strTemp & Ctrl.Caption & ";"),
on utilisera une variable String dimensionnée (un tableau)

POUR TESTER
1) créer un UserForm
2) créer des CheckBox avec comme Caption les jours de la
semaine (lundi,mardi,…,dimanche)
3) créer un CommandButton
4) copiez y le code suivant

'*************
Private Sub CommandButton1_Click()
Dim strTemp$()
Dim ctrl As Control
Dim i&
Dim j&
Dim nbLignes&
For Each ctrl In Me.Controls
If TypeName(ctrl) = "CheckBox" Then
If ctrl.Value = True Then
i& = i& + 1
ReDim Preserve strTemp$(1 To i&)
strTemp$(i&) = ctrl.Caption
End If
End If
Next ctrl
nbLignes& = Cells(Rows.Count, "A").End(xlUp).Row
On Error GoTo Erreur
For i& = 1 To nbLignes&
For j& = 1 To UBound(strTemp$)
If (InStr(1, CStr(Range("K" & i).Value), _
strTemp$(j&), vbTextCompare) = 1) Then
Range("M" & i) = "X"
Exit For
End If
Next j&
Next i
Erreur:
End Sub
'*************

5) dans la colonne "K" d'une feuille Excel mettez des jours de semaine
et remplissez la colonne "A" de données pour toutes les lignes
à balayer (votre code recherche le nombre de lignes en "A")

Cordialement.

PMO
Patrick Morange