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 :

Sauvegarde des données


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Par défaut Sauvegarde des données
    bonjour à tous,
    J'ai une macro qui met a jour un fichier et je dois garder des informations que les utilisateurs ajoutent. Mon problème est que la boucle qui réinsert les infos est extrêmement longue...
    Voici le code :
    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
    Do While Range("A" & lngligne).Value <> ""          'compter nbre de ligne d'OA pour dimensionner le tableau
        lngligne = lngligne + 1
    Loop
    ReDim tabSave(11, lngligne)                          'redim du tableau
    lngligne2 = lngligne
    For i = 4 To lngligne
                  'boucle pour remplir le tableau avec les commentaires et l'identificateur
        tabSave(1, i) = Range("X" & i).Value
        tabSave(2, i) = Range("Y" & i).Value
        tabSave(3, i) = Range("Z" & i).Value
        tabSave(4, i) = Range("AA" & i).Value
        tabSave(5, i) = Range("AB" & i).Value
        tabSave(6, i) = Range("AC" & i).Value
        tabSave(7, i) = Range("AD" & i).Value
        tabSave(8, i) = Range("AE" & i).Value
        tabSave(9, i) = Range("AF" & i).Value
        tabSave(10, i) = Range("AG" & i).Value
        tabSave(11, i) = Range("AH" & i).Value
    Next i
     
    'reste du code
    '
    '
    '
     
    'boucle pour réinserer les données
    For i = 4 To lngligne
       For j = 1 To lngligne2
         If Range("AH" & i).Value = tabSave(11, j) Then  'Boucle en comparant l'identificateur de la ligne
                                                         'et remet les indicateurs si c'est la même ligne
            Range("X" & i).Value = tabSave(1, j)
            Range("Y" & i).Value = tabSave(2, j)
            Range("Z" & i).Value = tabSave(3, j)
            Range("AA" & i).Value = tabSave(4, j)
            Range("AB" & i).Value = tabSave(5, j)
            Range("AC" & i).Value = tabSave(6, j)
            Range("AD" & i).Value = tabSave(7, j)
            Range("AE" & i).Value = tabSave(8, j)
            Range("AF" & i).Value = tabSave(9, j)
            Range("AG" & i).Value = tabSave(10, j)
        End If
      Next j
    Next i

    Voila la partie concerné du code, avant cette fonctionnalité la macro mettais 5 min à s'exécuter et maintenant 47 min...
    Y'a t'il un moyen plus rapide ?

  2. #2
    Membre Expert Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Par défaut
    Bonjour

    tu peux rempacler :
    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
    Do While Range("A" & lngligne).Value <> ""          'compter nbre de ligne d'OA pour dimensionner le tableau
        lngligne = lngligne + 1
    Loop
    ReDim tabSave(11, lngligne)                          'redim du tableau
    lngligne2 = lngligne
    For i = 4 To lngligne
                  'boucle pour remplir le tableau avec les commentaires et l'identificateur
        tabSave(1, i) = Range("X" & i).Value
        tabSave(2, i) = Range("Y" & i).Value
        tabSave(3, i) = Range("Z" & i).Value
        tabSave(4, i) = Range("AA" & i).Value
        tabSave(5, i) = Range("AB" & i).Value
        tabSave(6, i) = Range("AC" & i).Value
        tabSave(7, i) = Range("AD" & i).Value
        tabSave(8, i) = Range("AE" & i).Value
        tabSave(9, i) = Range("AF" & i).Value
        tabSave(10, i) = Range("AG" & i).Value
        tabSave(11, i) = Range("AH" & i).Value
    Next i
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim tabsave as variant
    tabsave = range("X4:AH" & range("A65536").end(xlup).row)

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Par défaut
    ok, donc cela copiera les valeurs dans tabsave c'est bien ça ?
    Merci pour ta réponse !
    Par contre quelqu'un aurait il quelque chose pour la deuxième partie du code, car c'est celle la qui longue...
    Merci a toi Wilfried

  4. #4
    Membre Expert Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Par défaut
    re:

    le problemme est que dans la deuxieme partie de la macro, tu fais un test avec la 11eme colonne AH ce qui laisse à penser que tu as soit ajouté des lignes, soit supprimé des lignes

    donc il nous manque des renseignements

    sinon, pour reintegrer toutes les données dans le meme ordre, il suffit d'inverser l'ordre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("X4:AH" & range("A65536").end(xlup).row) = tabsave
    sinon à essayé, non testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dim tabsave as varaint, gwcel as range, i as long, j as integer
    tabsave = range("X4:AH" & range("A65536").end(xlup).row)
     
    ton code macro
     
    for i = 1 to ubound(tabsave)
         set gwcel = nothing
         set gwcel = Range("AH:AH").find (what:=tabsave(i,11), lookin:=xlvalues, lookat:=xlwhole)
         if not gwcel is nothing then for j = 1 to 11 : gwcel.offset(0,j-1) = tabsave(i,j) : next j
    next i
    fait bien une sauvegarde de ton classeur avant

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Par défaut
    Ok je fais un test, en fait dans la colonne AH il y a une concaténation qui me permet d'identifier la ligne pour pouvoir réintégrer les commentaires dans la ligne qui correspond. Lors de la mise a jour toute les données sont effacées et des lignes qui apparaissent ou disparaissent.
    Je vais tester ton code, merci de prêter attention à mon problème

  6. #6
    Membre éprouvé
    Inscrit en
    Mai 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 104
    Par défaut
    Salut,
    Dans la deuxième partie tu écris dans Excel donc il y a plein de choses qui se passent en douce...
    Tu as essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    ' ton code ici
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    Au passage, remplace tes colonnes câblées en dur par un indice et tes range par des cells :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for k = 1 to maxk
        tabSave(k, i) = cells( i, 22+k).Value
    next k
    au lieu de dix lignes...

  7. #7
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.Calculation = xlCalculationManual
    ' ton code ici
    Application.Calculation = xlCalculationAutomatic
    Je vais essayer.

    Sinon pour le reste tu peux m'expliquer un peu plus ?

Discussions similaires

  1. [VB.NET] Comment sauvegarder des données ?
    Par Aspic dans le forum VB.NET
    Réponses: 14
    Dernier message: 15/07/2007, 16h47
  2. [Debutant] Sauvegarder des données
    Par ArHacKnIdE dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 16/11/2006, 21h00
  3. [SQL Server Management Express] Sauvegarde des données
    Par basnifo dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 02/06/2006, 10h49
  4. Sauvegarder des données de configuration
    Par Yepazix dans le forum Débuter
    Réponses: 7
    Dernier message: 10/04/2006, 14h35
  5. sauvegarde des données des tables
    Par tomm dans le forum Bases de données
    Réponses: 18
    Dernier message: 27/04/2004, 22h29

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