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
NextSi 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 :
Voici comment elles le sont dans le deuxième :
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...)
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) :
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 subIl 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 :
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,
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 WithJ'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 withJe 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 & " " & bbA 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 WithJ'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 withCdlt,