Microsoft 365 macro générer nouveau document et remplissage auto d'1 historique : pb si plusieurs pages

chris63*

XLDnaute Nouveau
Bonjour à tous,

(pardon pour la longueur du titre, pas facile de résumer...)

Toujours dans la création de documents (devis, factures...), avec vos conseils, j'ai réussi à incrémenter les n°, mettre les infos voulues dans l'historique.

Jusque là tout va bien... si je ne dépasse pas les 15 lignes de mon "tableau de base" (pour ce document)

Évidemment, j'ai souvent besoin de rajouter des lignes et là, ça ne fonctionne plus... : mon historique ne reprend pas les infos voulues et le nouveau document "vierge" généré garde les infos des lignes supplémentaires du document précédent (suis je bien claire ? 🤔)

C'est évident puisque la macro est définie avec les cellules du tableau de base, mais y a t'il un code particulier qui pourrait arranger cela ?

Je vous joins les 2 fichiers, ce sera peut être plus parlant..

Merci :)
 

Pièces jointes

  • modèle devis2 macro tests.xlsm
    69.2 KB · Affichages: 6
  • modèle devis2 macro tests 2.xlsm
    70.1 KB · Affichages: 5
Solution
Bonjour @chris63*

Pour ton 1er pb :
Il faut remplacer 33 par 35
VB:
'Remise en place du devis normalisé
Dim NbLigSup&

If NbLig > 35 Then NbLigSup = NbLig - 18: Rows("18:" & NbLigSup).Delete shift:=xlUp

Pour le 2eme pb :
Il attend un nombre et quand tu mets "210017v2" c'est pour excel du texte et il ne peut pas rajouter 1
Le test se fait ici :
Code:
 If IsNumeric(.Range("D5").Value) = True Then .Range("D5").Value = .Range("D5").Value + 1
Si c'est un nombre on incrémente sinon tu le fais manuellement....

Le nouveau code modifié avec la correction des 2 pb...

VB:
Sub ARCHIVER()

Application.ScreenUpdating = False
Dim NbLig&, Ligne&
NbLig = Application.Match("TOTAL H.T", Range("C:C"), 0)...

Phil69970

XLDnaute Barbatruc
Bonjour @chris63* , le forum

Je te propose ceci :

VB:
Sub ARCHIVER()

Application.ScreenUpdating = False
Dim NbLig&, Ligne&
NbLig = Application.Match("TOTAL H.T", Range("C:C"), 0)

Ligne = Sheets("HISTORIQUE_DEVIS").Range("A2").End(xlDown).Row + 1

With Sheets("DEVIS")
    Sheets("HISTORIQUE_DEVIS").Range("A" & Ligne).Value = .Range("D5").Value
    Sheets("HISTORIQUE_DEVIS").Range("B" & Ligne).Value = .Range("D7").Value
    Sheets("HISTORIQUE_DEVIS").Range("C" & Ligne).Value = .Range("A8").Value
    Sheets("HISTORIQUE_DEVIS").Range("D" & Ligne).Value = .Range("D8").Value
    Sheets("HISTORIQUE_DEVIS").Range("E" & Ligne).Value = .Range("D" & NbLig).Value
   
    .Range("D7").ClearContents
    .Range("A8").ClearContents
    .Range("D8").ClearContents
    .Range("A18:C" & NbLig - 2).ClearContents
   
    .Range("D5").Value = .Range("D5").Value + 1
End With

End Sub

@Phil69970
 

Pièces jointes

  • Modèle devis V2.xlsm
    69.4 KB · Affichages: 10
Dernière édition:

chris63*

XLDnaute Nouveau
Bonjour @chris63* , le forum

Je te propose ceci :

VB:
Sub ARCHIVER()

Application.ScreenUpdating = False
Dim NbLig&, Ligne&
NbLig = Application.Match("TOTAL H.T", Range("C:C"), 0)

Ligne = Sheets("HISTORIQUE_DEVIS").Range("A2").End(xlDown).Row + 1

With Sheets("DEVIS")
    Sheets("HISTORIQUE_DEVIS").Range("A" & Ligne).Value = .Range("D5").Value
    Sheets("HISTORIQUE_DEVIS").Range("B" & Ligne).Value = .Range("D7").Value
    Sheets("HISTORIQUE_DEVIS").Range("C" & Ligne).Value = .Range("A8").Value
    Sheets("HISTORIQUE_DEVIS").Range("D" & Ligne).Value = .Range("D8").Value
    Sheets("HISTORIQUE_DEVIS").Range("E" & Ligne).Value = .Range("D" & NbLig).Value
 
    .Range("D7").ClearContents
    .Range("A8").ClearContents
    .Range("D8").ClearContents
    .Range("A18:C" & NbLig - 2).ClearContents
 
    .Range("D5").Value = .Range("D5").Value + 1
End With

End Sub

@Phil69970
Bonjour Phil69970,

Merci pour ta réponse, ça fonctionne bien !

Par contre, est-ce-qu'il est possible de demander à la macro (en étant très polie évidemment..) de faire ramener le tableau à sa taille initiale ? (A18:33) ?

Pour ne pas copier bêtement et puisque je vais devoir faire cette manip pour d'autres documents, j'ai encore qq questions (si j'abuse, faut me le dire ^^) :

- si j'ai bien compris, Application.ScreenUpdating = False : bloque le rafraichissement d'excel et permet de gagner du temps ?
(il ne faudrait pas mettre Application.ScreenUpdating = True, en fin de programme ?)

- Dim NbLig&, Ligne& : détermine la variable

- NbLig = Application.Match("TOTAL H.T", Range("C:C"), 0) : est un genre de rechercheV ?

- with sheets("DEVIS") : évite de répéter à chaque fois (super pratique !)

- Range("D"&NbLig) remplace ma cellule D35 par celle définie par l'Application.Match

- .Range("A18:C" & NbLig - 2).ClearContents : ça, je ne comprends pas...🤔

Merci :):)

 

Phil69970

XLDnaute Barbatruc
Bonjour @chris63*

1)- si j'ai bien compris, Application.ScreenUpdating = False : bloque le rafraichissement d'excel et permet de gagner du temps ?
1bis)- (il ne faudrait pas mettre Application.ScreenUpdating = True, en fin de programme ?)

2)- Dim NbLig&, Ligne& : détermine la variable

3)- NbLig = Application.Match("TOTAL H.T", Range("C:C"), 0) : est un genre de rechercheV ?

4)- with sheets("DEVIS") : évite de répéter à chaque fois (super pratique !)

5)- Range("D"&NbLig) remplace ma cellule D35 par celle définie par l'Application.Match

6)- .Range("A18:C" & NbLig - 2).ClearContents : ça, je ne comprends pas...🤔

***********​

1)-Oui
1bis)- Pas la peine excel remet tout dans l'ordre lui même mais c'est pas faux de lui dire mais c'est un peu un doublon.

2)-Oui

3)-Je pars du principe que tu peux (ou tu vas) rajouter des lignes à ton devis à tout moment .... et que ton Total HT est 2 lignes après la fin de tes lignes devis donc si je trouve la ligne Total H T et que j’enlève 2 lignes je trouve la fin de ton devis

4)-Oui

5)-Oui donc je sais ou se trouve mon Total H T,voir explication 3)

6)-NbLig c'est la ligne de mon Total H T et - 2 remonte 2 lignes plus haut donc ou se trouve la dernière ligne de mon devis. donc maintenant je sais toutes les lignes qui composent mon devis et je peux donc effacer la zone.

*Par contre, est-ce-qu'il est possible de demander à la macro (en étant très polie évidemment..) de faire ramener le tableau à sa taille initiale ? (A18:33) ?

Oui c’est possible donc : (si ton devis normal va de 18 à 33)
soit c'est en automatique il faut connaitre le début de ton devis qui est fixe (ligne 18) et la fin de ton devis qui lui est variable et par soustraction supprimer tout ce qui est en trop....(entre 33 et le trop...)
soit tu supprimes X lignes de ton devis.
Dans tous les cas il recalculeras la position de ton Total H T la prochaine fois.

@Phil69970
 

chris63*

XLDnaute Nouveau
Merci pour tes explications, J'ai presque tout compris :)

sauf ci-dessous (mais je vais essayer de gratter dès que j'ai un peu plus de temps)

3)- NbLig = Application.Match("TOTAL H.T", Range("C:C"), 0) : est un genre de rechercheV ?
3)-Je pars du principe que tu peux (ou tu vas) rajouter des lignes à ton devis à tout moment .... et que ton Total HT est 2 lignes après la fin de tes lignes devis donc si je trouve la ligne Total H T et que j’enlève 2 lignes je trouve la fin de ton devis


Range("C:C") représente la colonne C ?



*Par contre, est-ce-qu'il est possible de demander à la macro (en étant très polie évidemment..) de faire ramener le tableau à sa taille initiale ? (A18:33) ?

Oui c’est possible donc : (si ton devis normal va de 18 à 33)

oui, de 18 à 33

soit c'est en automatique il faut connaitre le début de ton devis qui est fixe (ligne 18) et la fin de ton devis qui lui est variable et par soustraction supprimer tout ce qui est en trop....(entre 33 et le trop...)

Ok, je vais tenter de trouver comment faire, sinon je reviendrai vers toi

Merci beaucoup et bonne journée ensoleillée !

Chris
 

Phil69970

XLDnaute Barbatruc
Re

@chris63* as tu réussi à faire le redimensionnement de ton devis ?
Ok, je vais tenter de trouver comment faire, sinon je reviendrai vers toi
;)
Sub ARCHIVER()

Application.ScreenUpdating = False
Dim NbLig&, Ligne&
NbLig = Application.Match("TOTAL H.T", Range("C:C"), 0)

Ligne = Sheets("HISTORIQUE_DEVIS").Range("A2").End(xlDown).Row + 1

With Sheets("DEVIS")
Sheets("HISTORIQUE_DEVIS").Range("A" & Ligne).Value = .Range("D5").Value
Sheets("HISTORIQUE_DEVIS").Range("B" & Ligne).Value = .Range("D7").Value
Sheets("HISTORIQUE_DEVIS").Range("C" & Ligne).Value = .Range("A8").Value
Sheets("HISTORIQUE_DEVIS").Range("D" & Ligne).Value = .Range("D8").Value
Sheets("HISTORIQUE_DEVIS").Range("E" & Ligne).Value = .Range("D" & NbLig).Value

.Range("D7").ClearContents
.Range("A8").ClearContents
.Range("D8").ClearContents
.Range("A18:C" & NbLig - 2).ClearContents

.Range("D5").Value = .Range("D5").Value + 1
End With

'Remise en place du devis normalisé
Dim NbLigSup&
If NbLig > 33 Then NbLigSup = NbLig - 18: Rows("18:" & NbLigSup).Delete shift:=xlUp

End Sub
🙃

Range("C:C") représente la colonne C ?
Oui c'est la colonne C

@Phil69970
 

chris63*

XLDnaute Nouveau
Re,
Je n'ai pas eu le temps.. (10 ans de docs papiers en tout genre (Et parfaitement bien mélangés ) à remettre en ordre dans le même temps 🙃)

Mais je vais essayer demain.. avant de regarder la solution sans doute ;-)

Bonne soirée !
 

chris63*

XLDnaute Nouveau
Re

@chris63* as tu réussi à faire le redimensionnement de ton devis ?

;)
Sub ARCHIVER()

Application.ScreenUpdating = False
Dim NbLig&, Ligne&
NbLig = Application.Match("TOTAL H.T", Range("C:C"), 0)

Ligne = Sheets("HISTORIQUE_DEVIS").Range("A2").End(xlDown).Row + 1

With Sheets("DEVIS")
Sheets("HISTORIQUE_DEVIS").Range("A" & Ligne).Value = .Range("D5").Value
Sheets("HISTORIQUE_DEVIS").Range("B" & Ligne).Value = .Range("D7").Value
Sheets("HISTORIQUE_DEVIS").Range("C" & Ligne).Value = .Range("A8").Value
Sheets("HISTORIQUE_DEVIS").Range("D" & Ligne).Value = .Range("D8").Value
Sheets("HISTORIQUE_DEVIS").Range("E" & Ligne).Value = .Range("D" & NbLig).Value

.Range("D7").ClearContents
.Range("A8").ClearContents
.Range("D8").ClearContents
.Range("A18:C" & NbLig - 2).ClearContents

.Range("D5").Value = .Range("D5").Value + 1
End With

'Remise en place du devis normalisé
Dim NbLigSup&
If NbLig > 33 Then NbLigSup = NbLig - 18: Rows("18:" & NbLigSup).Delete shift:=xlUp

End Sub
🙃


Oui c'est la colonne C

@Phil69970
Bonjour Phil69970

J'ai craqué et regardé ton code 🙃 . C'est impeccable, merci !!

J'avais ce genre de chose en tête mais comme je n'ai aucune base du "vocabulaire" VBA... (je vais réussir à trouver le temps de suivre les tutos, je vais réussir à trouver le temps de suivre les tutos, je vais réussir à trouver le temps de suivre les tutos....)


Encore juste une ptite question ^^ : je ne comprend pas pourquoi utiliser la colonne C dans ce code 🤔


Range("C:C") représente la colonne C ?

Oui c'est la colonne C


Merci et bonne journée

Chris
 

chris63*

XLDnaute Nouveau
Bonjour à tous,

J'ai un petit souci avec la macro :

cette fenêtre de débogage apparait à chaque fois. Je dois réinitialiser et ensuite, le tableau d'historique se remplit correctement. Avez-vous une idée du problème ?
1618907685347.png


--------------------------------
Autre questionnement : j'ai souvent des versions 2 (voire 3) d'un devis, que j’aimerais renommer 2100117V2 ou 2100117A par exemple.
Évidemment, j'ai un message d'erreur et l'incrémentation ne se fait pas. C'est logique mais existe-t’il un moyen de contourner cela autrement que de manière manuelle ?
(par contre, l'historique se remplit auto si je réinitialise)

1618908381434.png


Merci d'avance :)

Chris
 

Pièces jointes

  • modèle devis2 macro tests 2.xlsm
    70.2 KB · Affichages: 4

Phil69970

XLDnaute Barbatruc
Bonjour @chris63*

Pour ton 1er pb :
Il faut remplacer 33 par 35
VB:
'Remise en place du devis normalisé
Dim NbLigSup&

If NbLig > 35 Then NbLigSup = NbLig - 18: Rows("18:" & NbLigSup).Delete shift:=xlUp

Pour le 2eme pb :
Il attend un nombre et quand tu mets "210017v2" c'est pour excel du texte et il ne peut pas rajouter 1
Le test se fait ici :
Code:
 If IsNumeric(.Range("D5").Value) = True Then .Range("D5").Value = .Range("D5").Value + 1
Si c'est un nombre on incrémente sinon tu le fais manuellement....

Le nouveau code modifié avec la correction des 2 pb...

VB:
Sub ARCHIVER()

Application.ScreenUpdating = False
Dim NbLig&, Ligne&
NbLig = Application.Match("TOTAL H.T", Range("C:C"), 0)

Ligne = Sheets("HISTORIQUE_DEVIS").Range("A2").End(xlDown).Row + 1

With Sheets("DEVIS")
    Sheets("HISTORIQUE_DEVIS").Range("A" & Ligne).Value = .Range("D5").Value
    Sheets("HISTORIQUE_DEVIS").Range("B" & Ligne).Value = .Range("D7").Value
    Sheets("HISTORIQUE_DEVIS").Range("C" & Ligne).Value = .Range("A8").Value
    Sheets("HISTORIQUE_DEVIS").Range("D" & Ligne).Value = .Range("D8").Value
    Sheets("HISTORIQUE_DEVIS").Range("E" & Ligne).Value = .Range("D" & NbLig).Value

    .Range("D7").ClearContents
    .Range("A8").ClearContents
    .Range("D8").ClearContents
    .Range("A18:C" & NbLig - 2).ClearContents

    If IsNumeric(.Range("D5").Value) = True Then .Range("D5").Value = .Range("D5").Value + 1

End With

'Remise en place du devis normalisé
Dim NbLigSup&

If NbLig > 35 Then NbLigSup = NbLig - 18: Rows("18:" & NbLigSup).Delete shift:=xlUp
End Sub

@Phil69970
 
Dernière édition:

chris63*

XLDnaute Nouveau
Bonjour @Phil69970 ,

Merci pour ta réponse rapide ^^

Pour le 1er pb, je ne sais pas pourquoi j'ai mis 33 .. 🙄

Pour le 2ème, je me doutais un peu qu'il faudrait passer par du manuel.. (il faut bien bosser un peu !)
Toutefois ( 😁), est-ce-qu'il y a un moyen de faire en sorte que le devis 2100117v2 puisse aller se "ranger" après le 2100117 dans l'historique (même si j'en suis à 2100122 par exemple) ?

(question subsidiaire : j'ai commencé le même genre de macro pour les factures. Évidemment, j'ai qq bugs.. je reviens poser mes questions sur ce post ou j'en ouvre un autre ?)

Merci encore et belle journée ensoleillée :)

Chris
 

Phil69970

XLDnaute Barbatruc
@chris63*

C'est moi qui est mal recopié ....o_O
je ne sais pas pourquoi j'ai mis 33


A priori faire un tri avec du texte et des nombres excel ne sait pas faire.
Par contre la copie dans l'historique se fait bien mais le devis se rajoute à la suite donc si tu es au 2100122 le 210017v2 sera après et si tu fais un tri c'est pire car excel classe les nombres ensembles et les textes ensembles donc séparés.
est-ce-qu'il y a un moyen de faire en sorte que le devis 2100117v2 puisse aller se "ranger" après le 2100117 dans l'historique (même si j'en suis à 2100122 par exemple) ?


La logique est que chaque question correspond à un post donc la logique est d'ouvrir un nouveau post avec ton nouveau problème.
(question subsidiaire : j'ai commencé le même genre de macro pour les factures. Évidemment, j'ai qq bugs.. je reviens poser mes questions sur ce post ou j'en ouvre un autre ?)
De plus :
Valider une solution n'est pas obligatoire mais c'est un plus pour la communauté et me semble assez logique que tu indiques à tout le monde la solution que tu as retenue et même si c'est une autre solution trouvé ailleurs ..... et qui peut aider quelqu'un d'autre....

La validation d'une solution permet à un futur lecteur qui a le même problème de voir tout de suite quelle solution que le demandeur à retenue par rapport à la question posé. Et accessoirement permet aux autres membres de savoir qu'une solution a été trouvée.

@Phil69970
 

chris63*

XLDnaute Nouveau
C'est moi qui est mal recopié ....

Trop de questions de ma part !
_____________
A priori faire un tri avec du texte et des nombres excel ne sait pas faire.
Par contre la copie dans l'historique se fait bien mais le devis se rajoute à la suite donc si tu es au 2100122 le 210017v2 sera après et si tu fais un tri c'est pire car excel classe les nombres ensembles et les textes ensembles donc séparés.


ok, c'est noté, je ferai manuellement ^^
______________
La validation d'une solution permet à un futur lecteur qui a le même problème de voir tout de suite quelle solution que le demandeur à retenue par rapport à la question posé. Et accessoirement permet aux autres membres de savoir qu'une solution a été trouvée.

Bien sûr ! Toutes les solutions proposées sont bonnes.. je vais devoir choisir ;-)

Merci encore et belle journée :)

Chris
 

chris63*

XLDnaute Nouveau
Bonjour le forum,

je pose ma question sur ce fil, puisque mon problème s'en rapproche

En m'inspirant de la solution ci-dessus, j'essaie d'archiver des infos et générer un nouveau tableau vierge.

La macro a fonctionné parfaitement pour les premières données, mais pas pour les suivantes

Avez vous une idée du problème ?

Ci-joint mon fichier.

Merci d'avance et bonne journée :)

Chris
 

Pièces jointes

  • Tableau de margev2.xlsm
    23.3 KB · Affichages: 6

Statistiques des forums

Discussions
312 230
Messages
2 086 427
Membres
103 207
dernier inscrit
Michel67