Erreur lors du importation de fichier
Bonjour,
J'ai un problème que je ne sais comprendre pour le moment, peut-être allez vous m'aider.
J'ai créée un outil permettant d'aller copier/coller des valeurs dans plusieurs différents afin de les rassembler dans un fichier maitre. Pour cela j'ai donc plusieurs fichiers source avec mes données dans un tableau, je souhaite importer ces données dans mon fichiers maitre, l'importation doit se faire si les 5 conditions sont respectées (même nom d'UO, même nom de complexité, même nom de site, même mois, même année).
La macro fonctionne parfaitement avec 4 fichiers différents, cependant à partir de 5 fichiers différents, un message d'erreur apparait (Incompatibilité de type).
J'ai réalisé plusieurs tests pour trouver le problème, je sais donc maintenant que l'erreur apparait toujours à i = 7 et i2 = 11, je sais aussi que l'erreur provient lorsque les dates dans les différents fichiers sources sont trop éloignées.
Je pense que l'erreur vient d'une atteinte des limites lorsque les dates sont trop différentes. Petites précision, le tableau destination est assez conséquent (233 lignes sur 120 colonnes)
Peut-être que je pourrais régler ce problème en optimisant mes boucles.
Je reste à votre écoute pour différents conseil et vous remercie du temps prit pour m'aider.
Voici le code de ma macro:
Sub ImporterDonneeConsoUO()
Application.DisplayAlerts = False
Dim dlgSelFic As FileDialog
Dim acFiles() As String
Dim nIF As Integer
Dim nIFSup As Integer
Dim wbSource As Workbook ' Classeur source
Dim wsSource As Worksheet ' Feuille source
Dim wbDestination As Workbook ' Classeur de destination
Dim wsDestination As Worksheet ' Feuille de destination
' Sélection des fichiers à importer
Set dlgSelFic = Application.FileDialog(msoFileDialogFilePicker)
With dlgSelFic
.Title = "Sélectionner les fichiers à importer ..."
.AllowMultiSelect = True
If .Show = False Then Exit Sub ' si aucune sélection => sortie
nIFSup = .SelectedItems.Count
ReDim acFiles(1 To .SelectedItems.Count) As String
For nIF = 1 To nIFSup
acFiles(nIF) = .SelectedItems(nIF)
Next
End With
Application.ScreenUpdating = False
'Déclarer le fichier destination
Set wbDestination = ThisWorkbook
Set wsDestination = wbDestination.Sheets("Consommation global des UO") ' Remplacez par le nom de la feuille de destination
wsDestination.range("E4:BO235").ClearContents
For nIF = 1 To nIFSup
' Déclarer le fichier source
Set wbSource = Workbooks.Open(Filename:=acFiles(nIF), ReadOnly:=True, addtomru:=False)
Set wsSource = wbSource.Sheets("Suivi_conso_UO_par_mois_enUO")
'Compter le nombre de ligne
mylastrow1 = wsDestination.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
mylastrow2 = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
mylastcolum1 = wsDestination.Cells(1, Columns.Count).End(xlToLeft).Column
mylastcolum2 = wsSource.Cells(1, Columns.Count).End(xlToLeft).Column
'Importer les valeurs
For y2 = 5 To mylastcolum2 + 1 'fichier source
For y = 5 To mylastcolum1 'fichier destination
If wsSource.Cells(3, y2) = "R" And Month(wsDestination.Cells(3, y)) = Month(wsSource.Cells(1, y2)) And Year(wsDestination.Cells(3, y)) = Year(wsSource.Cells(1, y2)) Then
For i2 = 4 To mylastrow2 'fichier source
For i = 4 To mylastrow1 'fichier destination
If wsDestination.Cells(i, "A").Value = wsSource.Cells(i2, "A").Value And wsDestination.Cells(i, "B").Value = wsSource.Cells(i2, "B").Value _
And wsDestination.Cells(i, "C").Value = wsSource.Cells(i2, "C").Value Then
wsDestination.Cells(i, y).Value = wsDestination.Cells(i, y).Value + wsSource.Cells(i2, y2).Value
End If
Next
Next
End If
Next
Next
wbSource.Close False
Next
mylastrow3 = wsDestination.Cells(Rows.Count, 1).End(xlUp).Row
For i = 4 To mylastrow3
wsDestination.Cells(i, "BP") = wsDestination.Cells(i, "A") & "-" & wsDestination.Cells(i, "B") & "-" & wsDestination.Cells(i, "C")
Next
' Libérer les variables
Set wsSource = Nothing
Set wbSource = Nothing
Set wbDestination = Nothing
Set wsDestination = Nothing
Application.ScreenUpdating = True
End SubBonjour Ruben,
Quelle est la ligne surlignée en jaune quand vous cliquez sur débogage SVP
A+
Bonjour Ruben,
Pourquoi la boucle
For y2 = 5 To mylastcolum2 + 1 'fichier source
va-t-elle au-delà de la dernière colonne renseignée du fichier source ?
Avec des fichiers (anonymisés) exemples ce serait aussi plus facile pour répondre
Cdlt,
Cylfo
Cylfo, la ligne surlignée est l'action après avoir respecter les conditions: " wsDestination.Cells(i, y).Value = wsDestination.Cells(i, y).Value + wsSource.Cells(i2, y2).Value"
Pour le mylastcolumn, je me souviens plus pourquoi je vais une colonne plus loin :(
J'essaye de préparer un fichier test pour simplifier la compréhension. Merci de ta réponse
Bonjour à tous,
Concernant votre problème, est-ce que vous êtes sûr que toutes les cellules avec des dates sont remplies correctement et qu'elles sont toutes au format de date? Si l'une d'elles est vide ou dans un format différent, cela pourrait provoquer une telle erreur.
wsDestination.Cells(i, y).Value = wsDestination.Cells(i, y).Value + wsSource.Cells(i2, y2).ValueCi-dessus
Un moyen de déboguer cela est d'ajouter des instructions d'impression avant cette ligne pour voir exactement quelles valeurs provoquent l'erreur. Par exemple :
Debug.Print "i = " & i
Debug.Print "y = " & y
Debug.Print "wsDestination.Cells(i, y).Value = " & wsDestination.Cells(i, y).Value
Debug.Print "i2 = " & i2
Debug.Print "y2 = " & y2
Debug.Print "wsSource.Cells(i2, y2).Value = " & wsSource.Cells(i2, y2).ValueHésitez pas également de vérifier les formats des cellules des fichiers sources et de destination, et de vous assurer qu'ils sont cohérents.
(Hésitez pas aussi à envoyer un fichier)
Bonjour Ruben
Moi, Je déclarerais toutes les variables en utilisant l'instruction "Option Explicit"
Je testerai aussi que le nombre de lignes est bien supérieure à l'index de ligne de démarrage dans les boucles for i = 4 to ...
Abderrahmane BENALI,
Merci pour ta réponse, oui les valeurs additionnées sont toutes les deux des nombres, de plus le format date doit convenir car la macro fonction pour un seul fichier sans problème. Comme précisé dans mon message je connais déjà les valeurs de i et i2 lorsque l'erreur survient, les autres valeurs sont changeante en fonction des essais.
Scraper,
A quoi sert la fonction "Option explicit" ?
Re,
Comme déjà demandé, qu'elle est la ligne surlignée en jaune quand le bug se produit ?
Avez vous mis votre curseur de souris sur chaque variable à ce moment là ?
A+
BrunoM45,
La ligné où apparait l'erreur est: " wsDestination.Cells(i, y).Value = wsDestination.Cells(i, y).Value + wsSource.Cells(i2, y2).Value"
En effet j'ai mit mon curseur sur chaque variable pour évaluer à quelle ligne de mon tableau l'erreur se produit.
Je joins a ce message les deux fichiers exemple avec la macro dedans.
Je rajoute des fichiers avec les dates changées, ainsi que quelques valeurs pour pouvoir tester l'importation avec plusieurs fichiers.
Re,
Merci pour les fichiers, mais pas d'erreur chez moi avec le fichier source
A+
BrunosM45,
Moi non plus et la est tout le problème ahah. Avec les fichiers exemple, qui sont beaucoup moins volumineux, macro fonctionne parfaitement même avec 10 fichiers à importer. Et lorsque que je le fais dans mon vrai fichier avec des quantités de données plus grande, la macro plante.
Je pense donc que ces un problème de quantité de données mais je ne sais pas comment le résoudre.
Re,
Perso je passerais par des variables pour les additions
Val1 = wsDestination.Cells(i, y).Value
Val2 = wsSource.Cells(i2, y2).Value
wsDestination.Cells(i, y).Value = Val1 + Val2Comme ça, cela limite le code à vérifier et permet de mieux déterminer ou se trouve l'erreur
A+
Re,
Je n'ai pas d'erreur non plus même en modifiant les fichiers sources quand à un problème de quantité compte tenu des volumétries que tu indiques, je n'y crois pas. Il est beaucoup plus probable que cela provienne du contenu du fichier et si au moment du plantage la ligne surlignée en jaune est celle que tu indiques c'est que tu additionnes des données dont au moins une n'est pas numérique.
Au moment du plantage, cliques sur "Débogage" puis dans l'éditeur VB :
- Si elle n'est pas présente affiche la fenêtre "Exécution"
- Dans cette fenêtre, tapes
? wsDestination.Cells(i, y).Valueet valides, tu obtiens quel résultat ? - Puis tapes
? IsNumeric(wsDestination.Cells(i, y).Value)et valides, tu obtiens True ou False ? - Refais les mêmes tests avec wsSource.Cells(i2, y2).Value
- Si les 2 sont numériques je serai très surpris.
- Les fichiers sources et destination sont consultables pendant la suspension de la macro, tu peux aussi voir ce qu'il y a dans les cellules des 2 fichiers.
Cdlt
Cylfo
Merci à tous pour vos remarques, j'ai enfin réussi a identifier le problème. Cela venait bien de plusieurs cellules considérées comme non numériques. Etonnamment le problème ne survient pas avec un seul fichier. Je vais donc rendre plus robuste mes autres macro afin de pas permettre d'avoir une cellule en string.
Bonne fin de journée