ExportToXML
Bonjour
J'ai un fichier excel 97 avec la macro ExportToXML qui fonctionne très bien sous excel97 pour créer un html à partir du fichier excel et du xsl. Mon problème : ce fichier, gardé au format 97 est ouvert désormais sous excel 2010 et la macro ne fonctionne plus, sans me faire de message d'erreur. Le pas à pas détaillé montre que la boucle sur Icols (d'abord pour récupérer les titres de mes colonnes) n'est pas exécutée. Icols vaut 256, IRows 65536 ; le fichier xml est ouvert par
Open FullPath For Output As #iFileNum.
Merci pour votre aide
Ci-dessous le code
Public Function ExportToXML(FullPath As String, RowName As String) As Boolean
On Error GoTo ErrorHandler
Dim colIndex As Integer
Dim rwIndex As Integer
Dim asCols() As String
Dim oWorkSheet As Worksheet
Dim sName As String
Dim lCols As Long, lRows As Long
Dim iFileNum As Integer
Dim i As Integer
Set oWorkSheet = ThisWorkbook.Worksheets(1)
sName = oWorkSheet.Name
lCols = oWorkSheet.Columns.Count
lRows = oWorkSheet.Rows.Count
ReDim asCols(lCols) As String
iFileNum = FreeFile
Open FullPath For Output As #iFileNum
For i = 0 To lCols - 1
'Assumes no blank column names
If Trim(Cells(1, i + 1).Value) = "" Then Exit For
asCols(i) = Cells(1, i + 1).Value
Next i
If i = 0 Then GoTo ErrorHandler
lCols = i
Print #iFileNum, "<?xml version=""1.0"" encoding=""ISO-8859-1""?>"
Print #iFileNum, "<?xml:stylesheet type=""text/xsl"" href= ""mis_form_index.xsl""?>"
Print #iFileNum, "<" & sName & ">"
For i = 2 To lRows
If Trim(Cells(i, 1).Value) = "" Then Exit For
Print #iFileNum, "<" & RowName & ">"
For j = 1 To lCols
If Trim(Cells(i, j).Value) <> "" Then
Print #iFileNum, " <" & asCols(j - 1) & "><![CDATA[";
Print #iFileNum, Trim(Cells(i, j).Value);
Print #iFileNum, "]]></" & asCols(j - 1) & ">"
DoEvents 'OPTIONAL
End If
Next j
Print #iFileNum, " </" & RowName & ">"
Next i
Print #iFileNum, "</" & sName & ">"
ExportToXML = True
ErrorHandler:
If iFileNum > 0 Then Close #iFileNum
Exit Function
End FunctionBonjour zadig95,
Pas sûr de pouvoir t'aider mais peux-tu déjà essayer d'exécuter ton code en mettant en commentaire la ligne
On Error GoTo ErrorHandlerCeci permettra de voir quelle erreur est retournée.
Peux-tu également dire ce que valent les variables FullPath et RowName lorsque tu exécutes la macro ?
Bonjour
FullPath et RowName contiennent respectivement le nom du fichier excel et le nom de l'onglet.
L'erreur retournée : ne trouve pas le fichier xml qui existe bien.
En fait, après essais sur différents PC, il s'avère que ça fonctionne en 2007 et 2010 sur XP mais pas sur Windows 7 (32 et 64 bits)
Pour info, j'ai finalement réalisé deux modifications et ça marche :
[*]le nom du fichier est passé en dur : D:/Documents/SHIPS/index au lieu de ..\SHIPS\index
[*]j'ai déclaré un pointeur i en long suite à un message d'erreur à l'exécution de la macro (là aussi, sans doute lié au passage sous W7 64 bits)
Tu as probablement dû obtenir une erreur de dépassement de capacité, qui n'est pas dû à ta configuration.zadig95 a écrit :[*]j'ai déclaré un pointeur i en long suite à un message d'erreur à l'exécution de la macro (là aussi, sans doute lié au passage sous W7 64 bits)
En effet, un integer ne peut prendre que des valeurs allant de -32 768 à 32 767.
Bonjour
Peux-tu m'en dire plus sur cette " erreur de dépassement de capacité" ? A quoi est-ce du ? et comment l'éviter ?
Merci
Bonjour zadig95,
Voici ce que dit l'aide VBA :
Dépassement de capacité (erreur 6)
Particularités
Un dépassement de capacité se produit lorsque vous tentez d'effectuer une affectation dépassant les limites de la cible de l'affectation. Causes et solutions de cette erreur :
. Le résultat d'une affectation, d'un calcul ou d'une conversion de type de données est trop grand pour être représenté dans la plage de valeurs autorisée pour ce type de variable.
Affectez la valeur à un type de variable pouvant contenir une plage de valeurs plus grande.
. Une affectation à une propriété dépasse la valeur maximum de la propriété.
Vérifiez que votre affectation se situe à l'intérieur de la plage de la propriété cible.
. Vous tentez d'utiliser dans un calcul un nombre converti dans un entier, mais le résultat est plus grand qu'un entier. Exemple :
Dim x As Long
x = 2 000 * 365 ' Erreur : Dépassement de capacité
Afin de contourner le problème, saisissez le nombre comme suit :
Dim x As Long
x = CLng(2 000) * 365
Pour plus d'informations, sélectionnez l'élément en question et appuyez sur F1 (sous Windows) ou AIDE (sur Macintosh).
Exécute cette macro :
Sub test()
Dim i As Integer
i = 40000
End SubTu obtiendras une erreur de dépassement de capacité car la valeur max d'un Integer est 32 767.
Tu peux corriger cela en déclarant ta variable i en Long (max : 2 147 483 647), ou en essayant de ne pas dépasser cette valeur max.