Rechercher dans une page la valeur d'une cellule (dans un string)

Bonjour tous le monde,

Je suis bloqué dans mon code de mise en page...
Pour faire court, j'ai un tableau et avec VBA je le transforme en vrai tableau et je crée une nouvelle colonne.
Cette colonne ("CNUM" que je viens de créer a coté de la colonne "VILLE"), je veux la remplir un nombre corréspondant à la ville.
Ayant plusieurs villes du meme nom, j'aimerai que chaque cellules de ma nouvelle colonne (CNUM) soit une dropbox à choix multiple.
Dans ce but, j'ai créé deux nouvelles feuilles (Dropbox ou j'ai mon tableu avec les cases corréspondante aux villes) et Sheet2 (ou je crée mes listes pour mes futures Dropbox).

Je cherche donc les villes commençant par la meme suite de character que celles dans la colonne VILLE.

Après avoir automatiquement sélectionné mon tableau, voici mon code :

    Dim I As Integer                                                                                                
        For I = 1 To Selection.Rows.Count

            Dim rFoundAddress As Range
            Dim sFirstAddress As String
            Dim x As Long
            Dim VILLA As String

            VILLA = ThisWorkbook.Worksheets("Liste candidats").Range("MonTab[VILLE]")(I)

            x = 1
            With ThisWorkbook.Worksheets("Dropdown").Columns(2)
                Set rFoundAddress = .Find("NOMDEVILLE*", LookIn:=xlValues, LookAt:=xlWhole)
                If Not rFoundAddress Is Nothing Then
                    sFirstAddress = rFoundAddress.Address
                    Do
                        ThisWorkbook.Worksheets("Sheet2").Cells(x, 1 + (I - 1) * 3) = .Cells(rFoundAddress.Row, 1 - 1)
                        ThisWorkbook.Worksheets("Sheet2").Cells(x, 2 + (I - 1) * 3) = .Cells(rFoundAddress.Row, 1)
                        x = x + 1
                        Set rFoundAddress = .FindNext(rFoundAddress)
                    Loop While Not rFoundAddress Is Nothing And _
                        rFoundAddress.Address <> sFirstAddress
                End If
            End With

        Next

Si j'écris la ville dans mon code, ca fonctionne. Mais j'aimerai me servir du string VILLA à la place.
(Si possible en faisant en sorte que les accents et l' ne soit pas pris en compte)

Je suis vraiment bloqué
Merci d'avance.

Rebonjour,

Vu que je n'ai pas de réponse, j'imagine que je suis peut être pas assez clair sur ce que je demande...

En fait, "VILLA" prend une valeur differente a chaque Loop (exemple : Paris, Marseille, Lyon)

Ce que j'aimerai c'est utiliser ces différentes valeurs dans ma formule a cet endroit :

Set rFoundAddress = .Find("NOMDEVILLE*", LookIn:=xlValues, LookAt:=xlWhole)

j'espere être plus Claire et rendre mon problème plus compréhensible ainsi .

merci

Bonjour

j'espere être plus Claire et rendre mon problème plus compréhensible ainsi

pour être plus clair

Bonjour,

Essayez peut-être avec :

Set rFoundAddress = .Find(What:=VILLA & "*", LookIn:=xlValues, LookAt:=xlWhole)

Cdlt,

Merci beaucoup.

ca marche exactement comme prévu.

j'utilise maintenant la valeur de "VILLA" pour rechercher toute les villes commancent par cette valeur.

j'ai une autre question.

est-il possible de faire en sorte que la recherche me retourne les mêmes résultats lorsqu'il y a des accents ou qu'il n'y en a pas , lorsque les "-" sont présents ou oubliés et lorsque les "l' " sont présents ou oubliés ?

en tout cas merci encore pour mon problème précédent...

j'essayai de déplacer les parenthèses et les " pour faire fonctionner tout ça mais ça ne marchait jamais...

Et bien tout est possible quand on y met les moyens mais ça peut s'avérer compliqué...

En l'état, je ne peux pas vous répondre car je ne sais pas comment sont orthographiés les noms des villes ni dans votre tableau ni dans la feuille "Dropdown"...

Cdlt,

Voici comment sont présentées les villes dans le premier tableau :

z5pfa 2

Voici comment elles le sont dans le deuxième :

sprhe

Pour donner un exemple avec le tableau ci dessus, actuellement, si il est écrit "Ile-d entree" (3eme ligne en partant du bas), j'ai bien le résultat 01023 qui me revient, car l'orthographe est 100% identique !

par contre, si (dans le premier tableau) il est écrit : "l'ile d entree", "île d entree", "ile d'entree" ou même "ile d entrée" je n'ai pas le même résultat !

Même constat avec tout les déterminant comme "Les" sur la première ligne du tableau qui ne sera pas forcément écrit dans le premier tableau.

Bonjour à tous,

Personnellement je suis resté bloqué sur le titre du poste. "Rechercher dans un string"

Salut Xmenpl,

Tu ne penses qu'à ça décidément... Attention, ça peut être m*rdeux de trop chercher dans les strings...

@Sartou : Mais les données, vous en avez le contrôle ou pas ? Est-ce qu'il ne faudrait pas alignées les villes du tableau 1 sur celles du tableau 2 ?

Cdlt,

J'ai le contrôle sur les données.

La feuille 2 (Dropdown), je ne veux pas la modifier, je veux qu'elle reste toujours pareil.

Mon but est de copier l'intégralité des feuilles excel que je dois charger et les coller sur La feuille 1 (Liste candidats). Ce n'est jamais le meme tableau, les colonnes sont placées différemment, ma chance est que le tableau commence toujours ligne 15 (ce qui me facilite la détection de la taille du tableau).

Je dois envoyer les données présentes sur la feuille 1 vers un intranet donc je m'assure que la feuille 1 soit toujours la plus identique possible.

Avec mon code actuelle voici un exemple de ce a quoi resemble la feuille 3 :

(3Colonnes, 1espace, 3Colonnes, etc...)

bbb

Et voici à quoi resemble la feuille 1 (Liste Candidats) lorsque je clique sur les Dropbx (autorisant la saisie manuelle libre du texte) qui prennent leurs sources sur la feuille 3 (Sheet2) :

ccc

Ici, j'aimerai que les fautes d'orthographes courantes (Lettre simple plutôt que double, accents, cédille, déterminant, trait d'union) n'aient pas d'impact sur les résultats dans mes Dropbx. Un peu comme les "?" si je pouvais faire : Find("Saint?Laurent*")

Après je suis "plongé" dans le VBA que depuis un mois alors il est possible que je n'ai pas réfléchis de manière optimisé a mon problème...

Bonjour, je viens de penser à quelque chose.

Est ce que la seule solution (pour retirer les déterminants) serait finalement de créer une autre feuille à l'aide d'une fonction. Je pourrai ainsi relever les résultats qui ont une correspondance, les retrouver dans la feuille "Dropdown" grâce à leurs numéro afin de composer ma feuille "Sheet2" avec le bon orthographe ?

Pour les accents et cédille, je viens de penser à une autre solution ou je pourrais simplement modifier les caractères du tableau "Liste candidats" qui comportent des accents ou des cédilles par "?" afin que la fonction find cherche toutes les combinaisons possible ?!

Bonjour,

Honnêtement, c'est pas évident de répondre sans voir le fichier...

Ce que je me dis, c'est qu'il faut que les noms soient toujours sous la même forme et donc si possible en majuscules et pour ma part, je remplacerais tous les espaces et apostrophes par des tirets... Quant aux caractères spéciaux, il est possible d'effectuer du remplacement massif (ç,é, è â, ê, ...) avec la méthode replace (qui n'est finalement que le complément de la méthode find).

Cdlt,

Rebonjour ,

J'ai réussi a remplacer les caractère par des "?"

Exemple : Saint-Remy devient Saint?R?my et la fonction FIND cherche les possibilités comme Saint Remy, Saint-Ràmy, etc.

Par contre j'ai deux autres questions pour lesquelles je ne trouve pas encore de solution.
La premiere fait référence a REPLACE:
Comment puis-je faire pour que ST. par exemple, soit remplacer par Saint? si et seulement si il se trouve à gauche (ou dans les x premiers caractère) .
Je veux par exemple que St.Remy soit changer mais que Winshester ST. reste intact.

La second fait référence a mon code :

 For I = 1 To rng4.Rows.Count

            Dim rFoundAddress As Range
            Dim sFirstAddress As String
            Dim x As Long

            Dim VILLA, aa, bb As String

            Dim CNumRange As Range
            Dim CNumString As String

                'CNumSelection = ThisWorkbook.Worksheets("Liste candidats").Range("MonTab[CNUM]")(I)
                ThisWorkbook.Worksheets("Liste candidats").Range("MonTab[CNUM]")(I).Select
                        With Selection.Validation
                            .delete
                            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                            xlBetween, Formula1:="=Sheet2!$A:$A"
                            .IgnoreBlank = True
                            .InCellDropdown = True
                            .InputTitle = ""
                            .ErrorTitle = ""
                            .InputMessage = ""
                            .ErrorMessage = ""
                            .ShowInput = True
                            .ShowError = False
                        End With

            VILLA = ThisWorkbook.Worksheets("Liste candidats").Range("MonTab[VILLE]")(I)

J'aimerai pour utiliser "I" pour retrouver la source de mes dropdown list dans l'emplacement Formula1:=
L'emplacement des colonnes sources est pour chaque ligne :
ThisWorkbook.Worksheets("Sheet2").Cells(x, 1 + (I - 1) * 4)

Merci encore pour votre grand aide.
(Je n'ai pas osé recréer un sujet vu que ma nouvelle question est liée)

Bonjour sartou,

Je ne sais pas vraiment quoi vous répondre, si ce n'est de joindre un fichier !

En tout cas, sans plus d'informations, voici une alternative pour les ST et éventuellement aussi pour toute autre chaine spéciale au début (à définir en dur dans le code tout comme la chaine de remplacement) :

Sub test()

dim reg as object
set reg = createobject("vbscript.regexp")

temp = plage
cherche = array("ST.", "PT.", "PR.") 'exemples de texte à chercher en début de chaine
remplct = array("SAINT", "PRESIDENT", "PROFESSEUR") 'exemples de textes de remplacement

with reg
    .global = true
    .ignorecase = true
    for i = lbound(temp) to ubound(temp) 'pour chaque ligne
        for k = lbound(temp, 2) to ubound(temp, 2) 'pour chaque colonne
            for j = lbound(cherche) to ubound(cherche) 'pour chaque critere (txt recherché)
                .pattern = "^" & cherche(j)
                if .test(temp(i, k)) then temp(i, k) = .replace(temp(i, k), remplct(j)): exit for 'remplacement par item j de remplct
            next j
        next k
    next i
end with

plage = temp 'restitution des données

end sub

Il faudra remplacer plage par la range en question.

Quant à la seconde question, je n'ai rien compris, désolé... Mais il est possible de mettre à jour une liste de validation par formule uniquement, si c'est votre objectif.

Cdlt,

Bonjour et merci pour ton aide.

Ton code marche très bien excepter un petit problème : Si la ville est Stanford par exemple, le nom est changé pour SAINT-nford.

Pour ma second question en fait voila ce que je cherche a faire :

.Je sélectionne moi meme le tableau (J'ai trouvé que c'était le moyen le plus simple) et je lance ma macro :

.Sur la feuille 1 (Liste des candidats), le macro fait un tableau et créer les nouvelles colonnes
.Il cherche les villes (dans la feuille 2 Dropdown) qui correspondent le plus avec celle de la colonne VILLE de ma feuille 1 (Liste de candidats)
.Il place ces villes sur la feuilles 3 (Sheet2) afin de m'en servir de source
.Il génère des dropdown list pour chaque candidat dans la colonne CNUM
Et là, j'aimerai que mes dropdown liste aille chercher la source associé aux candidats

Voici le fichier :

4test1.zip (375.54 Ko)

Salut sartou,

C'est quand même mieux avec le fichier !

J'ai modifié un peu le code (il n'y avait pas le tableau MonTab je crois). Ici, j'utilise des expressions régulières. Si tu veux en savoir plus, voici un lien utile :

https://www.sheets-pratique.com/fr/fonctions/regexmatch

"^" signifie début de chaine, "\W+" au moins 1 caractère non alphanumérique...

"$" signifie fin de chaine et pourrait te servir pour les ST. (street).

Cdlt,

8test1.zip (391.18 Ko)

Vraiment merci beaucoup.
Ca fonctionne encore mieux que je ne l'espérai !

Pour le tableau, il se créé tout seul si tu lance la macro principale [Module 1 "MiseEnForme"] en ayant préalablement séléctionner la dimension souhaité ( Range("A20:K27") dans ce cas).

Et donc ma deuxième question concernait la macro [VILLAsub] présente dans le module 1 à la suite de [MiseEnForme].

Je cherche une solution mais je ne sais meme pas si c'est possible

Dim CNumString As String

CNumString= "=Source des dropdown list : ThisWorkbook.Worksheets("Sheet2").Columns(1 + (I - 1) * 4)"

                ThisWorkbook.Worksheets("Liste candidats").Range("MonTab[CNUM]")(I).Select
                        With Selection.Validation
                            .Delete
                            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                            xlBetween, Formula1:=CNumString
                            .IgnoreBlank = True
                            .InCellDropdown = True
                            .InputTitle = ""
                            .ErrorTitle = ""
                            .InputMessage = ""
                            .ErrorMessage = ""
                            .ShowInput = True
                            .ShowError = False
                        End With

J'aimerai utiliser [CNumString] dans [Formula1:=] afin que chaque dropdown list ait la bonne source (Source qui change à chaque fois)

Merci encore pour toute l'aide que tu m'as apporté en tout cas.

Honnêtement, c'est compliqué pour moi d'y voir clair, je dois mener une véritable enquête pour m'y retrouver...

Ce que je peux te dire, c'est qu'il vaut mieux avoir des tableaux structurés partout où tu peux en avoir. Il vaut mieux ne pas laisser de lignes vides, ceux-ci se restructurant automatiquement à chaque ajout de valeurs.

Pour les validations, avec la formule :

=INDIRECT("NOMTABLEAU[NOMCOLONNE]")

On obtient automatiquement une liste de validation qui se met à jour.

Il est possible d'y ajouter la fonction DECALER :

=DECALER(INDIRECT("NOMTABLEAU");;2;;1)

Ici, la 3è colonne est ciblée (par un décalage de 2 colonnes et un retaillage de la largeur à 1 colonne). Les champs laissés vides correspondent respectivement au décalage de lignes et au retaillage de la hauteur.

Dans le code, en intégrant une variable k pour décider du décalage, ça ressemblerait à ça :

maformule = "=OFFSET(INDIRECT(""NOMTABLEAU""),," & k & ",,1)"

with selection.validation
    '...
    .add ..., Formula1:=maformule
end with

Je sais pas si je réponds plus ou moins à ton interrogation...

Ca répond un petit peu mais je vois toujours pas trop comment réaliser ca.

Pour donner un exemple avec 3 candidats.

Candidat 1 habite à Paris
Candidat 2 habite à Lyon
Candidat 3 habite à Clermont-fd

    Dim I As Integer                                                                                                
        For I = 1 To rng4.Rows.Count

(rng4.Rows.Count recherche le nombre de candidat)

Là je cherche le code des différentes villes dans l'onglet "Dropdown". Chaque résultat positif est copié dans l'onglet "Sheet2".

With ThisWorkbook.Worksheets("Dropdown").Columns(2)              
  Set rFoundAddress = .Find(VILLA & "*", LookIn:=xlValues, LookAt:=xlWhole)                           
                If Not rFoundAddress Is Nothing Then
                    sFirstAddress = rFoundAddress.Address
                    Do                                                                                              
                        ThisWorkbook.Worksheets("Sheet2").Cells(x, 2 + (I - 1) * 4) = .Cells(rFoundAddress.Row, 1 - 1)
                        ThisWorkbook.Worksheets("Sheet2").Cells(x, 3 + (I - 1) * 4) = .Cells(rFoundAddress.Row, 1)

Je rassemble les deux information précédemment obtenu sur une seule et même colonne

ThisWorkbook.Worksheets("Sheet2").Cells(x, 1 + (I - 1) * 4) = aa & " " & bb

A ce stade, La source necessaire à la création de la dropdown list pour Paris se trouve "Sheet2" Colonne A
La source nécessaire à la création de la dropdown list pour Lyon se trouve "Sheet2" Colonne E
La source nécessaire à la création de la dropdown list pour Lyon se trouve "Sheet2" Colonne I

Il me faut alors générer les liste :

            Dim CNumString As String
            CNumStrting = "=Sheet2!$A:$A"

                ThisWorkbook.Worksheets("Liste candidats").Range("MonTab[CNUM]")(I).Select
                        With Selection.Validation
                            .Delete
                            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                            xlBetween, Formula1:=CNumString
                            .IgnoreBlank = True
                            .InCellDropdown = True
                            .InputTitle = ""
                            .ErrorTitle = ""
                            .InputMessage = ""
                            .ErrorMessage = ""
                            .ShowInput = True
                            .ShowError = False
                        End With

J'aimerai donc que CNumString donne l'emplacement des sources correspondantes.

Ce que j'aimerai, ce serait un moyen de désigner numériquement une colonne dans l'espace [Formula1:] avec l'aide du [I=1 To rng4.Rows.Count] afin que chaque dropdown liste ait pour source celle qui lui est destinée.

Je suis désolé, je fais de mon mieux pour être clair...

En fait, ce qu'il faut, c'est un exemple sorti du contexte de ton fichier, avec 0 code, le tableau MonTab et la feuille Sheet2 et le résultat que tu souhaites obtenir. Sinon, même si je commence à cerner, ça reste vague.

Je propose une formule de validation qui dépend de la dernière ligne trouvée en colonne A de Sheet2.

Par ailleurs, je propose également une formule avec la fonction DECALER qui dépend de cette même variable dl et surtout de la variable I sur laquelle on boucle si j'ai bien compris. A chaque I, on renvoie la liste 4 colonnes après la précédente. C'est bien ça ?

Dim strformule As String, dl&
dl = sheets("Sheet2").cells(rows.count, 1).end(xlup).row
strformule = "=Sheet2!$A1:$A" & dl
'strformule = "=OFFSET(Sheet2!$A1:A" & dl & ",, 1 + (" & I & "-1) * 4)" '<<< au sein de boucle, décale de 4 colonnes tous les I

with ThisWorkbook.Worksheets("Liste candidats").Range("MonTab[CNUM]")(I)
    With .Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= xlBetween, Formula1:=strformule
        .ShowError = False
    End With
end with

Cdlt,

Rechercher des sujets similaires à "rechercher page valeur string"