Le problème était dû à la méthode de sélection des feuilles et au référencement des plages de cellules.
J'ai corrigé la macro Private Sub ReportUpdate_Click() et ça me semble fonctionner.
Tu remarqueras qu'au passage j'en ai profité pour simplifier grandement ta boucle de lecture de la colonne B:B. Il suffit en effet de balayer cette colonne et de lire la cellule adjacente en colonne C. Si cette cellule vaut 1 alors on valide une nouvelle ligne sinon rien : la boucle passe à la ligne suivante. De ce fait, la variable NouvLigne n'est plus utile, je l'ai passée en commentaire.
Je te laisse le soin de continuer sur la même idée dans la deuxième macro.
Merci pour le referencement des feuilles, je vais corriger ca dans l'autre macro.
Question comment apres avoir renomer une feuille tu peux savoir si c'est la feuille1, 2, 3...
En revanche en ce qui concerne la boucle elle est necessaire.
Car les valeurs des colones D a AS dans la feuille "Past the copy of PR Report here" ne sont pas forcement identiques a celle de la feuille "Report Updated" (c'est une mise a jour) donc necessite d'etre recopiees sur les lignes correspondante.
La colonne B etant le numero de demande d'achat
La colonne C etant le numero de ligne d'item de la demande d'achat
Les colonnes suivantes sont des infos relative a chaque ligne d'item; cotation, commande, prix, livraison....
Le rapport etant extrait toutes les semaines les infos dans chaques lignes changent et l'on a en plus des nouvelles demandes d'achat qui apparaissent.
Cette macro permet de metre a jour, a partir de l'extraction du rapport, une feuille de suivi dans la quelle le site emeteur des demandes peut rajouter des commentaires non existant dans le rapport d'origine (les 3 dernieres colonnes)
Au temps pour moi, je n'avais pas analysé ton code jusque dans ses moindres recoins. Ce n'est d'ailleurs pas toujours évident lorsqu'on en est l'auteur, alors à fortiori lorsqu'on ne l'est pas ! Tu as donc bien fait de conserver la boucle Do...Loop.
Pour répondre à ta question, je n'ai pas renommé les feuilles, j'ai simplement utilisé leur "codename" qui lui ne change pas si tu modifies le nom de la feuille. Et de plus, ça évite des erreurs de retranscription dans la macro. Ce codename est le nom écrit en premier dans le module Objets de la fenêtre de VBAProject, juste avant le nom de la feuille entre parenthèses.
Encore une question.
Pour la deuxieme macro. Le soucie est le suivant. Au debut du code je cree une copy de la feuille "Report Updated"
Comment nomer cette nouvelle feuille dans le code vu que le numero du book change en fonction du nombre de fois ou j'ouvre un nouveau document sur excel?
Private Sub DispatchCopy_Click()
Dim wb As Workbook
Sheets("Report Updated").Copy
Set wb = ActiveWorkbook
With wb.ActiveSheet
.Range("A1").EntireRow.Insert
.Range("A1") = "Purchase Requisition Details"
.Range("A1:J1").Merge
.Range("K1") = "Quotation Details"
.Range("K1:R1").Merge
.Range("S1") = "Purchase Order Details"
.Range("S1:AI1").Merge
.Range("AJ1") = "Purchasing Details"
.Range("AJ1:AS1").Merge
.Range("AT1") = "Rig Acknowledgment"
.Range("AT1:AV1").Merge
.Rows("1:1").Select
Selection.RowHeight = 30
Selection.Font.Bold = True
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
End With
.Range("A3").Select
End With
End Sub
Pour rappel : il est très souvent inutile de sélectionner des feuilles ou cellules pour y apporter des modifications. Cela permet d'augmenter la rapidité du code.
J'avais bien pense a une solution de ce genre... mais mon niveau VBA est assez faible voir tres faible et je n'arrivais pas a materialiser cette premiere partie du code.
Code:
Dim wb As Workbook
Sheets("Report Updated").Copy
Set wb = ActiveWorkbook
With wb.ActiveSheet
Encore un grand merci.
Slts
DRILL
ps: il ne faut jamais dire toutes ses pensees, de nos jours c'est un coup a finir en taule.
Le bon sens etant souvent materialise par des interdit.
J'avais bien pense a une solution de ce genre... mais mon niveau VBA est assez faible voir tres faible et je n'arrivais pas a materialiser cette premiere partie du code.
Code:
Dim wb As Workbook
Sheets("Report Updated").Copy
Set wb = ActiveWorkbook
With wb.ActiveSheet
Encore un grand merci.
Slts
DRILL
ps: il ne faut jamais dire toutes ses pensees, de nos jours c'est un coup a finir en taule.
Le bon sens etant souvent materialise par des interdit.
J'ai oublié de te donner quelques explications concernant le problème :
Ta macro étant contenue dans ton fichier source, il faut absolument activer le nouveau classeur créé pour pouvoir y accéder. En l'absence de quoi, la macro continue d'agir sur son propre contenant. C'est le sens principal de la modification de ton code, le reste n'étant qu'une simplification en retirant des instructions non indispensables.
Cordialement.
PS : merci pour ton post-scriptum qui répond à mon interrogation journalière (oups, j'ai encore dit ce que je pensais !)
Bien note et enregistre dans mes tablettes.
J'avais essaye au depart de creer un new workbook, le nomer et copier dedans la feuille source.... ce qui correspond a faire Paris Marseille en passant par Frankfurt et a vrai dire je voyage dejas beaucoup trop a mon gout.
Encore Merci,
DRILL
ps: Ton interrogation journalière n'a de réponse que dans ta propre conscience.
Pour ma part je m'efforce de suivre le principe suivant.
Penser noir et dire blanc ou vice et versa ne constitue pas un mensonge. Dans certain cas l'on appel ca être diplomate.
L'exercice de diplomatie passant souvent par l'abnégation de son propre fort intérieur, je préfère refaire le monde avec un bucheron plutôt qu’un vendeur d’aspirateurs. Celui n’ayant rien à me vendre, si je pense blanc ou noir il le sera.
Tu as raison, penser une chose et dire le contraire n'est pas en soi un mensonge; c'est masquer la vérité qui en est un. Personne ne nous oblige à dire notre vérité intérieure, donc on se trouve bien là avec un cas de conscience qui nous appartient.
Après cet aparté philosophique, que je suis heureux de partager avec toi, je viens t'apporter une simplification supplémentaire de ton code en supprimant la sélection de la ligne 1 :
Code:
Private Sub DispatchCopy_Click()
Dim wb As Workbook
Sheets("Report Updated").Copy
Set wb = ActiveWorkbook
With wb.ActiveSheet
.Range("A1").EntireRow.Insert
.Range("A1") = "Purchase Requisition Details"
.Range("A1:J1").Merge
.Range("K1") = "Quotation Details"
.Range("K1:R1").Merge
.Range("S1") = "Purchase Order Details"
.Range("S1:AI1").Merge
.Range("AJ1") = "Purchasing Details"
.Range("AJ1:AS1").Merge
.Range("AT1") = "Rig Acknowledgment"
.Range("AT1:AV1").Merge
With .Rows("1:1")
.RowHeight = 30
.Font.Bold = True
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
' .WrapText = False
' .Orientation = 0
' .AddIndent = False
' .IndentLevel = 0
' .ShrinkToFit = False
' .ReadingOrder = xlContext
End With
.Range("A3").Select
End With
End Sub
Ca rejoint le conseil que je te donnais dans un précédent message : pas besoin de sélectionner pour appliquer une action.
D'autre part, je me pose une question : le classeur ainsi créé est-il temporaire et tu l'effaces ou bien tu le sauvegarde ? Car, dans les deux cas, il est possible de le faire par la macro.
Le nouveau classeur est cree une foi par semaine et doit etre sauve (save as), meme nom de classeur a chaque fois avec juste le numero de semaine qui change.
Je laisse le soin au utilisateurs finaux de faire la manipe a la mano car il doivent le sauver dans un fichier sur un serveur partage a bords... je n'en connais ni le lien ni l'emplacement et connaissant les artistes a bords... cela risque de changer souvent.
La phylosophie est toujour agreable, elle permet l'echange et facilite le dialogue entre sourd et muet.