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 :

Copie de fichiers beaucoup trop lente.


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Polygos
    Homme Profil pro
    Ma petite entreprise
    Inscrit en
    Avril 2016
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ma petite entreprise
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2016
    Messages : 190
    Par défaut Copie de fichiers beaucoup trop lente.
    Bonjour les amis, je pensais savoir faire une question aussi simple, visiblement non.
    Je fais une copie en automatique d'une base de donnée sur un tableau excel vers un autre tableau excel et je procède logiquement comme ceci:
    Itération sur les colonnes, puis sur les lignes
    contrôle que la cellule n'est pas vide, sinon je saute
    copie de la cellule du fichier origine de la feuille concernée de wbk2 vers celle de wbk2, classeurs définis sur mon réseau.
    Premier souci.

    Cette copie sert à mettre à jour des données dedans, puis sera ensuite recopiée, dans la base d'origine qui évolue ainisi, uniquement si des cellules sont modifiées (mises en rouge).
    Il s'agit d'une base d'articles assez lourde, 125 colonnes et 1617 lignes (extensible à davantage à l'avenir) qui comporte des descriptions de produits en plusieurs langues; aussi faut il souvent mettre à jour et jugeant que c'est dangereux de faire les modifs dans la base elle-même et afin de s'y retrouver, je préfère faire une copie, la modifier, puis réinjecter les modifs dans la base initiale.
    voila pour l'explication de la logique.

    Lorsque la copie est faite, le traducteur intervient et, à l'aide d'une Private sub worksheet_change, toutes les cellules "touchées" passent en gras rouge:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_Change(ByVal Target As Range)
    With Selection.Offset(-1, 0).Font
    .ColorIndex = 3
    .Bold = True
    End With
    End Sub
    Cette procéure est placée au niveau de la feuille concernée. elle fonctionne sauf pour la dernière ligne; si je ne mets pas l'offset, elle ne fonctionne pas pour la première, détail pas compris.

    Le second problème, c'est qu'il faudrait "arrêter cette routine" le temps de la copie, sinon bien sûr, elle est "rouge" !
    Ce que j'ai fait en la desactivant au début du run de la procédure de copie et en la réactivant après.
    Mais ça ne fonctionen pas, elle reste rouge, cette copie.
    Second souci donc.

    Maintenant que vos avez les explications, vous allez me montrer ou j'ai pêché....

    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
    Sub rafraichir()
    'RAFRAICHI LA COPIE DE GRANDE BASE - MODULE 7
    Dim wbk1 As Workbook
    Dim wbk2 As Workbook
     
    Set wbk1 = ThisWorkbook
    Set wbk2 = Workbooks.Open(Filename:="C:\Users\Christophe\Documents\PHOTOS & FT FOURNISSEURS\..CATALOGUE\CATALOGUE KZ\GRANDE BASE 1108O1108.xlsm")
     
    Dim l As Integer
    Dim c As Integer
     
    ' Désactivation de la macro évènement
    Application.EnableEvents = False
     
     
    If MsgBox("Voulez-vous mettre à jour la copie avec le contenu réel de la base article ?", vbYesNo, "Confirmation de la demande") = vbYes Then
     
        For c = 1 To 125
            For l = 8 To 1617
                If wbk2.Worksheets("Epicerie").cells(l, c) <> "" Then
     
                wbk1.Worksheets("Epicerie").cells(l, c) = wbk2.Worksheets("Epicerie").cells(l, c)
                Else
                End If
            Next l
        Next c
     
     
    Else
    End If
    ' Réactivation de la macro évènement
    Application.EnableEvents = True
     
    End Sub
    Ce module est placé au niveau du classeur.

    Alors,
    1/Comment faire pour l'accélérer ? 10 minutes de calcul actuellement.
    A noter que j'avais mis une condition de cellule vide non copiée pour gagner du temps...

    2/Comment neutraliser la procédure worksheet_change ?

    a la fin, j'ai essayé autre chose: laisser la worksheet_change fonctionner et TOUT repasser en noir en fin du programme de copie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'Remise en noir
    wbk1.Range("A8:DP1617").Select
    Selection.ColorIndex = 1
    Selection.Bold = False
    Mais je vois bien que c'est lourd...
    Je pense que je vais prendre une claque, non ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 684
    Par défaut
    Citation Envoyé par Polygos Voir le message
    Alors,
    1/Comment faire pour l'accélérer ? 10 minutes de calcul actuellement.
    A noter que j'avais mis une condition de cellule vide non copiée pour gagner du temps...
    Copier la plage entière et pas cellule par cellule.

    2/Comment neutraliser la procédure worksheet_change ?
    il me semble que c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.enableevents=false
    A reppasser en true quand tu as fini.

  3. #3
    Membre confirmé Avatar de Polygos
    Homme Profil pro
    Ma petite entreprise
    Inscrit en
    Avril 2016
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ma petite entreprise
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2016
    Messages : 190
    Par défaut
    Bonjour halaster08 et merci de ton retour.

    J'avais pensé copier la plage mais lors de la seconde phase du programme qui va être de reprendre uniquement ce qui a été porté en rouge dans le fichier dr'origine, il va bien falloir que je copie cellule après cellule, avec test sur le couleur pour prendre en compte ou non la modif....

    La position de la procédure worksheet_change est bien correcte ?

    Par ailleurs, pourquoi ai je un décalage dans la mise en rouge, avec ou sans offset de ligne ?

    Je suis nouveau, je n'ai as trouvé ou obtenir des fenêtre dans le message comme vous faites pour montrer le code; c'est où ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 684
    Par défaut
    Citation Envoyé par Polygos Voir le message
    Je suis nouveau, je n'ai as trouvé ou obtenir des fenêtre dans le message comme vous faites pour montrer le code; c'est où ?
    C'est la balise code, symbole #
    Ca rend le code beaucoup plus et j'aurais d'ailleurs vu que tu utilise déjà application.enableevents

    La position de la procédure worksheet_change est bien correcte ?
    il me semble que oui, as tu consulté le tuto sur les évènements du classeur? si non je te le conseille.

    Par ailleurs, pourquoi ai je un décalage dans la mise en rouge, avec ou sans offset de ligne ?
    Je ne sais pas. Si tu fais des changement "à la main" (sans macro) que se passe-t-il?

  5. #5
    Membre confirmé Avatar de Polygos
    Homme Profil pro
    Ma petite entreprise
    Inscrit en
    Avril 2016
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ma petite entreprise
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2016
    Messages : 190
    Par défaut
    Bonjour Patrick,
    oui c'est logique; mon souci peut être résolu mais quand je vais devoir refaire les copies dans l'autre sens, là, je ne couperais pas à la copie sur test de couleur, car je ne veux reintéger dans la base QUE les modifications.
    alors tu préconises aussi une copie globale ?

    J'ai modifié le code avec la copie globale, comme indiqué et j'obtiens un arrêt sur la ligne que tu m'as donnée (erreur 438 ci-dessous, en bas je sais pas pourquoi ça sort pas là ou je l'ai mis sur cette page !) :
    Nom : 2016-08-17_141247.jpg
Affichages : 348
Taille : 58,0 Ko

    Merci Halaster pour la balise, je vais tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ' Désactivation de la macro évènement
    Application.EnableEvents = False
     
     
    If MsgBox("Voulez-vous mettre à jour la copie avec le contenu réel de la base article ?", vbYesNo, "Confirmation de la demande") = vbYes Then
     
    wbk1.Range(cells(8, 1), cells(1627, 125)) = wbk2.Range(cells(8, 1), cells(1627, 125))
     
    Else
    End If
    ' Réactivation de la macro évènement
    Application.EnableEvents = True
    Pour le test copie à la main, ça marche pour la première ET pour la dernière ligne..vraiment étrange
    Mais alors pourquoi mon activation / désactivation en debut et fin de procédure ne fonctionne pas ?
    Images attachées Images attachées  

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 684
    Par défaut
    Renvoie une erreur.
    Il faut écrire
    Mais alors pourquoi mon activation / désactivation en debut et fin de procédure ne fonctionne pas ?
    Lance la macro en mode pas à pas (F8) tu verras peut être mieux ce qu'il se passe

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour

    je récapitule:
    tu a une base et une copie de la base

    tu met plusieurs fois ta copie base a jour en fonction de la base(quotidiennement ,ponctuellement ,etc....)

    tu ne modifie que les cellules qui sont différentes c'est bien ca?

    dans ce cas si ta copie base doit être identique a la base
    pourquoi ne pas copier directement toute la plage de la base sur la copie en une fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wbk1.range(cells(8,1),cells(1627,125))=wbk2.range(cells(8,1),cells(1627,125))
    pas besoins de tester
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. [2008] IF EXISTS/IF COUNT beaucoup trop lent
    Par Krison dans le forum Développement
    Réponses: 8
    Dernier message: 15/09/2015, 12h04
  2. [XL-2007] Fichier trop lent : 1048576 lignes sur 5000 utilisées
    Par Ced17 dans le forum Excel
    Réponses: 7
    Dernier message: 22/12/2014, 16h44
  3. Méthode isReachable beaucoup trop lente
    Par mcfly37 dans le forum Langage
    Réponses: 6
    Dernier message: 17/09/2010, 20h32
  4. fichiers trop lents
    Par angelosa dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 31/03/2008, 22h39
  5. Taille du fichier gdb augmente beaucoup trop
    Par Y dans le forum Débuter
    Réponses: 4
    Dernier message: 01/04/2005, 13h46

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