Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Extraire le code pays d'une référence avec un code VBA

Faroyo

XLDnaute Junior
Bonjour,

je sèche sur un pb de traitement de données. J'ai une liste de produit de provenance diverses (feuille "data"). En fonction de l'origine, des droits de douanes s'appliquent. J'aimerai pouvoir extraire le code pays et ainsi pouvoir determiner s' il est en provenance de la CEE ou non (feuille "pays"). Le code pays n'a pas de position fixe dans le texte et il est composé de 2 ou de 3 caractères (code pays mis en rouge pour l'exemple).
Résumé de la demande:
-identifier le code pays colonne A feuille data, 2 à 3 caractères et position non fixe.
-Recherche la provenance dans le tableau feuille "pays" et le reporter dans la colonne B feuille "data".

Dans l'attente de vous lire
Merci pour votre aide !
 

Pièces jointes

  • pays.xlsx
    18.5 KB · Affichages: 11

Faroyo

XLDnaute Junior
Merci pour votre avis positif Faroyo.

J'ai modifié le code pour prendre en compte les nouvelles saisies de données. Évidemment, il peut toujours y avoir une nouvelle complication, mais je pense que la formule renvoie un bon résultat.
Bonjour DJunqueira,
Je viens de prendre connaissance de votre solution.
Ça ne semble pas fonctionner pour les deux dernières lignes. Y a t-il quelque chose de particulier à faire pour faire fonctionner le fichier.
Merci
 

dysorthographie

XLDnaute Accro
Bonjour,
déjà nous avons ModuleRequeteurUniversel qui contient toutes les routines de communication avec une base de données.

VB:
Static Cn As Object
If Cn Is Nothing Then
    Set Cn = CreateObject("Adodb.Connection")
    Cn.Open (GenereCSTRING(Xls, Base:=ThisWorkbook.FullName))
End If
ici comme je considère ton fichier Excel comme une base de données, j'effectue une connexon dessus ; j'utilise une variable static pour garder la connexion ouverte à l'intérieur de la fonction uniquement!

une requête SQL est un descriptif d'une demande?
par exemple je veux sélectionner tel et tel information en provenance de la table1 filtré sur tel valeur!

Code:
Const SQL As String = "SELECT [F3] FROM [pays$] WHERE [F2]=?"
vue que la première ligne d'onglet pays n'est pas un titre de colonne, j'utilise F1 pour colonne A,F2 B,etc.

notes que la syntaxe vue qu'on appel l'onglet ave $ [pays$] je t'invites à toujours mettre le noms des tables {oui si je considère Excel comme une base de données, j'emploie les termes d'une base de données} et des champs entre crochets [] ça t'éviteras des désagrément si tu as des espace dans leurs nom!
je sélectionne la colone [F3] {C} from [pays$] {en provenance de la table [pays$]} WHERE [F2]=? {filtré sur B= paramètre indéfinit}

Code:
With ExecuteRequete(SQL, Cn, "P", UCase(T(I)))
ici nous exécutons la requête en fournissant le paramètre "P" qui viendra ce substituer à ? et enfin ça valeur UCase(T(I)).

Code:
 If Not .EOF Then
                CodePays = !F3
                 .Close
                Exit For
            End If
ici nous vérifions si la requête retourne une valeur : If Not .EOF
si oui un donne à la fonction la valeur de la colonne C : CodePays = !F3
on cloture la requête et on quitte la fonction: .Close; Exit For

j'ai modifié le code pour afficher les 2 colonnes!
Code:
Public Function CodePays(Code As String) As String
Static Cn As Object
If Cn Is Nothing Then
    Set Cn = CreateObject("Adodb.Connection")
    Cn.Open (GenereCSTRING(Xls, Base:=ThisWorkbook.FullName))
End If
Const SQL As String = "SELECT [F3],[F1] FROM [pays$] WHERE [F2]=?"
Const SQL1 As String = "SELECT [F7],[F5] FROM [pays$] WHERE [F6]=?"
Dim T() As String, I As Integer
T = Split(Replace(Replace(Code, Chr(160), Chr(32)), "-", Chr(32)))
For I = UBound(T) To LBound(T) Step -1
    If Len(T(I)) < 4 Then
        With ExecuteRequete(SQL, Cn, "P", UCase(T(I)))
            If Not .EOF Then
                CodePays = .Getstring(, , "|")
                 .Close
                Exit For
            End If
            .Close
        End With
        With ExecuteRequete(SQL1, Cn, "P", UCase(Left(T(I), 2)))
            If Not .EOF Then
                CodePays = .Getstring(, , "|")
                 .Close
                Exit For
            End If
            .Close
        End With
    End If
Next
If CodePays = "" Then CodePays = "-?-"
End Function
 

dysorthographie

XLDnaute Accro
AGR ne figure pas dans la liste des pays en revanche on trouve ARG; en tout cas dans le fichier que tu nous as donné c'est bien AGR!
Pour la ligne 17 il y le caractère 160 et le trai d'union.

VB:
T = Split(Replace(Replace(Code, Chr(160), Chr(32)), "-", Chr(32)))
 
Dernière édition:

Faroyo

XLDnaute Junior
Merci beaucoup pour toutes vos explication et votre temps passé à solutionner mon pb.

Ce que vous avez fait est top.
Un très bon WE à vous.
 

Faroyo

XLDnaute Junior
Merci beaucoup pour toutes vos explication et votre temps passé à solutionner mon pb.

Ce que vous avez fait est top.
Un très bon WE à vous.
Une derrière petite question:
si je devais avoir des designations produits avec un voir deux mots plus.
Me serait-il possible d'adapter facilement votre code pour prendre en compte ce dernier paramètre?

EX: SODA BTLPET 10X1L Orange HU

Merci
 

DJunqueira

XLDnaute Occasionnel
Bonjour a tout,

En plus des problématiques évoquées par la dysorthographie dans mon rôle j'ai choisi de rechercher le premier 'code' (séquence de 3 ou 2 lettres) trouvé et s'il est relié par un trait d'union le code ne sera pas détecté. En revanche, la question de l'espace (code 160) a été résolue.
 

Faroyo

XLDnaute Junior
Merci beaucoup pour toutes vos explication et votre temps passé à solutionner mon pb.

Ce que vous avez fait est top.
Un très bon WE à vous.

Houla,
je viens de me rendre compte que ma dernière la taille variable du texte question n'était pas pour dysorthographie mais pour Sylvanu. Je me suis un peu mélangé les crayons entre les 3 solutions.
Ma dernière question pour dysorthographie et promis c'est la dernière,
y a t-il un moyen de lancer la recherche à partir d'un bouton?

Merci
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…