> Tous les forums > Forum Bureautique
 Amélioration d'une macro sous excel 97 ou 2003
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
MichelM37
  Posté le 30/08/2013 @ 09:28 
Aller en bas de la page 
Petit astucien

Bonjour,

Je profite de mes vacances pour essayer d'améliorer mon planning de travail .

J'ai lu des bouquins sur VBA et Excel et j'ai vu que ce que je voulais faire est possible.

Mais je ne sais pas comment m'y prendre . Pourriez vous m'aider s'il vous plait ?

Voici mon fichier: http://cjoint.com/?0HEjek8ZvR8

Attention je ne travaille qu'avec Excel 97 et je vais l'utiliser sur Excel 2003. Donc s'il vous plait afficher moi la macro car je ne peux pas ouvrir de fichier xlsm ou xlsx. Merci

Voici ce que jouhaiterais:

lorsque je remplis la colonne I par "o" ou "n" , je recopie toute la ligne (de "A" à "K"), dans la feuille qui correspond à l'intitulé

de la colonne "D"

la première macro fonctionne (ce n'est pas moi qui l'ai écrite, je l'ai juste adapté à mes besoins...), c'est celle que j'utilise actuellement.

Je continue quand même à travailler sur ce fichier ( ça fait 8 jours que je suis dessus ...)

Par avance je vous remercie .

Edit: 10:10



Modifié par MichelM37 le 30/08/2013 10:12
Publicité
ferrand
 Posté le 30/08/2013 à 16:20 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonjour,

Macro à mettre dans le module de la feuille 1 (Planning), en remplacement de tes divers essais [NB: effacer tout le code existant dans ce module avant d'y coller la macro ci-dessous]

Private Sub Worksheet_Change(ByVal Target As Range)
Dim n%, m%, nfc$
If Target.Column <> 9 Then Exit Sub
If Target.Value = "o" Or Target.Value = "n" Then
n = Target.Row
nfc = Me.Cells(n, 4).Value
With Worksheets(nfc)
m = .Range("A32000").End(xlUp).Row + 1
Me.Range("A" & n & ":K" & n).Copy .Range("A" & m)
End With
End If
End Sub

MichelM37
 Posté le 30/08/2013 à 16:39 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour et merci,

Mais je dois quand même conserver ma première macro, pour recopier ma ligne dans ma première feuille :

autrement puis je rajouter autant de feuilles que je veux (en conservant le même nom, bien sûr) ?

ferrand
 Posté le 30/08/2013 à 17:04 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Re,

La macro est une évènementielle, lancée par tout changement de valeur dans la feuille. Il ne peut par définition n'y en avoir qu'une !

Elle peut cependant faire diverses choses... Il faudrait donc que tu précises très exactement ce que faisait ta macro antérieure, sous quelles conditions, et l'on intègrera ces actions dans la macro programmée sur l'évènement "Change".

NB : pas compris ta questions sur le rajout de feuilles ! Ni les raisons qui te font dupliquer une ligne...



Modifié par ferrand le 30/08/2013 17:09
MichelM37
 Posté le 30/08/2013 à 18:41 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Voici ma macro d'origine:

Private Sub Worksheet_Change(ByVal Target As Range)

On Error GoTo rein

macol = 9

colacopier = 8

'Si on modifie une cellule autre que dans la colonne I ca ne fait rien

If Target.Column <> macol Then Exit Sub

'Si on saisi autre chose que n en colonne I ca ne fait rien (comme suppr par ex)

If Target.Value <> "n" Then Exit Sub

'Recuperation de la ligne ou on saisi n

RowSel = Target.Row

'Récuperation de la derniere ligne, ou 1ere ligne vide

Application.EnableEvents = False

Application.ScreenUpdating = False

Cells(RowSel + 1, 1).EntireRow.Insert

Range(Cells(RowSel, 1), Cells(RowSel, colacopier)).Select

Selection.Copy Cells(RowSel + 1, 1).Select

ActiveSheet.Paste

Application.CutCopyMode = False

rein:

Application.ScreenUpdating = True

Application.EnableEvents = True

End Sub

En fait cette macro me recopie la ligne en dessous si je mets "n" dans la colonne "I" .

Pour les feuilles, dans mon exemple, il n'y a que 4 feuilles, mais à teme je vais me retrouver avec une trentaine de feuille.

Je voulais donc savoir si cela posera un problème?

Pourriez vous,s'il vous plait, insérer des commentaires pour que je comprenne et que je puisse faire évoluer votre macro si nécessaire?

Encore merci de votre aide (je n'étais parti du tout de la bonne manière ).

ferrand
 Posté le 30/08/2013 à 20:11 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

MichelM37 a écrit :

En fait cette macro me recopie la ligne en dessous si je mets "n" dans la colonne "I" .

Pour les feuilles, dans mon exemple, il n'y a que 4 feuilles, mais à teme je vais me retrouver avec une trentaine de feuille.

Je voulais donc savoir si cela posera un problème?

J'ai bien vu que tu recopiais la ligne dans ta macro initiale ! Je ne vois pas la raison qui te conduit à avoir 2 lignes identiques sur Planning lorsque tu saisis "n" en colonne I ?

Le nombre de feuilles peut augmenter sans que cela pose problème. La macro prélève le nom de la feuille cible pour la copie en colonne D. Dès lors que les noms des feuilles correspondent aux noms mis en col. D, la macro continuera de fonctionner.

MichelM37
 Posté le 30/08/2013 à 20:57 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

C'est un planning de travail annuel (défini à l'avance avec ma maintenance préventive), tant que je n'ai pas fini mon travail, je remplis mon planning (date et nombre d'heure).

Si le travail est fini je mets "o", si le travail n'est pas fini, je mets "n".

Ainsi mon travail non fini reste affiché tant qu'il n'est pas fini.

J'ai créé un filtre automatique afin d'afficher la semaine de travail, et je mets vide dans la dernière colonne (Temps) afin d'avoir mon travail à effectuer.

J'espère que cela ne posera pas de problème.

Donc il faut que j'essaie d'intégrer les deux en une seule macro

ferrand
 Posté le 30/08/2013 à 21:48 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Je comprends bien la notion de fini ou non fini notée en colonne I, cependant qu'il soit fini ou non, en l'état de ce que tu fais, cela reste affichée sur la feuille planning, une fois si c'est fini, deux fois sur deux lignes consécutives si ce n'est pas fini.

Il y a donc quelque chose qui m'échappe !

MichelM37
 Posté le 30/08/2013 à 23:02 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Lorsque je remplis mon planning, j'inscris la date et le nombre d'heure effectué. Puis la ligne se recopie en dessous mais avec les cellules "Date" et "Temps",vide.

Donc avec le filtre automatique, je mets la colonne "Temps" sur vide. Alors je n'ai plus que des lignes "uniques" avec ce qu'il me reste à faire comme travail.

Mon vrai planning actuel, avec lequel je travaille est trop gros, pour que je puisse vous le transmettre, ce serait plus explicite.

ferrand
 Posté le 30/08/2013 à 23:47 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Essaie la macro modifiée suivante :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim n%, m%, nfc$
If Target.Column <> 9 Then Exit Sub
If Target.Value = "o" Or Target.Value = "n" Then
n = Target.Row
nfc = Me.Cells(n, 4).Value
With Worksheets(nfc)
m = .Range("A32000").End(xlUp).Row + 1
Me.Range("A" & n & ":K" & n).Copy .Range("A" & m)
End With
If Target.Value = "n" Then
Application.EnableEvents = False
With Me
.Rows(n + 1).Insert
.Range("A" & n & ":H" & n).Copy .Range("A" & n + 1)
End With
Application.EnableEvents = True
End If
Application.CutCopyMode = False
End If
End Sub

Commentaires:
- Déclaration de 3 variables (toujours préférable de déclarer ses variables !) : n et m de type Integer pour recueillir respectivement la ligne concernée de Planning et la ligne cible de la feuille à servir, nfc de type String pour recueillir le nom de la feuille cible.

-(ligne 3): aucune action si changement n'affecte pas la colonne I

-(ligne 4): action si valeur "o" ou "n" affectée en colonne I

-(ligne 5): recueil du numéro de ligne concernée de Planning (variable n)

-(ligne 6): affectation à variable nfc du nom de la feuille cible figurant en colonne D

- sur la feuille cible [ligne 7], on recueille le numéro de la première ligne vide, affecté à variable m [ligne 8]
NB: cette recherche est faite en col. A à partir de la ligne 32000 vers le haut ; si le planning devait dépasser 32000, remplacer "A32000" par "A65536" et modifier les déclarations de variables [ligne 2] n% et m% en n& et m& (type Long)

puis on copie la plage A à K (ligne n) de Planning pour la coller sur la feuille cible (ligne m) [ligne 9]

- si la valeur affectée (ayant lancée la macro) était "n" : action complémentaire [ligne 11]

- On suspend l'interception des évènements qui pourraient relancer la macro à tort [ligne 12]

- Sur Planning [ligne 13], on insère une ligne sous la ligne concernée [ligne 14] puis on copie la plage A à H (ligne n) pour la coller sur la ligne insérée [ligne 15]

- On rétablit l'interception des évènements [ligne 17] et on vide le presse-papier [ligne 19]. L'opération est terminée.

MichelM37
 Posté le 31/08/2013 à 09:49 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour,

Un grand merci, ça fonctionne .

Sauf que je n'avais pas prévu que dèsque je mets "o" et que je passe à la cellule suivante il m'a déjà recopié la ligne sur l'autre feuille.

Il va falloir que je m'adapte pour remplir mon planning .

J'essaie d'intégrer un message d'erreur en cas ou la feuille n'a pas été créé (Cas d'une nouvelle machine, en cours d'année...).

Ou voir si la feuille ne peut pas se créer toute seule.

ferrand
 Posté le 31/08/2013 à 11:09 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Salut !

Dès que tu valides "o" ou "n", la macro est exécutée ! C'est bien ce qui est recherché

Si la feuille cible n'a pas été créée, il se produira une erreur d'exécution 1004. A priori dans le contexte, il ne devrait pas y avoir d'autre élément produisant une erreur 1004, on peut donc l'intercepter et afficher un message ou/et créer la feuille manquante (de préférence par copie d'un modèle masqué comportant la mise en forme préalable commune de tes feuilles cibles.

Pour intercepter une erreur d'exécution :

If Target.Column <> 9 Then Exit Sub
On Error GoTo erreur

If Target.Value = "o" Or Target.Value = "n" Then

(...)

Application.CutCopyMode = False
End If
Exit Sub 'Ne pas oublier, pour que le gestionnaire d'erreurs n'intervienne qu'en cas d'erreur
erreur:
Select Case Err.Number 'Pour le cas ou une autre erreur se produirait
Case 1004
'On va copier feuille modèle nommée 'Machine' à la suite dernière feuille et la renommer
Worksheets("Machine").Copy after: Worksheets(ThisWorkbook.Worksheets.Count)
ActiveSheet.Name = nfc
Worksheets("Planning").Activate
Resume 'Pour revenir à l'exécution après mise en place feuille cible
Case Else
'On affiche un message en cas d'autre erreur pour l'identifier
MsgBox "L'erreur " & Err.Number & " s'est produite.", vbCritical, "Erreur inattendue"
End Select
End Sub

A tester (je n'ai fait que l'écrire dans le post) après avoir créé feuille modèle.

MichelM37
 Posté le 31/08/2013 à 18:06 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

L'ordre des instructions à une impoirtance dans la macro ?

J'étais bien parti avec:

"On Error GoTo erreur"

sauf que je le plaçais beaucoup plus bas dans la macro (là ou je croyais que l'erreur arrivée...)

mais j'essayais de continuer avec:

erreur:

select case number Case 1004

MsgBox "La feuille n'éxixte pas", vbInformation

Comme je ne m'en sortais pas , j'ai fini par incorporer la tienne

Mais j'ai eu une "erreur de compilation"

"utilisation incorecte de la propriété"

Worksheets("Machine").Copy after: Worksheets (thisWorkbook.Worksheets.Count)

En cherchant j'ai rajouté le "=" avant Woksheets (this....)

Mais maintenant j'ai une erreur inattendue: l'erreur 9 s'est produite

Et je ne trouve rien sur cette erreur

ferrand
 Posté le 01/09/2013 à 13:28 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Mais j'ai eu une "erreur de compilation"
"utilisation incorecte de la propriété"
Worksheets("Machine").Copy after: Worksheets (thisWorkbook.Worksheets.Count)
En cherchant j'ai rajouté le "=" avant Woksheets (this....)

Tu as très bien fait : un oubli de ma part en tapant !

Mais maintenant j'ai une erreur inattendue: l'erreur 9 s'est produite

Erreur 9 = L'indice n'appartient pas à la sélection. Se déclenche sur Worksheets(nfc) : l'indice (nom) nfc n'appartient pas à la collection de noms des feuilles du classeur... Mauvaise appréciation de ma part ! Ce n'est pas une erreur 1004 mais une erreur 9 qui se déclenche en cas d'absence de feuille cible. On va donc modifier en conséquence.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim n%, m%, nfc$
If Target.Column <> 9 Then Exit Sub
If Target.Value = "o" Or Target.Value = "n" Then
n = Target.Row
nfc = Me.Cells(n, 4).Value
On Error GoTo erreurfeuille
With Worksheets(nfc)
On Error GoTo 0
m = .Range("A32000").End(xlUp).Row + 1
Me.Range("A" & n & ":K" & n).Copy .Range("A" & m)
End With
If Target.Value = "n" Then
Application.EnableEvents = False
With Me
.Rows(n + 1).Insert
.Range("A" & n & ":H" & n).Copy .Range("A" & n + 1)
End With
Application.EnableEvents = True
End If
Application.CutCopyMode = False
End If
Exit Sub
erreurfeuille:
Worksheets("Machine").Copy after:=Worksheets(ThisWorkbook.Worksheets.Count)
ActiveSheet.Name = nfc
Worksheets("Planning").Activate
Resume
End Sub

Ici on ne cible que l'erreur sur Worksheets(nfc), significative de feuille manquante donc, pour créer ladite feuille et reprendre le cours de l'exécution.

Pour mieux voir (avec indentation) dans le fichier : http://cjoint.com/?CIbnBIkCGh5

MichelM37
 Posté le 04/09/2013 à 09:55 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour,

et encore Merci de te pencher sur mon problème .

Je ne vois aucun changement entre ta dernière proposition et la première .

Je n'ai pas de message d'erreur, mais je n'ai pas d'avertissement ou de création de feuille "nouvelle machine".

Je vois bien le:

- On error GoTo erreurfeuille

Mais je ne comprends pas le:

- On error GoTo 0

Dans le "erreurfeuille", tu commence par Worksheets ("Machine") , mais cette feuille n'éxiste pas {#}.

Je pensais pouvoir être capable d'y arriver tout seul, mais je vois que c'est plus compliqué que je le pensais .

MERCI.

ferrand
 Posté le 04/09/2013 à 11:45 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Je ne vois aucun changement entre ta dernière proposition et la première

Regarde mieux

Je n'ai pas de message d'erreur, mais je n'ai pas d'avertissement ou de création de feuille "nouvelle machine".

Normal ! Il n'y a pas de message

Je vois bien le:
- On error GoTo erreurfeuille
Mais je ne comprends pas le:
- On error GoTo 0

La seconde commande annule la première... Ce qui limite le recours au gestionnaire d'erreur aux erreurs survenant entre ces deux commandes. Soit uniquement sur : With Worksheets(nfc) , donc pratiquement sur l'erreur provoquée par le fait que la feuille appelée n'existe pas.

Dans le "erreurfeuille", tu commence par Worksheets ("Machine") , mais cette feuille n'éxiste pas

Le gestionnaire d'erreur crée une copie de la feuille "Machine" et lui donne le nom adéquat. Cela présuppose que la feuille "Machine" existe !!

Tu la trouveras dans le fichier joint à mon post précédent (elle est masquée car n'a nul besoin d'être visible). Je te conseille d'ouvrir ce fichier et de tester le fonctionnement de la macro pour les différents cas que tu as soulevé.

MichelM37
 Posté le 04/09/2013 à 14:19 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Je suis désolé, mais je vois les modifications dans la macro (ajout d'une feuille "Machine" et "Machine(2)" en 6 et 7, mais je ne vois pas de modification au niveau du résultat

La feuille se créer bien dans la macro, mais elle n'apparait pas dans le classeur .

ferrand
 Posté le 05/09/2013 à 12:01 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Petite correction du gestionnaire d'erreur :

erreurfeuille:
Worksheets("Machine").Copy after:=Worksheets(ThisWorkbook.Worksheets.Count)
With Worksheets(ThisWorkbook.Worksheets.Count)
.Visible = True
.Name = nfc
End With
Worksheets("Planning").Activate
Resume
End Sub

Pour la suite il te faudra un peu attendre (j'embarque aujourd'hui) que je soie arrivé à destination.

MichelM37
 Posté le 07/09/2013 à 14:55 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour,

J'espère que tu as fait un bon voyage...

C'est bon tout fonctionne

Un grand merci .

Je n'ai plus qu'à l'adapter à mon fichier.

Je vais essayer de faire une macro pour incrémenter mes interventions dans le planning et te dirais ce qu'il en est....

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour participer à la discussion.
Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !
Recevoir PC Astuces par e-mail


La Lettre quotidienne +226 000 inscrits
Avec l'actu, des logiciels, des applis, des astuces, des bons plans, ...

Les bonnes affaires
Une fois par semaine, un récap des meilleurs offres.

Les fonds d'écran
De jolies photos pour personnaliser votre bureau. Une fois par semaine.

Les nouveaux Bons Plans
Des notifications pour ne pas rater les bons plans publiés sur le site.

Les bons plans du moment PC Astuces

Tous les Bons Plans
Graveuse laser MECPOW X3 PRO 10W (41x40 cm) à 189 €
189 € 350 € -46%
@Geekbuying
Ecran 24 pouces Viewsonic VA2405 (FullHD, VA, 75 Hz, VGA/HDMI) à 84,99 €
84,99 € 99,99 € -15%
@Cdiscount
Boîtier externe Ugreen USB C pour disque dur ou SSD 2.5 pouces à 15,99 €
15,99 € 19,99 € -20%
@Amazon
Trépied de table Manfrotto PIXI à 17,99 €
17,99 € 29,69 € -39%
@Amazon
Nettoyeur à ultrasons Geekbes 22 L à 149 €
169 € 205 € -18%
@Geekbuying
Batterie portable Ugreen Nexode 100W 20 000 mAh (1xUSB C 100W PD, 1x USB C 45W PD, 1xUSB A 18W) à 44,79 €
44,79 € 79,99 € -44%
@Amazon

Sujets relatifs
macro sous excel 2007
Perte hyperliens Excel 2003 sous Vista Edition Familiale
Sous totaux avec Excel 2003
enregistrement partiel sous EXCEL 2003
Macro sous Excel 2010
Appeler une macro à partir d'une autre sous excel
Macro - Insérer une ligne vierge sous Excel 2007
LES FILTRES SOUS EXCEL 2003
numerotation dynamique sous excel(2003)
Problème de copier/coller sous Excel 2003
Plus de sujets relatifs à Amélioration d''une macro sous excel 97 ou 2003
 > Tous les forums > Forum Bureautique