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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du 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
    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 confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    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 confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    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
    Futur Membre du 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
    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 ?

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