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

Macros et VBA Excel Discussion :

VBA Excel - Lecture csv erronée sur un seul fichier [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Par défaut VBA Excel - Lecture csv erronée sur un seul fichier
    Bonjour,

    J'ai rencontré un problème plutôt très curieux hier et je suis incapable de l'expliquer et encore moins de le corriger.
    Pour le détail, je fais un extract des informations de sauvegarde sur un site, vers un fichier .csv.
    J'utilise ensuite un fichier Excel avec une macro maison. Cette macro sélectionne le fichier .csv, récupère les lignes de cet extract, les copie dans une feuille de mon Excel et traite les données ensuite.
    Jusque-là, rien de fou. Voici le code utilisé pour la sélection du fichier .csv et la copie des données vers mon fichier Excel :

    Private Sub Bt_Import_Click()
    Dim strFichier As String
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
    .Filters.Clear
    .Filters.Add "Fichiers CSV", "*.csv", 1
    .Title = "Choisissez un fichier à importer"
    .AllowMultiSelect = False
    .InitialFileName = "https://xxxx.sharepoint.com/Documents partages/Technique/CLIENTS/xxxx/Reports backup/Extracts/"
    If .Show = True Then
    strFichier = .SelectedItems(1)
    End If
    End With
    If strFichier = "" Then Exit Sub
    Set xlBook = xlApp.Workbooks.Open(strFichier)
    Set xlSheet = xlBook.Sheets(1)
    lig = 6
    While xlSheet.Range("A" & lig).Value <> ""
    Range("A" & lig - 5 & ":N" & lig - 5).Value = xlSheet.Range("A" & lig & ":N" & lig).Value
    lig = lig + 1
    Wend
    reponse = MsgBox("Ligne atteinte : " & lig, vbInformation, "Test")
    xlBook.Close
    xlApp.Quit
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    [...]

    Voici le fichier .csv qui se nomme Extract_20230629.csv contenant 4276 lignes :

    Nom : Extract csv.jpg
Affichages : 185
Taille : 1,17 Mo

    Quand je lance ma macro en l'état, voici le résultat obtenu :

    Nom : Macro résultat incorrect.jpg
Affichages : 176
Taille : 881,4 Ko

    Comme on peut le voir, la première cellule A1 n'est pas la valeur de la cellule A6 prévue dans le fichier .csv.
    On voit aussi qu'à la fin de la macro, un msgbox m'indique la dernière ligne atteinte dans le .csv -> ligne 1083 au lieu des 4276 ligne du fichier.
    Dernière chose illogique est le nombre de colonnes copiées; de A à K alors qu'il y a des valeur jusqu'à la colonne N en théorie.

    Là déjà, j'ai du mal à comprendre. Parce que j'utilise ce type d'extract et cette macro depuis des mois sans problème manifeste.
    Mais c'est à partir de maintenant que vous allez voir la folie de mon problème!!!

    J'ai testé une multitude de possibilités. Pour aller au plus simple :
    - Si je renomme le fichier .csv en le laissant dans le même dossier (emplacement), la macro fonctionne impeccablement.
    - Si je déplace le fichier .csv dans un autre dossier en conservant son nom à l'identique, la macro fonctionne impeccablement.

    Voici le résultat (attendu et fonctionnel) :

    Nom : Macro résultat OK.jpg
Affichages : 184
Taille : 764,7 Ko

    La première cellule A1 contient bien la première ligne A6 du fichier .csv.
    La ligne atteinte en fin de lecture est bien 4277 dans le fichier .csv.
    Les 14 premières colonnes sont bien renseignées à la copie (colonne N vide dans la plupart des cas, c'est normal).

    Et manifestement, je n'ai ce problème qu'avec le fichier en date du 29 juin 2023. Tous les autres fonctionnent.

    Je suis extrêmement curieux de comprendre la raison de cette erreur.
    Merci pour vos lumières.
    Myg

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Vous n'indiquez pas la version de votre application Excel.
    L'utilisation de Power Query serait plus intéressante pour charger vos fichiers csv.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Par défaut
    C'est du Excel Office 365.
    Je l'avais indiqué à la création du message, dans les paramètres de la publication mais en effet ce n'est pas affiché autrement.

    Je vais regarder ce Power Query, ne serait-ce pour ma culture et amélioration des process.

    Cependant, sur le fond, mon code ne semble pas présenter d'erreur majeure et pourtant je n'explique pas ce phénomène d'incohérence sur un fichier précis (et qui fonctionne néanmoins si je le renomme ou déplace).
    Merci de m'éclairer sur ce point si possible.

    Amicalement.
    Myg

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Par défaut
    Effectivement, le traitement de requête Power Query est plus simple et permet de mieux traiter mes fichiers .csv.
    Et en l'occurrence, je n'ai pas de problème avec mon fameux fichier extract du 29/06.

    Il y a néanmoins des changements dans le traitement des données mais je peux m'en accommoder.

    Mais je reste dans l'attente d'une explication sur mon problème d'origine.

    Amicalement.
    Myg

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En examinant de plus près votre code, je vois quelque chose qui m'intrigue dans les lignes ci-dessous.
    Vous précisez la feuille "source" (xlSheet) mais pas la feuille "cible". C'est extrêmement dangereux car l'écriture se fait dans la feuille active. Ce n'est évidemment pas la réponse à votre problème mais il est important que vous le sachiez.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ig = 6
    While xlSheet.Range("A" & lig).Value <> ""
    Range("A" & lig - 5 & ":N" & lig - 5).Value = xlSheet.Range("A" & lig & ":N" & lig).Value
    lig = lig + 1
    Wend
    De plus dans le code que vous avez publié, vous utilisez des variables objets (xlApp, xlBook, xlSheet ) dont on ne voit pas la déclaration, sans doute sont-elles de portabilité "publique" ou "module" ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 547
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 547
    Par défaut
    Si le script est dans Excel, pour moi pas besoin de xlApp, l'application étant déjà Excel
    Workbooks.open a un paramètre optionnel Delimiter que tu pourrais utiliser, pour séparer dès l'ouverture tes colonnes (tu verrais ainsi si tu as tes N colonnes)

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    En examinant de plus près votre code, je vois quelque chose qui m'intrigue dans les lignes ci-dessous.
    Vous précisez la feuille "source" (xlSheet) mais pas la feuille "cible". C'est extrêmement dangereux car l'écriture se fait dans la feuille active. Ce n'est évidemment pas la réponse à votre problème mais il est important que vous le sachiez.
    Oui la destination est bien la feuille active, d'où le fait de ne pas mentionner le nom de la feuille. Ce n'est pas ultra propre j'en conviens, c'est plutôt une méthode perso pour identifier que je parle de la feuille active.

    [QUOTE=Philippe Tulliez;11956807]De plus dans le code que vous avez publié, vous utilisez des variables objets (xlApp, xlBook, xlSheet ) dont on ne voit pas la déclaration, sans doute sont-elles de portabilité "publique" ou "module" ?

    En effet, la déclaration des variable est hors de ce code. Mais je fais toujours mes déclarations de variables proprement qu'elles soient dans un module ou non.

    J'ai eu un autre problème avec la gestion par Power Query. Du fait de stocker mes fichier sur un Sharepoint, la connexion établie dans le fichier a tendance à sauter et indique une erreur au lancement du fichier. De ce fait, un message indique qu'une correction peut être faite ou non.
    En lisant correctement, on peut garder la connexion etc... Mais en cliquant rapidement sans trop lire comme c'est souvent le cas, on peut facilement perdre la connexion et dans ce cas, le code pour traiter l'extract ne fonctionne plus du tout.
    Ce cas arrive forcément du fait que le fichier est utilisable par d'autres personne que moi.

    Bref, du coup la solution Power Query ne me satisfait pas entièrement de part le support des fichiers Excel et .csv.
    J'ai tenté de gérer une erreur et ouvrir le fichier si la conenxion est perdue mais ça ne réparera pas la connexion de toute façon.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA-Excel] Ajuster l'impression sur une page
    Par Korleone dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/04/2018, 07h58
  2. [vba-excel]Comment modifier donnée sur partie filtrée d'un tableau
    Par boniface dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/01/2007, 19h27
  3. [VBA Excel]Envoie de données sur port serie
    Par Farbin dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/08/2006, 08h05
  4. [VBA Excel] ouverture CSV (séparateur , ou ;)
    Par SDE10 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/07/2006, 19h32
  5. Excel : consolidation de données sur une seule feuille
    Par aquamusic dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/01/2006, 18h32

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