Erreur 28 : Espace pile insuffisant

Résolu
JackUmul Messages postés 8 Date d'inscription mercredi 25 février 2015 Statut Membre Dernière intervention 26 février 2015 - Modifié par Whismeril le 25/02/2015 à 08:27
JackUmul Messages postés 8 Date d'inscription mercredi 25 février 2015 Statut Membre 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.

5 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 25/02/2015 à 10:46
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
1
JackUmul Messages postés 8 Date d'inscription mercredi 25 février 2015 Statut Membre 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...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 févr. 2015 à 07:44
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
0
JackUmul Messages postés 8 Date d'inscription mercredi 25 février 2015 Statut Membre 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.
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
25 févr. 2015 à 09:31
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?
0
JackUmul Messages postés 8 Date d'inscription mercredi 25 février 2015 Statut Membre 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) -->
0
JackUmul Messages postés 8 Date d'inscription mercredi 25 février 2015 Statut Membre Dernière intervention 26 février 2015
25 févr. 2015 à 21:52
merci à toi.. je vais utiliser la solution magique d'ucfoutu
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 25/02/2015 à 21:11
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
0
JackUmul Messages postés 8 Date d'inscription mercredi 25 février 2015 Statut Membre Dernière intervention 26 février 2015
25 févr. 2015 à 21:17
fort possible :) je vais tester et poster les résultats
0
JackUmul Messages postés 8 Date d'inscription mercredi 25 février 2015 Statut Membre 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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > JackUmul Messages postés 8 Date d'inscription mercredi 25 février 2015 Statut Membre 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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 févr. 2015 à 23:25
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
0
JackUmul Messages postés 8 Date d'inscription mercredi 25 février 2015 Statut Membre 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
0
Rejoignez-nous