IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Espaces entre des chiffres


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de frunch
    Homme Profil pro
    Développeur / comptable
    Inscrit en
    Janvier 2022
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur / comptable
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2022
    Messages : 174
    Par défaut Espaces entre des chiffres
    Bonjour le forum,
    Je cherche à publier les taux de natalité par pays, mais les données sont groupées par pays pour les 4 taux.
    Je pense m'en sortir avec la fonction instr puis une boucle sur chaque pays, mais je n'arrive pas à séparer les chiffres.
    Cà fonctionne que pour du texte ?

    taux natalité Monde.xlsm
    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 598
    Billets dans le blog
    67
    Par défaut
    Bonjour,

    Vous pouvez utiliser la fonction split avec comme séparateur " ", avec comme idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    C1 = split(A1," ")(0)
    D1 = split(A1," ")(1)
    E1 = split(A1," ")(2)
    ...
    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  3. #3
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 120
    Par défaut
    Salut

    En effet Split sera plus intéressant dans ton cas.
    A savoir que tu peux aussi mettre le résultat du split dans une variable de type variant pour éviter de refaire autant de split que d'info à extraire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Tab_Val as Variant
     
      Tab_Val = Split(Feuil1.Range("A1").Value, " ")
     
      '...
      Feuil1.Range("D1").Value = Tab_Val(0)
    Feuil1.Range("E1").Value = Tab_Val(1)
    F1 sur split pour plus d'info

    Par contre pour ce qui est de ton code, ton erreur vient du Mid, le dernier paramètre n'est pas le position de fin de chaine mais la longueur de la chaine que tu veux récupérer. Ici ça serait plutôt un truc style d-c (avec peut-être un +1 à voir).
    F1 sur Mid pour avoir son descriptif dans l'aide .

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  4. #4
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour à tous,
    Je cherche à publier les taux de natalité par pays, mais les données sont groupées par pays pour les 4 taux.
    Vu quelques soucis de données dans ton classeur c'est un peu plus complexe que prévu.

    Je t'ai fait une procédure qui devrait le faire.

    Bon test
    Fichiers attachés Fichiers attachés

  5. #5
    Membre très actif
    Avatar de frunch
    Homme Profil pro
    Développeur / comptable
    Inscrit en
    Janvier 2022
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur / comptable
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2022
    Messages : 174
    Par défaut
    Bonjour le forum,
    Merci pour vos réponses.
    J'en étais au bug sur le nom des pays vu les espaces pour certains.
    Merci anasecu d'avoir été jusqu'au bout pour moi.
    Il me reste à comprendre ton code.
    Voila la page originale avec l'année des taux

  6. #6
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 508
    Par défaut
    Bonjour à tous,
    Sinon voici une fonction basée sur les expressions régulières, avec l'aide de ma copine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    Function ExtractData(cellSource As Range) As Variant
        '    Dim FirstNumber As String
     
        If IsEmpty(cellSource.Value) Or Trim(cellSource.Value) = "" Then
            ExtractData = CVErr(xlErrValue)            ' Renvoie une erreur si vide
            Exit Function
        End If
     
        Dim stringSource As String
        stringSource = Trim(cellSource.Value)
     
        ' // Configuration de l'expression régulière ---
        Dim regEx As Object
        Set regEx = CreateObject("VBScript.RegExp")
        regEx.IgnoreCase = True
        regEx.Global = True
     
        ' // Le motif Regex pour capturer les trois parties :
        ' (\d+)\s+             -> Capture le premier nombre (ex: 5) suivi d'un ou plusieurs espaces
        ' (                    -> Début du groupe pour le nom du pays
        '   (?:(?![\d,]).)+    -> Capture n'importe quel caractère SAUF un chiffre ou une virgule (pour le pays)
        '                       -> (?:...) est un groupe non-capturant. (?!...) est une assertion négative.
        ' )+                   -> Le groupe pays peut contenir plusieurs mots séparés par des espaces
        ' \s* -> Zéro ou plusieurs espaces (entre pays et nombres)
        ' ([\d\s,.]+)          -> Capture tous les nombres de fin, espaces, virgules et points (ex: 45,00 44,53...)
        ' Le pattern est ajusté pour être plus robuste :
        ' ^(\d+)\s+                             ' Groupe 1: Le premier nombre au début de la ligne
        ' (.*?)                                 ' Groupe 2: Le nom du pays (non-greedy)
        ' (\d{1,},\d{2}|\d{1,}\.\d{2}(?:\s+\d{1,},\d{2}|\s+\d{1,}\.\d{2})*)?$ ' Groupe 3: Les nombres décimaux finaux
        '                                                                 ' (?:\s+\d{1,},\d{2}|\s+\d{1,}\.\d{2})* pour capturer les nombres décimaux
        ' Nouvelle Regex améliorée pour capturer proprement les 3 groupes :
        ' Groupe 1: le premier nombre (ex: "5")
        ' Groupe 2: le nom du pays (ex: "Congo (RDC)") - non-greedy, jusqu'à ce qu'il voie le début d'un nombre décimal
        ' Groupe 3: les nombres décimaux de fin (ex: "45,00 44,53 42,31 41,42")
        regEx.Pattern = "^(\d+)\s+(.*?)\s*(\d{1,}[,.]\d{2}(?:\s+\d{1,}[,.]\d{2})*)$"
     
        Dim matches As Object
        Set matches = regEx.Execute(stringSource)
     
        If matches.Count > 0 Then
            Dim match As Object
            Set match = matches.Item(0)                         ' On prend la première (et seule) correspondance complète
     
            ' // Extraire les groupes capturés
            ' // Le premier groupe n'est pas utilisé directement dans le tableau final, mais il est capturé
            ' // PremierNombre = match.SubMatches(0) ' Non nécessaire pour le tableau final
     
            Dim CountryName As String
            CountryName = Trim(match.SubMatches(1))             ' // Le nom du pays
            Dim finalNumbersString As String
            finalNumbersString = Trim(match.SubMatches(2))      ' // La chaîne des nombres finaux
     
            ' // Préparer le tableau de résultats
            ' // Le tableau contiendra le nom du pays + autant d'éléments que de nombres finaux
            Dim tempNumber() As String
            tempNumber = Split(finalNumbersString, " ")
            Dim tabResults() As Variant
            ReDim tabResults(0 To UBound(tempNumber) + 1)       ' + 1 pour le pays
     
            ' Remplir le tableau
            tabResults(0) = CountryName                         ' Le pays en première position
     
            Dim indexResult As Long
            indexResult = 1
            Dim counter As Long
            For counter = 0 To UBound(tempNumber)
                If Trim(tempNumber(counter)) <> "" Then         ' Éviter les espaces doubles qui créeraient des éléments vides
                    Dim nombreTemporaire
                    nombreTemporaire = Trim(Replace(tempNumber(counter), ",", Application.DecimalSeparator))
                    On Error Resume Next                        ' Gérer les erreurs de conversion
                    tabResults(indexResult) = Round(CDbl(nombreTemporaire), 0)
                    If Err.Number <> 0 Then
                        tabResults(indexResult) = CVErr(xlErrValue) ' Si conversion échoue
                    End If
                    On Error GoTo 0
                    indexResult = indexResult + 1
                End If
            Next counter
            ' Redimensionner le tableau si des éléments vides ont été sautés
            If indexResult <= UBound(tabResults) Then
                ReDim Preserve tabResults(0 To indexResult - 1)
            End If
     
            ExtractData = tabResults                   ' Renvoyer le tableau pour le débordement
        Else
            ExtractData = CVErr(xlErrValue)            ' Aucune correspondance trouvée
        End If
    End Function
    Fonction à mettre dans une cellule, puis sélectionner la cellule source. Si besoin faire une recopie...
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en :resolu: Vous avez aimé la discussion alors un :plusser: fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 169
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Personnellement, j'utiliserais Power Query.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 508
    Par défaut
    Bonjour à tous,
    Personnellement, j'utiliserais Power Query.
    Très bonne idée. Il va falloir que je m'y mette sérieusement. Petite question en passant, peut-on avoir les résultats sur la même feuille des données ?
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en :resolu: Vous avez aimé la discussion alors un :plusser: fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  9. #9
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 228
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Personnellement, j'utiliserais Power Query.
    Hello,
    comme le suggère Philippe avec une version d'Excel >= 2016, avec PowerQuery c'est tout simple car les données d'origine sont dans une table de page web :
    Code PowerQuery : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let    Source = Web.BrowserContents("https://atlasocio.com/classements/demographie/natalite/classement-etats-par-taux-de-natalite-monde.php"),
        #"Table extraite à partir de code Html" = Html.Table(Source, {{"Column1", "TD:nth-child(2)"}, {"Column2", "TD:nth-child(3)"}, {"Column3", "TD:nth-child(4)"}, {"Column4", "TD:nth-child(5)"}, {"Column5", "TD:nth-child(6)"}, {"Column6", "TBODY .noteTable"}}, [RowSelector="TBODY TR"]),
        #"Type modifié" = Table.TransformColumnTypes(#"Table extraite à partir de code Html",{{"Column1", type text}, {"Column2", type number}, {"Column3", type number}, {"Column4", type number}, {"Column5", type number}, {"Column6", type text}}),
        #"Colonnes renommées" = Table.RenameColumns(#"Type modifié",{{"Column1", "Pays"}, {"Column2", "Taux 1"}, {"Column3", "Taux 2"}, {"Column4", "Taux 3"}, {"Column5", "Taux 4"}}),
        #"Colonnes supprimées" = Table.RemoveColumns(#"Colonnes renommées",{"Column6"})
    in
        #"Colonnes supprimées"

    Nom : TauxNatalité.png
Affichages : 117
Taille : 31,1 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko :zen:

  10. #10
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour à tous,

    @ frunch

    Je pense m'en sortir avec la fonction instr puis une boucle sur chaque pays
    Tu avais bien raison car j'ai essayé et comme tu verras c'est bien plus simple !

    @Valtrase

    J'ai installé ta fonction mais cela fonctionne sans réparer les aléas des données.

    @ Philippe Tulliez

    Personnellement comme je ne sais pas faire avec Power Query, j'aimerais bien voir le résultat.

    Bonne soirée à vous

    Edit:

    @ jurassic pork

    Merci pour ton message que je n'avais pas vu tu combles mon interrogation en partie car tu pars du web mais c'est bien sur plus simple.
    Fichiers attachés Fichiers attachés

  11. #11
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 508
    Par défaut
    Bonjour à tous,
    J'ai installé ta fonction mais cela fonctionne sans réparer les aléas des données.
    Réparer les aléas des données ? je ne comprends pas
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en :resolu: Vous avez aimé la discussion alors un :plusser: fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  12. #12
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    re

    Réparer les aléas des données ? je ne comprends pas
    Certaines cellules s'étendent sur plusieurs lignes.
    Regarde la feuille où j'ai mis ta fonction en masquant les erreurs.

  13. #13
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 508
    Par défaut
    Bonjour,
    En lançant Power Querry je me suis rendu compte qu'il y a plusieurs tableaux qu'il est possible de récupérer su la page Web.
    La solution la plus pérenne est l'utilisation de Power Querry. Je ne suis pas expert et j'ai réussi à sortir les données, en faisant quelques modifications y compris l'arrondi sur les résultats et cela en 3mn chrono.
    Alors pourquoi s'en priver ?
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en :resolu: Vous avez aimé la discussion alors un :plusser: fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  14. #14
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 169
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je ne suis pas expert et j'ai réussi à sortir les données, en faisant quelques modifications y compris l'arrondi sur les résultats et cela en 3mn chrono.
    Je programme en VBA depuis près de 25 ans mais depuis que j'utilise Power Query, il n'est plus question de VBA lorsqu'il s'agit d'importer et transformer des données. Tellement plus simple et plus rapide
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Suppression d'espaces entre des chiffres
    Par rambc dans le forum Général Python
    Réponses: 7
    Dernier message: 20/11/2008, 22h37
  2. Insérer automatiquement un espace entre deux chiffres
    Par mosta2010 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/06/2008, 08h03
  3. Espace entre les chiffres
    Par arnest dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 23/01/2008, 13h41
  4. Espacement entre des <div> générés en PHP
    Par VincentG dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 07/04/2007, 20h30
  5. string.format : mettre un espace entre deux chiffres
    Par SOPRA-Eherve dans le forum VB.NET
    Réponses: 2
    Dernier message: 06/03/2007, 14h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo