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 :

petite incompréhension de code


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 136
    Par défaut petite incompréhension de code
    Bonjour à tous,

    Voila je me suis fait aider pour un morceau de code par un ami mais je ne comprend pas vraiment tout le code, et il ne peut pas m'expliquer car il vien de s'envoler pour l'espagne ^^ (veinard ^^).

    Donc voila en fait je sais que avec ce code je copie un tableau qui commence à la ligne C17 et qui fini à la ligne G25.
    Mais je voudrais par exemple rajouter un tableau qui commence a la ligne C57, et qui fini à la ligne C65.

    donc voila je donne en même temp 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
     
    Sub enreg_BDD()
        Sheets("STAT_GOOD").Activate
            Application.ScreenUpdating = False
       If [GOOD!a1] <> "" Then
                [BDD!d65536].End(xlUp)(2).Name = "top"
                Range("GOOD!a1").Copy Destination:=[BDD!a65536].End(xlUp)(2) 'nom Valve
                Range("GOOD!k4").Copy Destination:=[BDD!c65536].End(xlUp)(2) 'date
                Range("STAT_GOOD!d12").Copy Destination:=[BDD!b65536].End(xlUp)(2) 'nom fichier'******essai
                    Application.CutCopyMode = False
                    [c17].Select
     
                Do While ActiveCell <> ""
                   Range(ActiveCell, ActiveCell.Offset(0, 4)).Copy
                        With Sheets("BDD")
                            .Range("top").PasteSpecial Paste:=xlPasteValues
                            [Top].Offset(0, 5).Name = "top"
                        End With
                    Application.CutCopyMode = False
                    ActiveCell.Offset(1, 0).Select
                Loop
                    [GOOD!a1].ClearContents 'contrôle du If
            Else
                MsgBox ("déjà enregistré dans BDD !")
        End If
    End Sub
    Je vous remerci d'avance.
    Amicalemen

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut jackall et le forum
    Ton code fonctionne ???
    Tu as ce qui me semble des erreurs de syntaxe. exemple :
    [GOOD!a1] Range("GOOD!k4")
    La vraie syntaxe devrait être, à ma connaissance :
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("GOOD").Range("k4")
    qui sont deux des écritue possibles pour désigner une plage de la feuille "GOOD".

    De même, il y a un "raisonnement" qui me semble bizarre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("BDD").[D65536].End(xlUp)(2).Name = "top"
    Nomme "top" la première cellule de D vide, après toutes les données de D. Réellement : la première cellule suivant (vers le bas) de la première cellule non vide en partant de la ligne 65536 et en remontant.

    Comme tu utilises "top" à partir de D, pour copier les colonnes, je pense qu'il serait préférable de l'utiliser pour les colonnes A, B et C, pour avoir toutes les données sur la même ligne : utiliser D sous-entend que A, B ou C peuvent être vides, Dans ce cas, les données ne seront plus forcément alignées.
    A+

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 136
    Par défaut
    re,

    Le code fonctionne, mais je veus bien faire les modifications que tu m'a dite pour voir si sa fonctionne toujours ^^
    Mais en fait c'est les lignes de codes qui parle de la selection et de la copie du tableau que je ne comprend pas bien. Je suis un peu débutant donc c'est pour sa que j'ai un petit peu de mal ^^

    Amicalement

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2008
    Messages : 73
    Par défaut
    Donc donc donc.. De ma maigre expérience, ton code ne fais pas que copier un tableau, explication du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If [GOOD!a1] <> "" Then
    Condition, si A1 est vide (pourquoi d'ailleurs ?!)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [BDD!d65536].End(xlUp)(2).Name = "top"
                Range("GOOD!a1").Copy Destination:=[BDD!a65536].End(xlUp)(2) 'nom Valve
                Range("GOOD!k4").Copy Destination:=[BDD!c65536].End(xlUp)(2) 'date
                Range("STAT_GOOD!d12").Copy Destination:=[BDD!b65536].End(xlUp)(2) 'nom fichier'******essai
                    Application.CutCopyMode = False
                    [c17].Select
    On nomme la derniére cellule vide de la colonne D en "top".
    on copie la valeur A1 à la derniére cells vide de la colonne A, la valeur K4 à la derniére cells vide de la colonne C et enfin on copie la valeur de D12 de la feuille STAT_GOOD à la derniére cells vide de la colonne b

    on sélection la cellule C17.

    ok bloc suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Do While ActiveCell <> ""
                   Range(ActiveCell, ActiveCell.Offset(0, 4)).Copy
                        With Sheets("BDD")
                            .Range("top").PasteSpecial Paste:=xlPasteValues
                            [Top].Offset(0, 5).Name = "top"
                        End With
                    Application.CutCopyMode = False
                    ActiveCell.Offset(1, 0).Select
                Loop
    Faire tant que la cellule active (C17 à la premiére itération) est vide :
    on copie de la C17 à la C21 (17 + 4).
    Sélection de ma feuille BDD,
    on sélection la cellule top, qui est ne l'oublions pas, la derniére vide de la colonne D, puis :
    on copie les data
    et enfin on redéfini top 5 cellules plus loin (logiquement la cellule juste aprés la zone de copie).
    On passe à la cellule sélectionnée suivante D17 et on recommence le While.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [GOOD!a1].ClearContents 'contrôle du If
    Certainement pour que le If soit vrai aprés l'opération sur la cellule (opération de réinitialisation)

    ensuite des fin de boucle et un message d'erreur.

    Voila pour les explications. j'espére que ça correspond à quelque chose pour toi, parce que pour moi sans le fichier qui montre les données j'ai un peu de mal à visualiser.

    Denioo

  5. #5
    Membre confirmé
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 136
    Par défaut
    re,

    Ben les explication données me font voir un peu plus clair, mais aprés plusieurs tentatives, j'échou toujours pour rajouter des données.
    Pour mieu expliquer je met mon fichier complet a disposition.
    Ce que je voudrais faire c'est de copier toute les données de mon classeur dans la feuille BDD.
    J'ai déja le premier tableau, et j'ai donc essayer de copier le second sans succé...

    Merci à vous.
    Amicalement

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2008
    Messages : 73
    Par défaut
    huhuhuhuhu je peux pas lire les rar au taff

    Comment ça ce fait que ton fichier soit si gros ? o.O
    enléves les data inutiles, et met le en zip si tu veux un coup de main !

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut jackall et le forum
    la lecture du fichier me fait soupçonner plusieurs "macrotistes"
    Plutôt que de mettre une litanie de formules, je mettrais :
    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
    Sub moy_good()
    'Range("C17").FormulaArray = "=SUMIF(GOOD!C[-1],RC[-1],GOOD!C[1])/COUNTIF(GOOD!C[-1],RC[-1])"
    'Range("D17").FormulaArray = "=SUMIF(GOOD!C[-2],RC[-2],GOOD!C[2])/COUNTIF(GOOD!C[-2],RC[-2])"
    'Range("E17").FormulaArray = "=SUMIF(GOOD!C[-3],RC[-3],GOOD!C[3])/COUNTIF(GOOD!C[-3],RC[-3])"
    'Range("F17").FormulaArray = "=SUMIF(GOOD!C[-4],RC[-4],GOOD!C[4])/COUNTIF(GOOD!C[-4],RC[-4])"
    'Range("G17").FormulaArray = "=SUMIF(GOOD!C[-5],RC[-5],GOOD!C[6])/COUNTIF(GOOD!C[-5],RC[-5])"
    'etc..................
    Dim X As Long
    Dim Y As Integer
    For X = 17 To 25
        For Y = 1 To 5
            Cells(X, Y + 2) = "=SUMIF(GOOD!C[" & -Y & "],RC[" & -Y & "],GOOD!C[" & IIf(Y = 5, 6, Y) & "])/COUNTIF(GOOD!C[" & -Y & "],RC[" & -Y & "])"
        Next Y
    Next X
    End Sub
    Plus court, non ? on doit pouvoir faire pareil à pratiquement toutes tes formules
    Pour l'autre :
    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
    Sub enreg_BDD()
    Sheets("STAT_GOOD").Activate
    Application.ScreenUpdating = False
    If [GOOD!A1] <> "" Then
        [BDD!D65536].End(xlUp)(2).Name = "top"
        Range("GOOD!A1").Copy Sheets("BDD").Range("A" & Range("top").Row)
        Range("GOOD!K4").Copy Sheets("BDD").Range("C" & Range("top").Row)
        Range("STAT_GOOD!D12").Copy Sheets("BDD").Range("B" & Range("top").Row)
     
        [C17].Select
        Do While ActiveCell <> ""
            Range(ActiveCell, ActiveCell.Offset(0, 4)).Copy
            Sheets("BDD").Range("top").PasteSpecial Paste:=xlPasteValues
            Range("top").Offset(0, 5).Name = "top"
            ActiveCell.Offset(1, 0).Select
        Loop
        [GOOD!A1].ClearContents
    Else
        MsgBox "déjà enregistré dans BDD !", vbQuestion + vbOKOnly, "ERREUR ENREGISTREMENT"
    End If
    Application.ScreenUpdating = True
    Application.CutCopyMode = False
    End Sub
    utiliser le nom de la feuille comme un champs et peut-être bien pour des habitués à Access, mais ça limite la lisibilité du code.
    Je pense que tes ennuis provienne du travail sur ActiveCell : si tu sélectionne une autre cellule en pas-à-pas, excel continue à partir de là.
    A+

Discussions similaires

  1. Petite optimisation de code
    Par Konrad Florczak dans le forum Langage
    Réponses: 4
    Dernier message: 27/09/2006, 16h37
  2. [Debutant] Petit incompréhension
    Par Tronche dans le forum Langage
    Réponses: 2
    Dernier message: 23/09/2006, 12h51
  3. [Conception] Petit problème de code de confirmation.
    Par lorry1993 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 30/08/2006, 13h18
  4. [C#] Débutant : Pb avec ce trout petit bout de code
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 14
    Dernier message: 22/04/2006, 13h19
  5. faire un commit que sur un petit partie du code
    Par schnourf dans le forum Oracle
    Réponses: 4
    Dernier message: 11/01/2006, 11h19

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