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

VBA Discussion :

Tester une condition dans un XML avec VBA


Sujet :

VBA

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 38
    Points : 18
    Points
    18
    Par défaut Tester une condition dans un XML avec VBA
    Bonjour,

    Voilà je bloque ... j'ai une fonction qui est sensée lire un fichier KML pour lequel le nœud "coordinates" n'est pas toujours présent. Alors je comptais tester le nom du nœud est sauter une ligne s'il n'existe pas ! Mais voilà ça semble et doit être tout "con" mais bon, mon script ne fonctionne pas correctement oui ils affiche les valeurs, mais il ne saute pas la ligne lorsque qu'il n'y en à pas. Je pense en outre que le "For Each" n'est peut être pas très adapté.
    Si un âme charitable a une solution je suis preneur.



    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
    Function Coordinates(file As String)
     
        Set XMLDoc = CreateObject("Microsoft.XMLDOM")
        XMLDoc.async = False
        XMLDoc.Load "R:\PTV\Mes Tests\Test_Macro\" & file
        ' ------------------------ Service ----------------------------
        xpath = "//Placemark"
        Dim xxpath As String: xxpath = "Point/coordinates"
     
        Dim nodeName As String
        Dim str_oSubNode As String
     
        Sheets("F2").Cells(1, 5) = "Coordonnées MAPS"
            ligne = 2
            colone = 5
     
        For Each oNode In XMLDoc.SelectNodes(xpath)
     
     
            For Each oSubNode In oNode.SelectNodes(xxpath)
            	str_oSubNode = oSubNode.nodeName
     
            	If str_oSubNode = "coordinates" Then
            		Debug.Print "match nodeName : " & oSubNode.nodeName
                		Sheets("F2").Cells(ligne, colone) = oSubNode.Text
                		ligne = ligne + 1
          		Else
     
           			Debug.Print ("--------")
                 		Sheets("F2").Cells(ligne, colone) = "-------"
                 		ligne = ligne + 1
     
       		End If
           Next
         Next
     
    Set XMLDoc = Nothing
    End Function

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 257
    Points
    34 257
    Par défaut
    Salut,

    ton code on l'a certes, mais comme on ne sait pas exactement quel donnees tu as en entree, et le cas echeant les sorties voulues, ca ne nous pousse pas vraiement a mettre le nez dans le code

    Dis nous en un peu plus sur ton objectif stp.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 38
    Points : 18
    Points
    18
    Par défaut
    Bonjour Jean-Philippe André,

    En effet je n'ai pas était très clair, je vais essayé de faire mieux ce coup-ci ! en tous les cas merci pour ta réponse !!
    En fait le fichier kml ne renvoi pas toujours les <Point><coordinates> et moi dans mon code je souhaiterai récupérer les valeur <coordinates> quand elles existent, les coller dans une cellule. Si en revanche elles ne sont pas présentent je doit sauter une ligne dans le fichier excel. Voilà j’espère que c'est plus clair pour vous !


    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    <?xml version='1.0' encoding='UTF-8'?>
    <kml xmlns='http://www.opengis.net/kml/2.2'>
    	<Document>
    		<name>Verre </name>
    		<description><![CDATA[]]></description>
    		<Folder>
    			<name>1x semaine Lundi.xlsx</name>
    			<Placemark>
    				<name>Lundi</name>
    				<description></description>
    				<styleUrl>#icon-959-62AF44</styleUrl>
    				<ExtendedData>
    					<Data name='Type Periode'>
    						<value>Hebdomadaire</value>
    					</Data>
    					<Data name='Valeur Periode'>
    						<value>1.0</value>
    					</Data>
    					<Data name='Code Client U'>
    						<value>00000</value>
    					</Data>
    					<Data name='Nom Client'>
    						<value>LYCEE HOTELIER</value>
    					</Data>
    					<Data name='Materiel'>
    						<value>500 L</value>
    					</Data>
    					<Data name='Lieu Exploitation'>
    						<value>LYCEE</value>
    					</Data>
    					<Data name='Adresse'>
    						<value>Adresse</value>
    					</Data>
    					<Data name='Code Postal'>
    						<value>00000</value>
    					</Data>
    					<Data name='Ville'>
    						<value>Ville</value>
    					</Data>
    					<Data name='Longitude WG284'>
    						<value>0.454559</value>
    					</Data>
    					<Data name='Latitute WG284'>
    						<value>45.821421</value>
    					</Data>
    					<Data name='Service'>
    						<value>964060.0</value>
    					</Data>
    					<Data name='Matiere'>
    						<value>VERRE</value>
    					</Data>
    					<Data name='Tournee Previsionnelle'>
    						<value>T-23- IPOVRAC</value>
    					</Data>
    					<Data name='Activite Tournee'>
    						<value>BOM DI</value>
    					</Data>
    				</ExtendedData>
    				<address>Adresse comp</address>
    			</Placemark>
    			<Placemark>
    				<name>Lundi</name>
    				<description><![]]></description>
    				<styleUrl>#icon-959-62AF44</styleUrl>
    				<ExtendedData>
    					<Data name='Type Periode'>
    						<value>Hebdomadaire</value>
    					</Data>
    					<Data name='Valeur Periode'>
    						<value>1.0</value>
    					</Data>
    					<Data name='Code Client U'>
    						<value>000000</value>
    					</Data>
    					<Data name='Nom Client'>
    						<value>NC</value>
    					</Data>
    					<Data name='Materiel'>
    						<value>750 L</value>
    					</Data>
    					<Data name='Lieu Exploitation'>
    						<value>LE</value>
    					</Data>
    					<Data name='Adresse'>
    						<value>Adre</value>
    					</Data>
    					<Data name='Code Postal'>
    						<value>CP</value>
    					</Data>
    					<Data name='Ville'>
    						<value>Ville</value>
    					</Data>
    					<Data name='Longitude WG284'>
    						<value>-0.564079</value>
    					</Data>
    					<Data name='Latitute WG284'>
    						<value>44.8913736</value>
    					</Data>
    					<Data name='Service'>
    						<value>NS</value>
    					</Data>
    					<Data name='Matiere'>
    						<value>VERRE</value>
    					</Data>
    					<Data name='Tournee'>
    						<value>T-23- IPOVRAC</value>
    					</Data>
    					<Data name='Activite Tournee'>
    						<value>BOM DI</value>
    					</Data>
    				</ExtendedData>
    				<Point>
    					<coordinates>-0.5641912,44.8907199,0.0						</coordinates>
    				</Point>
    			</Placemark>
    			<Placemark>
     
    	</Document>
    </kml>

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 257
    Points
    34 257
    Par défaut
    Le probleme que tu as est que tu ecrases a chaque iteration ta valeur dans la cellule F2, alors qu'une fois les coordonnees trouvees, tu dois sortir de là, avec un Goto, car tu es dans une double boucle

    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
    If str_oSubNode = "coordinates" Then
            		Debug.Print "match nodeName : " & oSubNode.nodeName
                		Sheets("F2").Cells(ligne, colone) = oSubNode.Text
                		ligne = ligne + 1
    GoTo Fin
          		Else
     
           			Debug.Print ("--------")
                 		Sheets("F2").Cells(ligne, colone) = "-------"
                 		ligne = ligne + 1
     
       		End If
     Next
         Next
     Fin:
    Set XMLDoc = Nothing
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 38
    Points : 18
    Points
    18
    Par défaut
    J'ai testé vite fait mais ça n'a pas l'air de fonctionner.
    Le truc c'est que j'avance d'une ligne à chaque itération donc je ne pense pas écraser les valeurs retournées. Le code écrit bien sur chaque ligne mais il n'en saute pas si <Point><coordinates> n'existe pas

  6. #6
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 257
    Points
    34 257
    Par défaut
    Rah, bourdeyl, mais quelle idee aussi d'appeller sa feuille comme le nom d'une cellule


    Bon alors, si on prenait le temps de voir si au moins tu parcours tous les noeuds ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For Each oNode In XMLDoc.SelectNodes(xpath) 
            For Each oSubNode In oNode.SelectNodes(xxpath)
            	Debug.Print oSubNode.nodeName
    Next
    Next
    ne parcourt que 2 niveaux de noeuds, sauf erreur.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 38
    Points : 18
    Points
    18
    Par défaut
    Ouais ! en effet mais le F1 était déjà pris par des voitures de sport
    Bon j'ai testé et le Debug me renvoi bien coordinates donc c'est bon non ?

  8. #8
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 257
    Points
    34 257
    Par défaut
    Donc tu me dis que ton code passe et lit bien coordinates, mais que ta boucle n'y passe pas ?
    C'est bien ca ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 38
    Points : 18
    Points
    18
    Par défaut
    Oui, la boucle passe je pense peut être que c'est justement le soucis. Je ne devrai pas boucler sachant qu'il n'y a qu'un seul nœud coordinates dans le Placemark. Mais je ne vois pas encore comment.

  10. #10
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 257
    Points
    34 257
    Par défaut
    Regarde la solution qu'on avait trouvee pour faire ce genre de choses :
    http://www.developpez.net/forums/d46...ees-xml-excel/
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

Discussions similaires

  1. Ajouter une condition dans mon XML
    Par GeoffreyMtl dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 29/01/2015, 06h31
  2. [XL-2010] en vba copier coller avec une condition dans des classeurs différents
    Par will83177 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/02/2014, 17h38
  3. [AC-2007] lancer une requete avec 2 parametres dans Access 2007 avec VBA
    Par dimis dans le forum VBA Access
    Réponses: 8
    Dernier message: 29/07/2009, 14h45
  4. requete sql avec une condition dans une zone de liste
    Par khilim1 dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/12/2008, 12h00
  5. Comment regrouper avec une condition dans une requête
    Par moilou2 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/07/2008, 10h39

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