je suis nouveau en VBA.
je suis actuellement entraint de créer une interface pour ma boite.
Je dois réaliser un filtre suivant certain critère de recherche ici pour la recherhce d'un nom où prénom entré dans la inputbox
Voici le code :
Private Sub cmdNom_Click()
Recherche.Hide
'***************************************************
' pour effectuer une recherche avec un nom où prénom
'***************************************************
Dim Nom As String
Nom = InputBox("Saisissez un nom", "Recherche par Nom :", "Tapez votre recherche")
ColNom = 7 ' le numéro de la colonne Nom où Prénom du tableau
Ligne = 4 ' numéro de la premiere ligne à lire
' boucle tant que la cellule Nom comporte quelque chose
While Cells(Ligne, ColNom) <> ""
' If Cells(Ligne, ColNom).Value <> Nom Then
' premet de filtré suivant le nom où le prénom
If InStr(1, LCase(Cells(Ligne, ColNom).Value), LCase(Nom)) = 0 Then
Rows(Ligne).Select
Selection.EntireRow.Hidden = True
End If
Ligne = Ligne + 1
Wend ' fin boucle
End Sub
Je suis bloqué à ce niveau, je sais pas comment je pourrais réalisé le filtre sur 2 voir 30 colonnes avec mon code
Il sera pour des personnes non formé à excel donc c'est pour cela que je préfère que la recherche se passe via une inputbox sans passé par les filtres de excel
En vous remerciant beaucoup
Par contre j'ai vu un autre soucis
Lorsque la 1ère cellule qui est a filtré et vide rien ne ce passe ... est-il possible de remplir les cellules vide avec une action comme un bouton et de les remplir avec / ??
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 5 févr. 2013 à 15:28
Salut
Pour commencer, on va présenter le code correctement, sans quoi il est impossible/difficile de s'y retrouver / de le présenter pour donner envie de s'intéresser à ton problème.
Private Sub cmdNom_Click()
Recherche.Hide
' pour effectuer une recherche avec un nom où prénom
Dim Nom As String
Nom = InputBox("Saisissez un nom", "Recherche par Nom :", "Tapez votre recherche")
ColNom = 7 ' le numéro de la colonne Nom où Prénom du tableau
Ligne = 4 ' numéro de la premiere ligne à lire
' boucle tant que la cellule Nom comporte quelque chose
While Cells(Ligne, ColNom) <> ""
' premet de filtré suivant le nom où le prénom
If InStr(1, LCase(Cells(Ligne, ColNom).Value), LCase(Nom)) = 0 Then
Rows(Ligne).Select
Selection.EntireRow.Hidden = True
End If
Ligne = Ligne + 1
Wend ' fin boucle
End Sub
Instr n'a pas besoin de travailler avec LCase ou UCase : il suffit de lui dire de comparer du texte en ajoutant le paramètre final
If InStr(1, Cells(Ligne, ColNom).Value, Nom,vbTextCompare) = 0 Then
Actuellement, si la cellule ne comporte pas le nom, tu rends la ligne invisible : Il va donc falloir être sûr que la recherche ne donne rien dans toutes les colonnes d'une même ligne avant de décider de la rendre invisible.
While-Wend est obsolète : Utiliser Do While-Loop
Mieux vaut ne pas utiliser l'objet Selection dans les macros : Si quelqu'un clique quelque part pendant l'exécution, c'est le bug assuré.
Voilà le code 'corrigé' qui va aller faire la recherche sur les 30 colonnes à droite de celle du début.
Pense à rebalayer toutes tes données pour remettre à False le Hidden de tes lignes !
Private Sub cmdNom_Click()
Recherche.Hide
' pour effectuer une recherche avec un nom où prénom
Dim Nom As String
Dim Ligne As Long
Dim ColNom As Long
Dim bFound As Boolean
Dim oRange1 As Range
Dim oRange2 As Range
Nom = InputBox("Saisissez un nom", "Recherche par Nom :", "Tapez votre recherche")
If Nom = "" Then Exit Sub ' au cas où
ColNom = 7 ' le numéro de la colonne Nom où Prénom du tableau
Ligne = 4 ' numéro de la premiere ligne à lire
' boucle tant que la cellule Nom comporte quelque chose
For Each oRange1 In Range(Range("G7"), Range("G7").End(xlDown))
bFound = False ' par défaut, pas encore trouvé
For Each oRange2 In Range(oRange1, oRange1.Offset(0, 30))
If InStr(1, oRange2.Text, Nom, vbTextCompare) <> 0 Then
' On a trouvé
bFound = True
Exit For
End If
Next oRange2
If Not bFound Then Rows(oRange1).Hidden = True
Next oRange1
End Sub
Rappel de la méthode de débogage :
- F9 sur une ligne de code; elle change de couleur
Le programme s'y arrêtera au prochain passage.
Lors de l'arrêt, survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape
? maVariable
pour qu'elle s'inscrive dans la fenêtre.
- F8 (VB6) ou F10 (.Net) pour avancer d'une ligne de code
- F5 pour continuer normalement
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 6 févr. 2013 à 09:49
Ton programme recherche la première cellule vide pour stopper.
Normal donc qu'il ne se passe rien.
Tu peux éventuellement jumeler ce test de cellule vide avec un numéro de ligne au moins égal à 10 pour palier aux cellules vides en tête de liste (bricolage)
Je suis actuellement en mode test pour ma boite qui me demande de créer une listbox jusque la tout est ok ^^
Par contre je sais pas comment lui faire chercher ( VBA ) la colonne attibué c'est à dire de pas tapé en dur la colonne à afficher dans la listbox
voici mon code :
'**********************************************
' Pour les noms dans la colonne Problem Owner '
'**********************************************
Worksheets("Feuil1").Activate 'à défaut d'instancier la feuille
tablo = Range("e3:e" & Range("e" & Rows.Count).End(xlUp).Row).Value
'tablo = [A2:DV2].Find(What:="Problem Owner", LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns).Column
'triAlphabétique
For i = 1 To UBound(tablo)
For j = 1 To UBound(tablo)
If tablo(i, 1) < tablo(j, 1) Then
Tempo = tablo(i, 1)
tablo(i, 1) = tablo(j, 1)
tablo(j, 1) = Tempo
End If
Next j
Next i
'Remplissage excluant les doublons
ListBoxDate.AddItem tablo(1, 1)
For i = 2 To UBound(tablo)
If tablo(i, 1) <> tablo(i - 1, 1) Then ListBoxDate.AddItem tablo(i, 1)
Next
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 11 févr. 2013 à 17:11
Bonjour,
Déjà :
For i = 1 To UBound(tablo)
For j = 1 To UBound(tablo)
met en exergue une incompréhension de ce que sont les limites (et comment elles s'expriment) d'un tableau dynamique à plusieurs dimensions !
Je refuse de corriger. Je veux te voir le faire toi-même après avoir consulté la rubrique Ubound dans ton aide VBA (fort claire et avec un exemple non moins clair)
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 12 févr. 2013 à 10:47
J'ai passé toute la matinée de hier à trouver ma solution je suis allé même sur le site de Microsoft pour voir plus clair Ubound
et moi, je viens d'ouvrir la rubrique Ubound, directement sur ma machine, dans l'aide VBA !
Et ne persiste et signe :
Je veux te voir le faire toi-même après avoir consulté la rubrique Ubound dans ton aide VBA (fort claire et avec un exemple non moins clair)
A moins que tu ne saches pas comprendre ce qui y est écrit en français !
Prends un bon café, réveille-toi ... ou laisse tout tomber
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
C'est bon le soucis est réglé !!!
En faite j'avais bien fait des modifications du genre Ubound(tablo,1) et ça na jamais fonctionné avec mon code mais le soucis venai plus haut j'ai du lui faire commprendre où il devait regarder pour trouver la bonne colonne