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 :

Longueur code max atteint


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut Longueur code max atteint
    Salut a tous,

    J'étais en train de coder mon petit prog, quand soudain lors d'un test message d'erreur "Procédure trop grande". Après une recherche sur le net, il apparaît que le message est assez clair et qu'il dit bien ce qu'il dit.

    Mon code fais 2932 lignes et j'ai pas encore fini. Savez vous quelle longueur max?

    Le but de ce code est :

    Je remplis feuille1 qui contient une liste d'article avec quelque calcule et lorsque je clique sur un bouton, la macro démarre et :

    - ouvre la feuille2, vire toutes les cases inutile de feuille1 et me fait "une mise en page facile a lire"
    - ouvre Word et me replace tout les articles utilisé dans un texte (avec des signets)

    J'ai pas mal de boucle de vérification, etc.

    Je voulais bien séparer la partie excel Feuille2 de la commande Word afin de ne pas risquer que ca foire en faisant un passage Word-excel permanent. => plus de code et réutilisation de même boucle IF pour vérifier

    Si je supprime cela, ca va me réduire mes lignes de codes, mais je pense pas que ce sera vraiment significatif.

    Quelqu'un a t il une idée de ce que je pourrais faire? Je sais que je devrais utiliser des fonctions, des call etc.. mais je ne maitrise pas vraiment et en plus, je vais devoir envoyer des arguments, etc et ca je maitrise encore moi....

    Y a t il moyen de faire autrement?

    Merci à tous.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 169
    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 : 13 169
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Quelqu'un a t il une idée de ce que je pourrais faire? Je sais que je devrais utiliser des fonctions, des call etc.. mais je ne maitrise pas vraiment et en plus, je vais devoir envoyer des arguments, etc et ca je maitrise encore moi....
    Et bien pourtant c'est la seule façon de travailler pour rendre pérenne ton application et surtout facilité la maintenance et les tests.
    Passer un argument à une procédure Function ou Sub, n'est pas plus compliqué que le faire avec Excel.
    Dans cette formule, on passe comme argument, la plage L2:L100
    Si on écrit en VBA la fonction SOMME, on aurait écrit. Attention pour l'exemple, je l'appelle maSomme pour éviter l'ambiguité qui ne manquerais pas de se produire lors de l'exécution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function maSomme(plage As Range)
     Dim c As Range, Total As Double
     For Each c In plage
      maSomme = maSomme + c.Value
     Next
    End Function
    Donc dans Excel, tu pourrais tester
    Cela n'a évidemment pas d'intérêt mais cela illustre par l'exemple, l'avantage d'utiliser des procédures paramétrées.

    A partir du moment où tu écris deux procédures presque identiques interroge toi s'il ne serait pas intéressant d'en faire une procédure avec paramètres.
    Si tu écris trois procédures pratiquement identiques, ne te pose plus la question. Ecris cette procédure
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut
    Merci pour ton aide... plus que rapide

    Voici un bout de code qui se répète tout le temps :

    Dans ma feuille 1 je note que j'ai 3 article et je met dans les cellule a côtés l'endroit ou je met l'article par exemple :

    Cellule B1 :3
    Cellule C1 : living
    Cellule D1: Salon
    CelluleE1 : Buanderie

    Ma boucle vérifie :

    Si ma première feuille contient au moins 1 article, dans ma feuille 2 je fais une boucle pour afficher dans une cellule :

    3 articles placés dans living/Salon/Buanderie

    Question :
    1. Est ce possible de mettre cette procédure toute seule
    2. vais je gagner kkchose?
    3. Je vais devoir envoyer une tonne d'argument

    Merci pour ta patience envers un âne et ton aide :-)

    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
     
    If Worksheets("Calcul").Range("B" & s) <> 0 Then
     
        C = Worksheets("Calcul").Range("B" & s).Value
     
        Worksheets("Récap").Range("A1").Offset(a, b) = Worksheets("Calcul").Range("B" & s).Value & Texte1
     
        e = 3
     
        Do Until d = C
     
            Texte = Texte & " / " & Worksheets("Calcul").Range("B" & s).Offset(0, e).Value
     
            d = d + 1
            e = e + 1
        Loop
     
     a = a + 1

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 169
    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 : 13 169
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pas certain d'avoir bien compris ce que tu souhaites faire mais voilà une procédure qui construit ta phrase
    En supposant que les cellules où sont écrits les lieux se trouvent dans les cellules à droite de la cellule contenant la quantité, le paramètre à passer à la procédure est un objet Range qui représente la cellule où se trouve la quantité
    La procédure renvoie donc la phrase. On peut encore améliorer la fonction en prévoyant le singulier du mot "article" si la quantité est égale à 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function BuildSentence(c As Range) As String
     Dim n As Byte
     BuildSentence = c.Value & " articles dans "
     For n = 1 To c.Value
      If n > 1 Then BuildSentence = BuildSentence & "/"
      BuildSentence = BuildSentence & c.Offset(columnoffset:=n).Value
     Next
    End Function
    La procédure qui invoque la procédure BuildSentence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Test()
     Dim rngSource As Range, rngTarget As Range, c As Range, row As Long
     With ThisWorkbook
      Set rngSource = .Worksheets("Feuil1").Range("A1").CurrentRegion
      Set rngTarget = .Worksheets("Feuil2").Range("A1").CurrentRegion
     End With
     For Each c In rngSource.Columns(2).Cells
      With rngTarget
       If row Then .Offset(.Rows.Count + row - 1).Resize(1, 1) = BuildSentence(c)
      End With
      row = row + 1
     Next
    End Sub
    Dans cet exemple les deux listes doivent débuter en A1 et ont toutes les deux des étiquettes de colonnes.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut
    Merci pour ton aide,

    J'ai trouvé ou couper mon code en faisant un call au moment ou je n'ai plus besoin d'envoyer ni de recevoir des arguments.

    Par contre ton code m'intéresse surtout sur la manière et la propreté

    Je vais donc m'y intéresser et en prendre de la graine.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. nouveau fichier de log si taille max atteinte
    Par Juwan dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 16/05/2012, 10h48
  2. tmpfile() nombre de fichiers max atteint!
    Par Rodinia dans le forum Bibliothèque standard
    Réponses: 12
    Dernier message: 22/07/2009, 00h12
  3. [FB] longueur max d'un champ unique sous forebird = 80 ?!
    Par moucrack dans le forum Débuter
    Réponses: 3
    Dernier message: 06/09/2005, 23h50
  4. Réponses: 2
    Dernier message: 27/08/2005, 16h12
  5. [MASM] Quelle est la longueur max d'une variable?
    Par Crisanar dans le forum Assembleur
    Réponses: 2
    Dernier message: 17/11/2004, 21h47

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