Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Erreur lors du déclenchement d'une macro par la macro d'un autre fichier

3 réponses
Avatar
frederic.bescond
Bonjour tout le monde,

D=E9sol=E9, c'est un peu long mais je pr=E9f=E8re =EAtre pr=E9cis
J'ai cr=E9e "devis.xls". Lorsque je le sauvegarde cela d=E9clenche
automatiquement un macro qui vient copier des info (comme le nom du
client, la date, le montant HT...) dans un fichier "d=E9tails
devis.xls", dans un feuillet "D=E9tails devis". Tout ceci fonctionne.

Ensuite j'ouvre un fichier "facture.xls", que j'entre le numero de
devis, il me retrouve (a l'aide de si et recherchev) les info. Lorsque
je le sauvegarde cela d=E9clenche automatiquement un macro qui vient
copier des info (comme le nom du client, la date, le montant HT...)
dans un fichier "Tableau_de_bord.xls", dans un feuillet "D=E9tail
projets". Tout ceci fonctionne.

Pour =E9viter la mise =E0 jour de plus en plus longue de facture.xls par
rapport =E0 devis (pour ceux qui ont perdu le fil conducteur c'est =E0
cause des SI et RECHERCHEV), j'ai tout simplement mis le feuillet
"d=E9tails devis" (du fichier "d=E9tails devis.xls") dans "facture.xls".

Mon soucis est le suivant: mes macro se d=E9clenche =E0 la sauvegarde des
fichiers "devis.xls" et "facture.xls".
Quand je sauvegarde devis.xls, cela lance la macro qui copie les infos
vers le feuillet "d=E9tails devis.xls" du fichier "facture.xls". Elle
copie et sauvegarde...du coup la macro du fichier "facture.xls" se
lance aussi.....
On arrive donc a une erreur d'=E9xecution '9' - Indice en dehors de la
plage.
Cette erreur intervient uniquement quand la proc=E9dure d=E9crite plus
est lanc=E9e.

Lorsque que j'ouvre facture.xls et que je sauvegarde, ma macro se lance
normalement et va sauvegarder mes info dans "Tableau_de_bord.xls".

C'est grave docteur? Est ce que quelqu'un a une id=E9e?

Je vous ai mis le code par la suite. Mille merci encore a RGI pour son
aide.

Fred



Sub sauvegarde()
Application.ScreenUpdating =3D False
lafacture =3D ActiveWorkbook.Name
ChDir ThisWorkbook.Path
Workbooks.Open FileName:=3D _
"Tableau_de_bord.xls", UpdateLinks:=3D0
Sheets("D=E9tail projets").Select
Range("a1").Select
derlig =3D Range("A5000").End(xlUp).Row + 1
derval =3D Range("A5000").End(xlUp).Row
valeur =3D Cells(derval, 1).Text
ActiveSheet.Cells.Find(what:=3Dvaleur, after:=3DActiveCell,
LookIn:=3DxlFormulas, lookat:=3DxlPart, _
searchorder:=3DxlByColumns, searchdirection:=3DxlNext, MatchCase:=3DFalse) _
.Activate
'MsgBox ActiveCell.Text
If ActiveCell.Text =3D
Workbooks(lafacture).Worksheets("Facture").[num_facture].Text Then
MsgBox "N=B0 Existe": GoTo existe
ActiveCell =3D Cells(derlig, 1).Select
GoSub op_sauv

fn:
ActiveWorkbook.Save
ActiveWorkbook.Close
Application.ScreenUpdating =3D True
Exit Sub

existe:
rep =3D MsgBox("Ce num=E9ro de facture est d=E9j=E0 enregistr=E9.
Voulez-vous ecraser les informations existantes? Si non, changez ce
num=E9ro.", vbYesNo, "Attention!")
If rep =3D vbYes Then

GoSub op_sauv
GoTo fn
End If


If rep =3D vbNo Then GoTo fn



op_sauv:

ActiveCell =3D
Workbooks(lafacture).Worksheets("Facture").[num_facture].Value
ActiveCell.Offset(0, 1) =3D
Workbooks(lafacture).Worksheets("Facture").[noms].Value
ActiveCell.Offset(0, 2) =3D
Workbooks(lafacture).Worksheets("Facture").[projet].Value
ActiveCell.Offset(0, 3) =3D
Workbooks(lafacture).Worksheets("Facture").[responsable].Value
ActiveCell.Offset(0, 5) =3D
Workbooks(lafacture).Worksheets("Facture").[date_d=E9but].Value
ActiveCell.Offset(0, 6) =3D
Workbooks(lafacture).Worksheets("Facture").[date_fin].Value
ActiveCell.Offset(0, 7) =3D
Workbooks(lafacture).Worksheets("Facture").[Total_H.T.].Value
Return

End Sub

3 réponses

Avatar
Patrick Penet
Bon, je ne sais pas si je vais être d'un grand secours:

J'ai développé un truc similaire au tien, à ceci près que
je n'y utilise pas la sauvegarde de classeur à la sauce
Excel (10 fois trop longue et lourde comme tu le dis).

Mais plutôt j'enregistre les données (elles sont rarement
très nombreuses) dans un fichier de type texte ou assimilé.

Avantage : c'est hyper rapide et le code n'est jamais
enregistré avec les données.

En fait, je me sert d'Excel uniquement comme un réceptacle
de données pour ses fonctions de calcul, formatage et d'impression.

L'applic est toujours sauvegardée vide, donc légère.

Elle a seulement deux feuilles :

-- Devis
On peut émettre autant de devis que voulu. Quand un devis
est accepté, alors une option permet d'éditer une facture.

-- Facture
Les données viennent du devis, mais on peut en ajouter si
des travaux supplémentaires ont été réalisés.

Je sais que cette structure d'applic est différente de celle
que tu as utilisée, mais elle est efficace et rapide.

Cordialement.
PP


a écrit dans le message de news:
Bonjour tout le monde,

Désolé, c'est un peu long mais je préfère être précis
J'ai crée "devis.xls". Lorsque je le sauvegarde cela déclenche
automatiquement un macro qui vient copier des info (comme le nom du
client, la date, le montant HT...) dans un fichier "détails
devis.xls", dans un feuillet "Détails devis". Tout ceci fonctionne.

Ensuite j'ouvre un fichier "facture.xls", que j'entre le numero de
devis, il me retrouve (a l'aide de si et recherchev) les info. Lorsque
je le sauvegarde cela déclenche automatiquement un macro qui vient
copier des info (comme le nom du client, la date, le montant HT...)
dans un fichier "Tableau_de_bord.xls", dans un feuillet "Détail
projets". Tout ceci fonctionne.

Pour éviter la mise à jour de plus en plus longue de facture.xls par
rapport à devis (pour ceux qui ont perdu le fil conducteur c'est à
cause des SI et RECHERCHEV), j'ai tout simplement mis le feuillet
"détails devis" (du fichier "détails devis.xls") dans "facture.xls".

Mon soucis est le suivant: mes macro se déclenche à la sauvegarde des
fichiers "devis.xls" et "facture.xls".
Quand je sauvegarde devis.xls, cela lance la macro qui copie les infos
vers le feuillet "détails devis.xls" du fichier "facture.xls". Elle
copie et sauvegarde...du coup la macro du fichier "facture.xls" se
lance aussi.....
On arrive donc a une erreur d'éxecution '9' - Indice en dehors de la
plage.
Cette erreur intervient uniquement quand la procédure décrite plus
est lancée.

Lorsque que j'ouvre facture.xls et que je sauvegarde, ma macro se lance
normalement et va sauvegarder mes info dans "Tableau_de_bord.xls".

C'est grave docteur? Est ce que quelqu'un a une idée?

Je vous ai mis le code par la suite. Mille merci encore a RGI pour son
aide.

Fred



Sub sauvegarde()
Application.ScreenUpdating = False
lafacture = ActiveWorkbook.Name
ChDir ThisWorkbook.Path
Workbooks.Open FileName:= _
"Tableau_de_bord.xls", UpdateLinks:=0
Sheets("Détail projets").Select
Range("a1").Select
derlig = Range("A5000").End(xlUp).Row + 1
derval = Range("A5000").End(xlUp).Row
valeur = Cells(derval, 1).Text
ActiveSheet.Cells.Find(what:=valeur, after:¬tiveCell,
LookIn:=xlFormulas, lookat:=xlPart, _
searchorder:=xlByColumns, searchdirection:=xlNext, MatchCase:úlse) _
.Activate
'MsgBox ActiveCell.Text
If ActiveCell.Text Workbooks(lafacture).Worksheets("Facture").[num_facture].Text Then
MsgBox "N° Existe": GoTo existe
ActiveCell = Cells(derlig, 1).Select
GoSub op_sauv

fn:
ActiveWorkbook.Save
ActiveWorkbook.Close
Application.ScreenUpdating = True
Exit Sub

existe:
rep = MsgBox("Ce numéro de facture est déjà enregistré.
Voulez-vous ecraser les informations existantes? Si non, changez ce
numéro.", vbYesNo, "Attention!")
If rep = vbYes Then

GoSub op_sauv
GoTo fn
End If


If rep = vbNo Then GoTo fn



op_sauv:

ActiveCell Workbooks(lafacture).Worksheets("Facture").[num_facture].Value
ActiveCell.Offset(0, 1) Workbooks(lafacture).Worksheets("Facture").[noms].Value
ActiveCell.Offset(0, 2) Workbooks(lafacture).Worksheets("Facture").[projet].Value
ActiveCell.Offset(0, 3) Workbooks(lafacture).Worksheets("Facture").[responsable].Value
ActiveCell.Offset(0, 5) Workbooks(lafacture).Worksheets("Facture").[date_début].Value
ActiveCell.Offset(0, 6) Workbooks(lafacture).Worksheets("Facture").[date_fin].Value
ActiveCell.Offset(0, 7) Workbooks(lafacture).Worksheets("Facture").[Total_H.T.].Value
Return

End Sub
Avatar
frederic.bescond
Salut Patrick,

Bravo pour ton courage (je veux bien entendu parler du pavé indigeste
que j'ai posé!) ;-)
Plus sérieusement, ton idée est intéressante à ceci pret que par la
suite, comme son nom l'indique, "Tableau_de_bord.xls" me sert à gérer
différentes tâches dans d'autres feuillets tels que la répartition
de la TVA, les commissions de commerciaux, l'évolution des objectifs,
la répartition de la marge et du CA par client...
A moins que je ne me trompe, je ne pense pas qu'il soit possible
d'effectuer ses tâches à partir d'un fichier comme le tiens?
Si ce n'est pas le cas, est-ce que quelqu'un a une autre idée?
Merci d'avance.

fred
Avatar
Patrick Penet
Si on peut tout faire avec cette structure d'applic.

Il faut simplement considérer l'applic comme un
conteneur-calculateur de données, avec autant de feuilles
que voulues et autant de macros que nécessaires pour
effectuer les tâches requises.

L'utilisateur ne sauvegarde jamais l'applic, il sauvegarde
les données calculées qui sont dedans dans un format
pseudo texte.

C'était juste pour dire que nul n'est contraint par
Excel de manipuler des fichiers Excel qui sont lourds
et lents (même avec un P4 cadencé à 3GHZ - ce que j'ai).

Evidemment c'est une option de développement que
l'on doit choisir au départ, et je ne sais pas si tu peux
"bifurquer" maintenant pour échapper à ton erreur 9.

Bon voilà. Plus si affinité.

Cordialement.
PP


a écrit dans le message de news:
Salut Patrick,

Bravo pour ton courage (je veux bien entendu parler du pavé indigeste
que j'ai posé!) ;-)
Plus sérieusement, ton idée est intéressante à ceci pret que par la
suite, comme son nom l'indique, "Tableau_de_bord.xls" me sert à gérer
différentes tâches dans d'autres feuillets tels que la répartition
de la TVA, les commissions de commerciaux, l'évolution des objectifs,
la répartition de la marge et du CA par client...
A moins que je ne me trompe, je ne pense pas qu'il soit possible
d'effectuer ses tâches à partir d'un fichier comme le tiens?
Si ce n'est pas le cas, est-ce que quelqu'un a une autre idée?
Merci d'avance.

fred