Forum Clubic

Aide excel vba

Bonjour,
actuellement je travail, dans le cadre d’un projet, sur un fichier Excel.
N’étant pas utilisateurs expert, je fait appel a vous pour m’aider à programmer le fichier.
En quelque mot j’ai besoin :

  • d’insérer des lignes selon une saisie (ca j’ai réussi mais je voudrais que la macro ne s’éxecute qu’en cas de saisie dans une plage de cellule et surtout qu’une seule fois par groupe)
  • Fusionner des cellules apres insertion des lignes
  • recopier des formules des lignes précédentes
    et d’autre petite chose qui viendront un coup que cela seras opérationnel.
    Merci d’avance !

Pour toi ça doit être très clair comme demande, mais mets-toi à la place de celui qui lit le message et qui n’a aucune idée du fichier en question …
d’insérer des lignes selon une saisie (ca j’ai réussi
par quelle méthode ? Qu’est-ce qui déclenche la macro et à quel moment ?

mais je voudrais que la macro ne s’exécute qu’en cas de saisie dans une plage de cellule
On en revient un peu à la question précédente. en ce moment, elle s’exécute quand ? et où s’insèrent les lignes ?
Qu’est-ce qui définit ta plage de cellules ?

- Fusionner des cellules après insertion des lignes
Tu as des critères pour sélectionner les cellules en question ?
Les opérations de fusion ne font souvent pas bon ménage avec les manipulations de lignes et cellules par macro. Donc si possible différer l’opération de manière à ce qu’elle soit exécutée en dernier.

Tout d’abord, merci pour la réponse.
Effectivement dis comme ca c pas tres clair !
je pense qu’un petit fichier vaut mieux qu’un grand discours donc je le met en pièce jointe.

www.petit-fichier.fr…

voilà en gros l’idée, dites moi si besoin plus de précision !

C’est presque encore moins clair avec le fichier !
Plus exactement le tableau est clair, la lecture du code et ce qu’il est censé faire est plus qu’ambigüe.

Ce que je déduis du tableau :

  • A l’origine, tu as un tableau rempli (1 ligne par N° de lot), colonne E vierge
  • Quand tu tapes un nombre n dans la colonne E, tu veux insérer n-1 lignes sous la ligne en question, et fusionner les colonnes A à E pour ces n lignes.

Ce que j’ai vu dans le code :
D’abord les incohérences :

  • Tu ne peux pas avoir de Sub Worksheet_Change() dans le module, c’est réservé au code des feuilles
  • Tes constantes sont à déclarer en tête du module 1 (et non dans une fonction de la feuille 1), juste en dessous la ligne Option Explicit que tu as oubliée (facultatif, mais un bon garde-fou surtout dans la mise au point des macros)
  • tu ne peux pas avoir de définitions de fonctions imbriquées, comme ton Private Sub Worksheet_Change() et ton insérer() dans le module. Je me demande même comment VBA accepte de lancer le insérer() par alt-F8 dans ces conditions, vu que la compilation du module (Debogage > Compiler VBAProject) échoue.

Au niveau du fonctionnement :

  • Tu acceptes le lancement de la macro pour tout changement dans la plage A1-E20 (donc y compris la ligne de titres), alors que si mon interprétation est bonne, seule une modification colonne E devrait entraîner le lancement de la macro.
  • Tu effectues des ajouts de ligne pour toutes les lignes dont la cellule E est remplie (même si c’est transparent pour celles dont le contenu de E est à 1), sans te préoccuper de la cellule saisie en dernier, ou du fait que l’ajout ait déjà été fait antérieurement (cas de la ligne 3 dans ton exemple).

Ta remarque sur la macro qui tourne en boucle :
Avec le bon code, normalement non, mais ça reste à vérifier.
A pire, tu actives un flag pour ignorer l’évènement le temps de l’exécution de la macro.

Conclusion :
le mieux c’est de repartir de zéro pour le code.
Mais avant, il faut bien préciser noir sur blanc ce que tu en attends exactement.
Et là tu auras fait largement plus de la moitié du chemin.

Merci pour ta réponse, alors je vais essayer d’etre le plus clair possible.

  • A l’origine, tu as un tableau rempli (1 ligne par N° de lot), colonne E vierge
  • Quand tu tapes un nombre n dans la colonne E, tu veux insérer n-1 lignes sous la ligne en question, et fusionner les colonnes A à E pour ces n lignes.

Oui c’est ce que je désire faire.

Après je t’avoue que tu m’a un peu perdu ^^
J’avait essayé divers code et effectivement j’ai oublié des les enlever.
Voilà (si j’ai bien compris) à quoi doit ressembler mon code

Const pls = 1
Const dls = 20000
Const pcs = 5
Const dcs = 5

Option Explicit

Sub insérer()

Dim i As Long, j As Integer, Nombre As Integer, Target As Integer 

For i = Range("E20000").End(xlUp).Row To 2 Step -1
    
        Nombre = Range("E" & i)

For j = 1 To Nombre - 1

Rows(i + j).Insert xlDown

Next
Next

End Sub

Je ne sais pas quel code mettre pour que les constantes soient prises en compte (si mes constantes sont exact comme celà, et si elles sont placées où il faut)

Tu disais (très justement) que je ne préoccupe pas de la cellule saisie en dernier ou du fait que l’ajout ait déjà été fait antérieurement. Quel type de code me permet de faire ca ??

Et il ne resteras que les problèmes de fusion (je me demande meme si une simple copie de la valeur suffirais, en sachant que j’ai quand meme besoin de conserver les formules des colonnes C, D et K)

Merci de ta précieuse aide !

C’est la bonne place, il faut juste que la ligne Option Explicit soit mise avant et non après.
Mais là, pour le moment je ne vois pas très bien à quoi elles servent.

Dim i as Long -> tu penses traiter plus de 32000 lignes ?
Dim Target as Integer -> ne définis pas de variable dont tu n’as pas besoin. D’autant plus que tu vas avoir besoin de Target dans le code de tes feuilles de calcul, mais comme Range, pas comme Integer.

Ce n’est pas une question de type de code, c’est une question de méthode :
A partir du moment où tu boucles pour explorer toutes les valeurs de la colonne E, et que tu fais le traitement sur chaque cellule, à chaque saisie tu vas rajouter des lignes partout. Ex : avec ce que tu as mis en ligne, ton traitement rajoute 2 lignes sous la ligne 7, mais aussi une ligne sous la ligne 3 et ce serait le cas pour toutes les lignes dont la colonne E serait remplie.
Ce qu’il faut, c’est identifier la cellule ayant subi le changement, vérifier qu’elle est dans la colonne E, et traiter uniquement cette ligne (pas de boucle)
Pour ce qui est de vérifier si la ligne en question a déjà fait l’objet d’un ajour, c’est un peu plus compliqué, mais ça peut se traiter plus tard, une fois que tout le reste fonctionne.

La fusion ne pose pas de problème particulier, il y a des fonctions pour ça.
Cela nécessite simplement des précautions particulières pour le reste du traitement.
C’est plus lorsque des cellules seront fusionnées et qu’il faudra passer par exemple de 2 à 3 lignes fusionnées que le problème sera plus délicat.

Dans ton exemple, tu montres les colonnes C et D fusionnées, ce qui détruit de fait le contenu des cellules qui ne sont plus apparentes.