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 :

Problème Ouverture Classeur et copie de son contenu


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Octobre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Octobre 2017
    Messages : 3
    Par défaut Problème Ouverture Classeur et copie de son contenu
    Bonjour à tous !

    Essayant depuis hier d'automatiser le transfert de données d'un classeur vers un autre (le premier est généré automatiquement par un logiciel de mesure, le second a un format bien défini qui permet une fois envoyé à un système de cartographie de rajouter les informations du tableau sur la carte).
    Le bouton qui active la macro en question est situé dans le second classeur sur la page "TraitementJournalier" qui une fois activé demande à l'utilisateur de saisir la première ligne qu'il souhaite remplir (les données étant classé par date, on les ajoute à la suite ligne par ligne, chaque ligne correspondant à une date), et ensuite de sélectionner le classeur d'où il souhaite récupérer les données , qui seront donc en théorie ajouté à la suite des précédentes (ou écrasées si l'utilisateur a choisi de remplir en premier une ligne déjà remplie). Le classeur contenant d'office les données collectées dispose du même modèle à chaque fois.

    J'ai remarqué que si je choisi un fichier Excel n'ayant jamais été ouvert au moment ou on me le demande, alors il va s'ouvrir comme prévu par mon code, mais à la fin du traitement les données n'ont pas été envoyées du tout dans le tableur "cible".

    En revanche, si je relance la macro en ayant déjà le tableur "source" ouvert, alors cela va marcher sans soucis. De la même façon, si j'enregistre le tableau "cible", sans ne rien modifier, pas même le nom, que je le ferme, et que je relance la macro alors il se rouvrira comme avant mais cette fois-ci la copie des données aura été effectuée.

    Je pense avoir identifié que le problème est que quand je lance une première fois le programme, il met trop de temps à charger les données du tableur "source" et donc se contente de transférer des cases vides avant de finir l'ouverture du tableur source. En revanche, si il est ouvert ou l'a déjà été, l'ouverture est instantanée et la copie des données l'est également.

    Pour solutionner ça j'ai essayé deux approches :

    - Insérer une temporisation : cela n'a pas marché et le tableur "source" restait en chargement tout le long de ma temporisation

    - Une technique "désespoir" ou je faisais directement en VBA :
    • Ouvrir le tableur source
    • Sauvegarder le tableur source
    • Fermer le tableur source
    • Rouvrir le tableur source


    Tout ça dans le but de reproduire ce qui pour l'heure fonctionne (mais est bien trop vilain pour être optimal) à savoir lancer le tableur cible, lancer une première fois la macro, constater que la feuille source s'ouvre bien mais que les données n'ont pas été recopiées dans la feuille cible, sauvegarder le tableur source sans l'avoir modifié et relancer la macro une seconde fois, pour ce coup ci avoir tout au bon endroit.

    Néanmoins là non-plus ça ne marche pas...

    Je vous ai déjà laissé un bon pavé donc j'évite peut-être de mettre directement un gros bloc de code un peu indigeste, si vous avez déjà été confrontés à ce problème peut-être en connaitrez-vous d'office la raison. Par ailleurs si vous souhaitez voir une partie de mon code qui vous fait douter je vous la transmettrai sans problèmes !

    Merci à tous pour votre aide !

    Pierre

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par youngpedro09 Voir le message
    demande à l'utilisateur de saisir la première ligne qu'il souhaite remplir
    Ne serait-il pas plus simple et plus précis de demander à l'utilisateur de sélectionner une cellule de la ligne en question AVANT de lancer la macro et d'obtenir ainsi l'information souhaitée dans le code par un simple Selection.Row ?

    Je vous ai déjà laissé un bon pavé donc j'évite peut-être de mettre directement un gros bloc de code un peu indigeste
    Mais sans connaitre le code qui accède à tes données sources, difficile de savoir pourquoi il n'y accède pas quand le fichier n'est pas déjà ouvert.

  3. #3
    Candidat au Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Octobre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Octobre 2017
    Messages : 3
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Ne serait-il pas plus simple et plus précis de demander à l'utilisateur de sélectionner une cellule de la ligne en question AVANT de lancer la macro et d'obtenir ainsi l'information souhaitée dans le code par un simple Selection.Row ?
    Alors ce serait sans-doute plus simple, mais de toute façon à terme je pensais demander à l'utilisateur de saisir la date de la première mesure qu'il souhaite rajouter, mais le champs date étant un peu plus délicat à traiter (notamment la recherche dans la table de la ligne correspondant à la date que la personne aurait saisie) j'en avais pas fait ma priorité donc j'avais quand même mis comme ça pour avoir déja un InputBox. C'était peut-être bête, en tous cas je me suis pas dit que le problème pouvait venir de là.

    difficile de savoir pourquoi il n'y accède pas quand le fichier n'est pas déjà ouvert.
    Je me doutais de cette réponse, donc je te mets le code à coté (j'avais aussi un peu honte je ne suis pas très bon en dev... et novice en VBA) par contre je me permets de le repréciser vu que c'est pas clair dans ton message, mais la macro marche bien quand le fichier est déjà ouvert OU qu'il a été ouvert une fois et sauvegardé (et dans ce cas de figure alors cela marchera sans soucis).

    Ci-joint mon code donc, je te remercie beaucoup pour le temps que tu me consacres et la vitesse de ta réponse en tous cas, si t'as d'autres interrogations hésite pas ..

    Pierre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    Sub EnvoiDonnees()
    ' Déclaration des variables
        Dim i As Integer
        Dim b As Integer
        Dim compteurColArrivee As Integer
        Dim compteurLigArrivee As Integer
        Dim compteurColSource As Integer
        Dim compteurLigSource As Integer
        Dim stock As Integer
     
     
        compteurColArrivee = 4
        compteurColSource = 3
        compteurLigSource = 142
     
       compteurLigArrivee = InputBox("Entrez la ligne de départ")
     
        If Not IsNumeric(compteurLigArrivee) Then
            'erreur dans la saisie
        Else
             'saisie d'un entier valide, donc on transtype
             b = CInt(compteurLigArrivee)
        End If
     
            'on se servira de stock pour revenir à chaque fois à la bonne ligne de départ une fois qu'on devra changer de colonnes
            stock = compteurLigArrivee
     
            ' Sélection du classeur source à partir d'une fenêtre
            cheminfichier = Application.GetOpenFilename("Fichiers Excel (*.xls; *.xlsx; *.xlsm),*.xls; *.xlsx; *.xlsm")
     
            'Ouverture du classeur source
            Workbooks.Open cheminfichier
     
            ' Récupération du nom du classeur + extension
       For i = Len(cheminfichier) To 1 Step -1
                If Mid(cheminfichier, i, 1) = "\" Then Exit For
       Next
     
       nomFichier = Mid(cheminfichier, i + 1, Len(cheminfichier))
     
       ThisWorkbook.Sheets("TraitementJournalier").Cells(1, 1).Value = nomFichier
      ' Copie des valeurs entre les classeurs
      ' Boucle pour revenir à la ligne une fois qu'on a achevé une colonne
        While compteurLigSource < 149
            'Boucle pour décaler d'une colonne
        While compteurColSource < 34
            ThisWorkbook.Sheets("TraitementJournalier").Cells(b, compteurColArrivee) = Workbooks(nomFichier).Sheets("RJM").Cells(compteurLigSource, compteurColSource).Value
            b = b + 1
            compteurColSource = compteurColSource + 1
        Wend
            compteurLigSource = compteurLigSource + 1
            compteurColArrivee = compteurColArrivee + 1
            If compteurColArrivee = 9 Then
            compteurColArrivee = compteurColArrivee + 1
            End If
            compteurColSource = 3
            b = stock
        Wend

Discussions similaires

  1. Recherche d'un fichier text puis copie de son contenu dans Excel
    Par DavOak12 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/02/2012, 19h56
  2. [Lazarus] Copie de répertoire et de son contenu
    Par lohot dans le forum Lazarus
    Réponses: 3
    Dernier message: 13/04/2008, 19h55
  3. [AJAX] Ecartement d'une <div> (et de son contenu)
    Par Paul75 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 31/10/2007, 11h41
  4. [Problème]Bloc dont la hauteur évolue selon son contenu
    Par mickdu90 dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 18/10/2007, 13h14
  5. [VBA]Problème ouverture - copie fichers de plusieurs sources
    Par kullervo dans le forum Général VBA
    Réponses: 9
    Dernier message: 27/04/2007, 11h22

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