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 :

Formulaire de saisie en VBA, procédure trop longue


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Formulaire de saisie en VBA, procédure trop longue
    Bonjour à tous,

    Voilà, j'ai un problème au niveau d'un formulaire de saisie que j'ai créé, quand je lance mon programme, j'ai un message d'erreur disant que ma procédure est trop longue.

    Le problème c'est que je n'arrive pas à coder une procédure générale que je pourrai appeler dans une subroutine et ainsi ne pas dépasser la capacité de mémoire de ma procédure.

    Voici le code principale qui doit executer les tâches suivantes via le formulaire de saisie:

    - j'ai une liste de projet et je dois savoir pour chaque acteur quelle est la charge de travail qui a été réalisée. Donc j'ai créé un formulaire ou l'utilisateur décide via une combobox quel projet il souhaite renseigner.

    - puis j'ai un tableau, avec dans la colonne d'entête les 6 acteurs et en entête de ligne les 12 mois de l'année (ce sont mes labels)
    puis à l'intérieur du tableau j'ai 75 textbox que va remplir l'utilisateur afin d'allouer un certain nombre d'heure à chaque acteur.

    Mon problème c'est que je dois faire cette opération pour plus de 100 projets, et l'affectation de mes données rend la procédure beaucoup trop lourde, la mémoire de ma procédure est dépassée quand j'ai plus de 10 projets...

    Quelqu'un a t-il une solution pour optimiser mon code svp, toute aide est la bienvenue... je suis complètement bloquée, je n'ai pas l'habitude de coder ?

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    Private Sub UserForm_Initialize()
     
    'Alimentation de la combobox avec le nom des différents projets que l'on a
     
            ComboBoxChoixProjet.AddItem "projet A"
            ComboBoxChoixProjet.AddItem "projet B"
            ComboBoxChoixProjet.AddItem "projet C"
     
    End sub 
     
    'PROJET 1
        If ComboBoxChoixProjet.Value = "projet1" Then
     
    'tranfert des données pour charger l'acteur 1 pour ce projet
        f.Cells(9, 16) = Me.TextBox1.Value
        f.Cells(9, 17) = Me.TextBox2.Value
        f.Cells(9, 18) = Me.TextBox3.Value
        f.Cells(9, 20) = Me.TextBox4.Value
        f.Cells(9, 21) = Me.TextBox5.Value
        f.Cells(9, 22) = Me.TextBox6.Value
        f.Cells(9, 24) = Me.TextBox7.Value
        f.Cells(9, 25) = Me.TextBox8.Value
        f.Cells(9, 26) = Me.TextBox9.Value
        f.Cells(9, 28) = Me.TextBox10.Value
        f.Cells(9, 29) = Me.TextBox11.Value
        f.Cells(9, 30) = Me.TextBox12.Value
     
     'tranfert de donnée pour l'acteur 2 pour ce projet
        f.Cells(10, 16) = Me.TextBox13.Value
        f.Cells(10, 17) = Me.TextBox14.Value
        f.Cells(10, 18) = Me.TextBox15.Value
        f.Cells(10, 20) = Me.TextBox16.Value
        f.Cells(10, 21) = Me.TextBox17.Value
        f.Cells(10, 22) = Me.TextBox18.Value
        f.Cells(10, 24) = Me.TextBox19.Value
        f.Cells(10, 25) = Me.TextBox20.Value
        f.Cells(10, 26) = Me.TextBox21.Value
        f.Cells(10, 28) = Me.TextBox22.Value
        f.Cells(10, 29) = Me.TextBox23.Value
        f.Cells(10, 30) = Me.TextBox24.Value
     
    'transfert de données pour l'acteur 3 pour ce projet
        f.Cells(11, 16) = Me.TextBox25.Value
        f.Cells(11, 17) = Me.TextBox26.Value
        f.Cells(11, 18) = Me.TextBox27.Value
        f.Cells(11, 20) = Me.TextBox28.Value
        f.Cells(11, 21) = Me.TextBox29.Value
        f.Cells(11, 22) = Me.TextBox30.Value
        f.Cells(11, 24) = Me.TextBox31.Value
        f.Cells(11, 25) = Me.TextBox32.Value
        f.Cells(11, 26) = Me.TextBox33.Value
        f.Cells(11, 28) = Me.TextBox34.Value
        f.Cells(11, 29) = Me.TextBox35.Value
        f.Cells(11, 30) = Me.TextBox36.Value
     
    'transfert de données pour l'acteur 4 pour ce projet
        f.Cells(12, 16) = Me.TextBox37.Value
        f.Cells(12, 17) = Me.TextBox38.Value
        f.Cells(12, 18) = Me.TextBox38.Value
        f.Cells(12, 20) = Me.TextBox40.Value
        f.Cells(12, 21) = Me.TextBox41.Value
        f.Cells(12, 22) = Me.TextBox42.Value
        f.Cells(12, 24) = Me.TextBox43.Value
        f.Cells(12, 25) = Me.TextBox44.Value
        f.Cells(12, 26) = Me.TextBox45.Value
        f.Cells(12, 28) = Me.TextBox46.Value
        f.Cells(12, 29) = Me.TextBox47.Value
        f.Cells(12, 30) = Me.TextBox48.Value
     
    'transfert de données pour l'acteur 5 pour ce projet
        f.Cells(13, 16) = Me.TextBox49.Value
        f.Cells(13, 17) = Me.TextBox50.Value
        f.Cells(13, 18) = Me.TextBox51.Value
        f.Cells(13, 20) = Me.TextBox52.Value
        f.Cells(13, 21) = Me.TextBox53.Value
        f.Cells(13, 22) = Me.TextBox54.Value
        f.Cells(13, 24) = Me.TextBox55.Value
        f.Cells(13, 25) = Me.TextBox56.Value
        f.Cells(13, 26) = Me.TextBox57.Value
        f.Cells(13, 28) = Me.TextBox58.Value
        f.Cells(13, 29) = Me.TextBox59.Value
        f.Cells(13, 30) = Me.TextBox60.Value
     
    'transfert de données pour l'acteur 6 pour ce projet
        f.Cells(14, 16) = Me.TextBox61.Value
        f.Cells(14, 17) = Me.TextBox62.Value
        f.Cells(14, 18) = Me.TextBox62.Value
        f.Cells(14, 20) = Me.TextBox64.Value
        f.Cells(14, 21) = Me.TextBox65.Value
        f.Cells(14, 22) = Me.TextBox66.Value
        f.Cells(14, 24) = Me.TextBox67.Value
        f.Cells(14, 25) = Me.TextBox68.Value
        f.Cells(14, 26) = Me.TextBox69.Value
        f.Cells(14, 28) = Me.TextBox70.Value
        f.Cells(14, 29) = Me.TextBox71.Value
        f.Cells(14, 30) = Me.TextBox72.Value
     
     
    private Sub CommandButtonQuitter_Click()
    unload UserFormprojet
    end Sub

    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut Bonjour,
    Voila une astuce pour diminuer ton 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
    For i = 1 To 12
    f.Cells(9, 15).Offset(0, i) = Me.Controls("TextBox" & i)
    Next
     
    'f.Cells(9, 16) = Me.TextBox1.Value
    'f.Cells(9, 17) = Me.TextBox2.Value
    'f.Cells(9, 18) = Me.TextBox3.Value
    'f.Cells(9, 20) = Me.TextBox4.Value
    'f.Cells(9, 21) = Me.TextBox5.Value
    'f.Cells(9, 22) = Me.TextBox6.Value
    'f.Cells(9, 24) = Me.TextBox7.Value
    'f.Cells(9, 25) = Me.TextBox8.Value
    'f.Cells(9, 26) = Me.TextBox9.Value
    'f.Cells(9, 28) = Me.TextBox10.Value
    'f.Cells(9, 29) = Me.TextBox11.Value
    'f.Cells(9, 30) = Me.TextBox12.Value
    For i = 1 To 12
    f.Cells(10, 15).Offset(0, i) = Me.Controls("TextBox" & (12 + i))
    Next
    'f.Cells(10, 16) = Me.TextBox13.Value
    'f.Cells(10, 17) = Me.TextBox14.Value
    'f.Cells(10, 18) = Me.TextBox15.Value
    'f.Cells(10, 20) = Me.TextBox16.Value
    'f.Cells(10, 21) = Me.TextBox17.Value
    'f.Cells(10, 22) = Me.TextBox18.Value
    'f.Cells(10, 24) = Me.TextBox19.Value
    'f.Cells(10, 25) = Me.TextBox20.Value
    'f.Cells(10, 26) = Me.TextBox21.Value
    'f.Cells(10, 28) = Me.TextBox22.Value
    'f.Cells(10, 29) = Me.TextBox23.Value
    'f.Cells(10, 30) = Me.TextBox24.Value

  3. #3
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 807
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 807
    Points : 32 103
    Points
    32 103
    Par défaut
    Voire en plus bourrin encore(mais ça doit marcher parceque toutes les utilisateurs ont le même nombre de checkbox, si j'ai bien compris) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 1 To 12
        for j = 0 to 5
            f.Cells(9, 15).Offset(j, i) = Me.Controls("TextBox" & Cstr(i + (j * 12)))
        Next j
    Next i

  4. #4
    Invité
    Invité(e)
    Par défaut el_slapper
    je l'avais pas vue venir celle là mais tu à raison!
    Dernière modification par AlainTech ; 27/04/2014 à 21h52. Motif: Suppression de la citation inutile

  5. #5
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 807
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 807
    Points : 32 103
    Points
    32 103
    Par défaut
    En même temps, je me suis lâchement inspiré de ton code, je ne me souvenait plus de la syntaxe exacte(même si c'est exactement ce que je voulais faire, j'avais un problème de "comment")..... et tu as répondu très vite.

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Un grand merci pour votre aide à tous les deux !

    Le 1er code fonctionne avec un petit bug... la base que je souhaite alimenter s'organise en 12 mois + 4 trimestre (qui sont la somme tous les 4 mois du trimstre écoulé). Donc quand je lance la macro que vous me donnez, au lieu que mon textbox correspondant au mois de Janvier alimente ce mois-ci, il alimente le trimestre 1 (étant donné que c'est la colonne qui suit)...

    Y a t-il un moyen de contourner ce problème par du code ?
    Sinon je pensais faire un copier coller avec liaison, en allant chercher les bonnes info via a autre onglet... mais ça alourdi un peu le fichier et j'ai peur que ça ralentisse le traitement...

    Pour ce qui est du 2ème code quand je l'execute j'ai une erreur 424... il me met en jaune la ligne "If comboxchoixprojet.Value = "projet 1" Then" et je comprends pas bien pourquoi...

    Une autre question... j'ai du mal à comprendre le dernier code (c'est sans doute pour ca que je ne comprends pas pourquoi le code ne s'execute pas sans erreur... Pourriez vous m'expliquer un peu plus comment on incrémente j et pourquoi dans le code c'est écris j*12 ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je réponds pour el_slapper mais il te confirmera!
    tu as 6 bloc de 12 mois; tu commences par par texte1; la première boucle (i) passe en revue les 12 premiers mois j=0 (j * 12) =0 donc i + (j * 12) = de 1 à 12;
    pour j = 1 (j * 12) = 12 donc i +(j * 12) = 13 on est bien sur le mois 13! et la cellule f.Cells(9, 15).Offset(j, i) j=1 i=1 donc f.Cells(10, 16)

    nous raisonnons en terme de niveau comme pour un bâtiment un bâtiment de 5 étage à bien 6 niveaux on compte le rez de chaussé!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     for j = 0 to 5 ' on incrémente j de 0 à 5
    Dernière modification par Invité ; 14/04/2014 à 16h57.

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 945
    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 : 12 945
    Points : 28 945
    Points
    28 945
    Billets dans le blog
    53
    Par défaut
    Bonjour Robert,
    nous raisonnons en terme de niveau comme pour un bâtiment un bâtiment de 5 étage à bien 6 niveaux on compte le rez de chaussé!
    Belle métaphore

  9. #9
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 807
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 807
    Points : 32 103
    Points
    32 103
    Par défaut
    pour compléter rdurupt

    du code que j'ai vu, on a 12 lignes et 6 colonnes, reprenant les checkbox 1 à 72(coupée en 6 morceaux de 12), et à mettre dans 6 colonnes de 12 lignes en sortie - de la colonne 9 à la colonne 15.

    Donc, l'idée, c'est de boucler sur les lignes et sur les colonnes. En l'occurence, dans l'ordre, je boucle sur les lignes(ma boucle i), et, pour chaque ligne, je boucle sur les colonnes. Je vais de 0 à 5 au lieu d'aller de 1 à 6 parceque ça facilite le calcul du numéro de TextBox. Puis ensuite, je fais l'offset depuis la colonne 9(parceque je pars de 0, et que ta première colonne est la colonne 9).

    Par contre, ton erreur 424 pose problème. Ca veut dire "objet requis". Sur la ligne qui plante If comboxchoixprojet.Value = "projet 1" Then, le seul objet, c'est comboxchoixprojet. Dans ton code initial, il s'appelait ComboBoxChoixProjet. L'erreur vient peut-être de là. Si je reprends ton code complet et que je l'adapte, voici ce que ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ComboBoxChoixProjet.AddItem "projet A"
    ComboBoxChoixProjet.AddItem "projet B"
    ComboBoxChoixProjet.AddItem "projet C"
    If ComboBoxChoixProjet.Value = "projet1" Then
        For i = 1 To 12
            For j = 0 to 5
                f.Cells(9, 15).Offset(j, i) = Me.Controls("TextBox" & Cstr(i + (j * 12)))
            Next j
        Next i
    End If
    Et si la boucle de 0 à 5 te défrise, en partant de 1, ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ComboBoxChoixProjet.AddItem "projet A"
    ComboBoxChoixProjet.AddItem "projet B"
    ComboBoxChoixProjet.AddItem "projet C"
    If ComboBoxChoixProjet.Value = "projet1" Then
        For i = 1 To 12
            For j = 1 to 6
                f.Cells(8, 15).Offset(j, i) = Me.Controls("TextBox" & Cstr(i + ((j-1) * 12)))
            Next j
        Next i
    End If
    ce que je fais :
    Je boucle i sur les 12 lignes.
    Pour chaque i, je fais boucler j sur les 6 colonnes
    Je me décale en fonction de i et de j(note que la case de départ a changé, il faut remonter d'un cran mais aussi d'une colonne par rapport à la première case, puisqu'on part de 1)
    Je calcule le numéro de la TextBox :
    _pour la première colonne, j vaut désormais 1, donc j-1 = 0, donc les textbox vont de 1 à 12(i + 12*0)
    _pour la deuxième colonne, j vaut désormais 2, donc j-1 = 1, donc les textbox vont de 13 à 24(i + 12*1)
    _pour la sixième colone, j vaut désormais 6, donc j-1 = 5, donc les textbox vont de 61 à 72(i + 12*5)
    Le reste, tu l'avais déjà dans ton post initial - je n'ai rien à t'apprendre là-dessus.

  10. #10
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Une fois de plus merci beaucoup pour votre clarté et votre réactivité ! C'est nettement plus clair et logique d'un coup

    Il me reste encore un bug... quand j'exécute la macro que vous me donnez, j'ai une erreur d'exécution... Il me dit que l'objet spécifié est introuvable, une idée d'où cela pourrait venir ?

  11. #11
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 807
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 807
    Points : 32 103
    Points
    32 103
    Par défaut
    Je prends ma casquette de testeur, et je pose les questions suivantes : quel est le message d'erreur exact, et quelle est la ligne qui se met en jaune quand on clique sur "déboguage"?

    Mais en reprenant ma casquette de programmeur, je me dis qu'un grand classique, c'est qu'on est pas au bon endroit. Par exemple, si le code ne s'execute pas dans le code du userform, alors le Me.Controls ne ramenera pas les Textbox du Userform. Ou, si f n'est pas défini comme le bon onglet, f.cells(...,...) ne pointe nulle part. Le troisième et dernier suspect est ComboBoxChoixProjet(mais il a déjà été réglé, non?).

  12. #12
    Invité
    Invité(e)
    Par défaut Bonjour,
    fais une copie de ton fichier en supprimant les données confidentielles et place la sur le site. si c'est du XLS pas de problème si c'est du XLSM Zip le.
    Dernière modification par AlainTech ; 27/04/2014 à 22h08. Motif: Suppression de la citation inutile

  13. #13
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Voilà mon fichier, donc comme tu peux le voir j'ai un bouton de commande qui m'affiche le formulaire de saisie, le problème c'est que ma macro ne s'exécute pas comme je le voudrais...

  14. #14
    Invité
    Invité(e)
    Par défaut Bonjour,
    j'ai testé ça marche!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub CommandEnregistrer_Click()
     
    Set f = Sheets("Tb suivi Projets + MCO + Act")
     
    If ComboBoxChoixProjet.Value = "projet 1" Then
        For i = 1 To 16
            For j = 0 To 5 'incrémente J de 0 à 5 6 niveaux rappel toi le bâtiment!
                f.Cells(3, 15).Offset(j, i) = Me.Controls("TextBox" & CStr(i + (j * 16)))
     
            Next j
        Next i
     
    End If
    End Sub
    Dernière modification par AlainTech ; 27/04/2014 à 22h09. Motif: Suppression de la citation inutile

Discussions similaires

  1. [XL-2007] Procédure trop longue
    Par presser dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/06/2009, 18h52
  2. Une procédure trop longue
    Par lola06 dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/05/2007, 14h02
  3. [Vba access 97] Procédure trop longue
    Par saufffy dans le forum Access
    Réponses: 6
    Dernier message: 26/02/2007, 10h40
  4. [ASE] Procèdure trop longue
    Par Benjamin78 dans le forum Sybase
    Réponses: 2
    Dernier message: 11/04/2006, 10h01
  5. [ASE][T-SQL]Procédure trop longue
    Par Benjamin78 dans le forum Sybase
    Réponses: 5
    Dernier message: 21/03/2006, 12h25

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