Erreur 28 : Espace pile insuffisant [Résolu]

Messages postés
8
Date d'inscription
mercredi 25 février 2015
Dernière intervention
26 février 2015
- 25 févr. 2015 à 02:10 - Dernière réponse :
Messages postés
8
Date d'inscription
mercredi 25 février 2015
Dernière intervention
26 février 2015
- 26 févr. 2015 à 01:23
Bonjour,

voilà, j'ai une fonction récursive pour parser un xml reçu de mon ERP (donc industriel et je n'ai pas le choix pour limiter le volume de données à traiter)
tout content je l'exécute sur un fichier comportant environ 9 000 lignes * 80 colonnes. et vlan erreur 28... :/ aux alentours des 3000 lignes
après quelques recherches je ne trouve pas de réponse satisfaisante. j'aurais donc voulu savoir ou ma fonction cloche et/ou si je dois complétement revoir ma fonction... elle fonctionne parfaitement sur un petit volume de données et je crois ne fait pas d'appel superflu (enfin il me semble ^^) par avance merci pour la réponse et ci-dessous mon code
ps:j'ai sorti mes définitions de variables (iCell et même k) histoire de

------------------------------------------------------
Private Sub SetLigne(root_node As IXMLDOMNode)
 
        If (Not root_node Is Nothing) Then
            If root_node.nodeName = "enregistrement" Then
                For k = 0 To root_node.ChildNodes.Length - 1
                    If root_node.ChildNodes.Item(k).NodeType <> 3 Then
                        Sheets("Feuil1").Cells(iCell, k + 1) = root_node.ChildNodes.Item(k).Text
                    End If
                Next k
                iCell = iCell + 1
                If Not root_node.NextSibling Is Nothing Then
                    Call SetLigne(root_node.NextSibling)
                End If
            Else
                If root_node.HasChildNodes Then
                    Call SetLigne(root_node.FirstChild)
                End If
                If Not root_node.NextSibling Is Nothing Then
                    Call SetLigne(root_node.NextSibling)
                End If
            End If
        End If
End Sub


EDIT: Ajout de la coloration syntaxique.
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- Modifié par ucfoutu le 25/02/2015 à 10:46
1
Merci
Simplement parce que le xml comporte d'autres balises (de mises en forme ou autre) je ne veux parser que ceraines balises.

Perso, je "chargerais" alors l'ensemble, PUIS me "débarrasserais" du "superflu", ainsi ===>> (exemple) ===>>

With Workbooks.OpenXML("D:\toto.xml").ActiveSheet
titi = .UsedRange
.UsedRange.EntireRow.Delete
.Range(.Cells(1, 1), .Cells(UBound(titi, 1), UBound(titi, 2))) = titi
End With


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend

Merci ucfoutu 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Messages postés
8
Date d'inscription
mercredi 25 février 2015
Dernière intervention
26 février 2015
- 25 févr. 2015 à 20:21
Je vais faire des essais en parsant un peu différemment et avec ta méthode et je posterai le résultat. j'ai aussi un impératif de temps de traitement...
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 25 févr. 2015 à 07:44
0
Merci
Bonjour,
Je ne comprends pas vraiment pour quelle raison tu procèdes ainsi.
Ceci (exemple) :
Workbooks.OpenXML "c:\toto.xml"

Fonctionne sans problème chez moi.
Rien n 'interdit ensuite, si ainsi voulu, de sauvegarder le résultat en format Excel.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
8
Date d'inscription
mercredi 25 février 2015
Dernière intervention
26 février 2015
- 25 févr. 2015 à 09:11
Bonjour
Simplement parce que le xml comporte d'autres balises (de mises en forme ou autre) je ne veux parser que ceraines balises.
Commenter la réponse de ucfoutu
Messages postés
12246
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 25 févr. 2015 à 09:31
0
Merci
Bonjour,

je fais très peu de VBA et n'ai jamais fais de xml avec.
Mais le principe de la fonction récursive est gourmand en ressources.
Il est important de libérer les variables pour justement ne pas saturer la pile. Et VB n'est pas le langage le plus efficace de ce coté là.

Peux tu poster un exemple de ton fichier? (sans données confidentielles bien sûr)
As tu regarder s'il ne serait pas judicieux d'utiliser des Regex?
Messages postés
8
Date d'inscription
mercredi 25 février 2015
Dernière intervention
26 février 2015
- 25 févr. 2015 à 20:14
voici un exemple un peu trafiqué mais dont la structure est conforme à ce que je dois parser.. quand à Regex je ne maitrise pas du tout :/ je vais y jeter un oeil. par contre je ne vois pas trop ce que je peux libérer comme variables ..

<document>
<description>
<webuser><![CDATA[xxx]]></webuser>
<code_lang><![CDATA[000]]></code_lang>
</description>
<styles>
<style nom="VA_TOOLTIP"> color: #5F7890; background-color: #FFFFFF;</style>
</styles>
<schema>
<champ nom="col0" lib="Saison" tooltip="Saison article" type="VARCHAR" nature="C" align="left" />
<champ nom="col1" lib="Article" tooltip="Article" type="VARCHAR" nature="C" align="left" />
<champ nom="col2" lib="Image article" tooltip="Image article" type="IMAGE" nature="I" align="left" />
</schema>
<data>
<enregistrement>
<col0><![CDATA[B2E]]></col0>
<col1><![CDATA[VAB001]]></col1>
<col2><![CDATA001.bmp]></col2>
</enregistrement>
</data>
<!-- 0 seconde(s), 3 colonne(s), enregistrement(s) -->
</document>
<!-- 0 seconde(s) -->
Messages postés
8
Date d'inscription
mercredi 25 février 2015
Dernière intervention
26 février 2015
- 25 févr. 2015 à 21:52
merci à toi.. je vais utiliser la solution magique d'ucfoutu
Commenter la réponse de Whismeril
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- Modifié par ucfoutu le 25/02/2015 à 21:11
0
Merci
j'ai aussi un impératif de temps de traitement...

je suis prêt à parier que cela ira plus vite que tes itérations récursives, de surcroît assorties de boucles.
La raison est simple : ce qui a été écrit par l'équipe Microsoft Office l'a été à un niveau plus "bas" que celui d'un langage évolué.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
8
Date d'inscription
mercredi 25 février 2015
Dernière intervention
26 février 2015
- 25 févr. 2015 à 21:17
fort possible :) je vais tester et poster les résultats
Messages postés
8
Date d'inscription
mercredi 25 février 2015
Dernière intervention
26 février 2015
- 25 févr. 2015 à 21:50
Alors...

1 - fonction faite avec MES doigts... 5min 35s
2 - fonction faite avec TES doigts ... 17 secondes o.O

conclusion je ne prendrai jamais de pari contre toi xD

ça met juste les colonnes dans l'ordre d'excel mais pas dans l'ordre des noeuds .. genre col1 ; col10;col11;col2;col21... si tu sais comment faire pour les mettre en 1,2,3,4...,10,11 ce serait magique, sinon je vais gratter

Je ne connaissais pas UsedRanged

en tout cas un grand merci

et pour citer je ne sais plus qui : ce que je sais c'est que je ne sais pas
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
>
Messages postés
8
Date d'inscription
mercredi 25 février 2015
Dernière intervention
26 février 2015
- 25 févr. 2015 à 22:15
a met juste les colonnes dans l'ordre d'excel mais pas dans l'ordre des noeuds .. genre col1 ; col10;col11;col2;col21... si tu sais comment faire pour les mettre en 1,2,3,4...,10,11 ce serait magique, sinon je vais gratter

Je' ne suis pas vraiment certain de "voir" ce que tu veux dire.
A tout hasard (pour le cas où j'aurais "deviné") ===>>
Regarde la vocation de WorksheetFunction.Transpose, méthode (dans ton aide VBA)
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 25 févr. 2015 à 23:25
0
Merci
un dernier point, avant d'aller dormir :
Tu feras une autre économie (assez importante) de temps en inhibant l'affichage pendant ton traitement ===>>
Application.ScreenUpdating = false
...
... ton traitement

...
Application.ScreenUpdating = true
Messages postés
8
Date d'inscription
mercredi 25 février 2015
Dernière intervention
26 février 2015
- 26 févr. 2015 à 01:23
oui .. ça je le fait systématiquement mais merci et ce que je voulais dire sur l'ordre des colonnes il faut juste que je redispose mes colonnes car elles ne sont pas dans l'ordre de l'export mais c'est top quand même

Encore merci je met le sujet en résolu
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.