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

[VBA] Erreur de code

15 réponses
Avatar
Patrick Bastard
Bonsoir à toutes et tous.

J'ai tenté de modifier ce code provenant de Denis Michon, Rural Thierry et
de Frédéric Sigonneau pour, qu'à partir de la feuille de départ sur laquelle
je le lance, un duplicata se crée pour chaque jour du mois (mêmes formules,
mêmes mises en forme sur les 5 premières colonnes).

********************************
Extrait :
'Ajoute les feuilles.
Err = 0
For A = LastDay To 1 Step -1
Columns("A:E").Select.Copy
Sheets.Add.Paste
Set Sh = Sheets.Add
Sh.Name = Format(DateSerial(Annee, LeMois, A), "dd-mm-yyyy")
If Err <> 0 Then
Application.DisplayAlerts = False
Sh.Delete
Err = 0
End If
Next
Application.DisplayAlerts = True
Set Sh = Nothing
End Sub
*******************************
Qui peut me dire ce qui cloche ?

Merci et bon WE à vous.


--
Bien cordialement,
=====================================
P. Bastard.
Pour me contacter, remplacez "Chez" par @ dans l'adresse

Une foule de conseils utiles sur le site de Misange :
http://www.excelabo.net

10 réponses

1 2
Avatar
michdenis
Bonjour Patrick,

As-tu essayé ceci :

Dim Rg As Range, Sh As Worksheet
Dim AcName As String

AcName = ActiveSheet.Name
With Worksheets("Feuil1")
Set Rg = .Columns("A:E")
End With
On Error Resume Next
Application.ScreenUpdating = False
If Err <> 0 Then Err = 0
For A = 5 To 1 Step -1
Set Sh = Sheets.Add(After:=Worksheets(Worksheets.Count))
With Sh
Rg.Copy .Range("A1")
.Name = Format(DateSerial(Annee, LeMois, A), "dd-mm-yyyy")
If Err <> 0 Then
Err = 0
Application.DisplayAlerts = False
Sh.Delete
Application.DisplayAlerts = True
End If
End With
Next
Worksheets(AcName).Select
Set Sh = Nothing: Set Rg = Nothing


Salutations!




"Patrick Bastard" <bastardp"chez"free.fr> a écrit dans le message de news:
Bonsoir à toutes et tous.

J'ai tenté de modifier ce code provenant de Denis Michon, Rural Thierry et
de Frédéric Sigonneau pour, qu'à partir de la feuille de départ sur laquelle
je le lance, un duplicata se crée pour chaque jour du mois (mêmes formules,
mêmes mises en forme sur les 5 premières colonnes).

********************************
Extrait :
'Ajoute les feuilles.
Err = 0
For A = LastDay To 1 Step -1
Columns("A:E").Select.Copy
Sheets.Add.Paste
Set Sh = Sheets.Add
Sh.Name = Format(DateSerial(Annee, LeMois, A), "dd-mm-yyyy")
If Err <> 0 Then
Application.DisplayAlerts = False
Sh.Delete
Err = 0
End If
Next
Application.DisplayAlerts = True
Set Sh = Nothing
End Sub
*******************************
Qui peut me dire ce qui cloche ?

Merci et bon WE à vous.


--
Bien cordialement,
==================================== P. Bastard.
Pour me contacter, remplacez "Chez" par @ dans l'adresse

Une foule de conseils utiles sur le site de Misange :
http://www.excelabo.net
Avatar
Patrick Bastard
Bonsoir, *Denis*.

Je regarde, j'essaie d'adapter et je te tiens informé.

Et Merci,

Bien cordialement,

Patrick.


Bonjour Patrick,

As-tu essayé ceci :

Dim Rg As Range, Sh As Worksheet
Dim AcName As String

AcName = ActiveSheet.Name
With Worksheets("Feuil1")
Set Rg = .Columns("A:E")
End With
On Error Resume Next
Application.ScreenUpdating = False
If Err <> 0 Then Err = 0
For A = 5 To 1 Step -1
Set Sh = Sheets.Add(After:=Worksheets(Worksheets.Count))
With Sh
Rg.Copy .Range("A1")
.Name = Format(DateSerial(Annee, LeMois, A), "dd-mm-yyyy")
If Err <> 0 Then
Err = 0
Application.DisplayAlerts = False
Sh.Delete
Application.DisplayAlerts = True
End If
End With
Next
Worksheets(AcName).Select
Set Sh = Nothing: Set Rg = Nothing


Salutations!




"Patrick Bastard" <bastardp"chez"free.fr> a écrit dans le message de
news: Bonsoir à toutes et
tous.

J'ai tenté de modifier ce code provenant de Denis Michon, Rural
Thierry et
de Frédéric Sigonneau pour, qu'à partir de la feuille de départ sur
laquelle
je le lance, un duplicata se crée pour chaque jour du mois (mêmes
formules,
mêmes mises en forme sur les 5 premières colonnes).

********************************
Extrait :
'Ajoute les feuilles.
Err = 0
For A = LastDay To 1 Step -1
Columns("A:E").Select.Copy
Sheets.Add.Paste
Set Sh = Sheets.Add
Sh.Name = Format(DateSerial(Annee, LeMois, A), "dd-mm-yyyy")
If Err <> 0 Then
Application.DisplayAlerts = False
Sh.Delete
Err = 0
End If
Next
Application.DisplayAlerts = True
Set Sh = Nothing
End Sub
*******************************
Qui peut me dire ce qui cloche ?

Merci et bon WE à vous.


Avatar
Patrick Bastard
Re-bonsoir, *Denis*.

Galère, galère..

Je te remercie pour le code que tu m'as transmis, et qui fonctionne
parfaitement :
je joins la sub au complet ci-dessous.

J'ai cependant un problème :
Le but final de mes errements est de créer un classeur, ou chaque feuille
journalière serait le reflet exact de la feuille "Modèle", et ensuite
consolider toutes ces feuilles sur une feuille "récap mensuelle".
Je pensais qu'un copier-coller suffisait, mais les MEFC, les validations et
les protections ne sont pas copiées. Je ne parle même pas des éventuels
objets (zones de texte par exemple)...

Je sens que je vais passer une bonne partie de mon week-end sur Excelabo.
Ca tombe bien : il ne va pas faire beau...

Bonne nuit à vous tou(te)s

Patrick.
************************************************************

'créer dans un classeur une feuille pour chaque jour
'd'un mois donné.
'd'après mpfe (Denis Michon, rural thierry, fs)

Sub AjouterFeuille()

'Définition des variables
Dim MaDate As Variant
Dim Sh As Worksheet
Dim LastDay As Integer
Dim Annee As Integer
Dim LeMois As Integer
Dim A As Integer
Dim Rg As Range
Dim AcName As String

On Error Resume Next
Application.ScreenUpdating = False

'Demande à l'usager le mois.
Do
MaDate = InputBox("Entrez une date du mois pour lequel il faut" &
vbLf & _
"créer une feuille pour chacun des jours." & vbLf
& vbLf & _
"Exemple : 1/2/2001", "Une feuille par jour")
'Si l'usager annule l'opération
If MaDate = "" Then Exit Sub
Loop While InStr(1, MaDate, "/") = 0

Annee = Year(MaDate)
LeMois = Month(MaDate)

'Détermine la dernière journée du mois choisi.
LastDay = Day(DateSerial(Annee, LeMois + 1, 0))

AcName = ActiveSheet.Name

'Ajoute les feuilles.
With Worksheets("Modèle")
Set Rg = .Columns("A:E")
End With
On Error Resume Next
Application.ScreenUpdating = False
'If Err <> 0 Then Err = 0
For A = LastDay To 1 Step -1
Set Sh = Sheets.Add(before:=Worksheets(Worksheets.Count))
With Sh
Rg.Copy .Range("A1")
.Name = Format(DateSerial(Annee, LeMois, A), "dd-mm-yyyy")
If Err <> 0 Then
Err = 0
End If
End With
Next
Application.DisplayAlerts = True
Set Sh = Nothing

End Sub
Avatar
Patrick Bastard
Bonjour à tous

Je m'en sors petit à petit, tant bien que mal :

Créer un classeur mensuel avec une feuille par jour à partir d'un modèle en
reprenant mise en forme, validation, objets etc...

Mon classeur de départ : 3 onglets : "Premier", "Modèle" et "Total"
"Premier "est la solution que j'ai trouvée pour consolider dans "Total
"toutes les feuilles qui seront créées : =(SOMME(Premier:Modèle!A3) ou
=(NBVAL(Premier:Modèle!A3)

Le bout de code ci-dessous fonctionne :-) quand les feuilles Premier et
Modèle sont affichées, mais *ne fonctionne pas* :-( lorsqu'elles sont
masquées :

'Boucle pour copier"Modèle" autant de fois qu'il y a de jours.
'Et renomme chaque feuille avec la date.
For A = 1 To LastDay Step 1
Sheets("Modèle").Select
Sheets("Modèle").Copy Before:=Sheets("Modèle")
Set Sh = Worksheets(Worksheets.Count - 2)
With Sh
.Visible = True
.Name = Format(DateSerial(Annee, LeMois, A), "ddd dd-mm-yy")
If Err <> 0 Then
Err = 0
End If
End With
Next

Un grand merci donc à qui voudra bien m'expliquer comment paramétrer Copy
Before et Worksheets.Count
pour que mes feuilles créées soient correctement nommées, soient placées
entre"Premier" et "Modèle", et restent visibles !!!

Question subsidiaire pour les gagnants : quelle différence entre
Sheets.Count et Worksheets.Count.

Désolé si ces questions sont basiques, mais je persiste à débuter en VBA.

PS : je pense que le classeur terminé pourrait être utile à d'autres, et je
le soumettrai à Misange.

Cordialement,

Patrick
Avatar
Patrick Bastard
Y sont oû, les chaouches ?

Semblerait que ma question ne déclanche pas les polémiques...

;-)

Patrick
Avatar
sabatier
demande a joël et à jacky, patrick : ils adorent échanger et s'ils prennent
ta ficelle en main (ou sous le bras, comme la baguette), tu vas vite leur
dire de ne plus écrire au contraire....z'arrêtent pu....
jps

"Patrick Bastard" <bastardp"chez"free.fr> a écrit dans le message de
news:
Y sont oû, les chaouches ?

Semblerait que ma question ne déclanche pas les polémiques...

;-)

Patrick




Avatar
Patrick Bastard
Merci du conseil, Jean-Paul.

Je me suis tellement éreinté sur ce problème (enregistrer, modifier, tester,
vérifier que ça marche pô, fermer, ré-ouvrir, modifier,...)que je me suis
même commis à le soumettre sur microsoft.public.excel, moi qui n'ai pas
pratiqué la langue de Shakespeare depuis... Ah, quand même!!!
:-(

demande a joël et à jacky, patrick : ils adorent échanger et s'ils
prennent ta ficelle en main (ou sous le bras, comme la baguette), tu
vas vite leur dire de ne plus écrire au contraire....z'arrêtent pu....
jps

"Patrick Bastard" <bastardp"chez"free.fr> a écrit dans le message de
news:
Y sont oû, les chaouches ?

Semblerait que ma question ne déclanche pas les polémiques...

;-)

Patrick




Avatar
Alain CROS
Bonjour.

Ce code génére 3 feuilles avec les feuilles "Premier" et "Modèle" masquées.

Sub Ajout()
Dim LastDay&, A&, Sh As Worksheet, Annee&, LeMois&, LeNom$, ElNom$
LastDay = 3&
Annee = 4&
LeMois = 11&
LeNom = Worksheets(1&).Name
'Boucle pour copier"Modèle" autant de fois qu'il y a de jours.
'Et renomme chaque feuille avec la date.
For A = 1& To LastDay
Worksheets("Modèle").Copy Worksheets("Total")
Set Sh = Worksheets(Worksheets.Count - 1&)
With Sh
ElNom = Format(DateSerial(Annee, LeMois, A), "ddd dd-mm-yy")
.Name = ElNom
.Move , Worksheets(LeNom)
.Visible = xlSheetVisible
LeNom = ElNom
End With
Next
Set Sh = Nothing
End Sub

Pour la question subsidiaire :
Insére une feuille graphique dans ton classeur puis lance cette macro.

Sub SheetsCount_OU_WorksheetsCount()
MsgBox "Worksheets.Count = " & Worksheets.Count & vbNewLine & _
vbNewLine & "Sheets.Count = " & Sheets.Count
End Sub

Alain CROS

"Patrick Bastard" <bastardp"chez"free.fr> a écrit dans le message de news: #
Bonjour à tous

Je m'en sors petit à petit, tant bien que mal :

Créer un classeur mensuel avec une feuille par jour à partir d'un modèle en
reprenant mise en forme, validation, objets etc...

Mon classeur de départ : 3 onglets : "Premier", "Modèle" et "Total"
"Premier "est la solution que j'ai trouvée pour consolider dans "Total
"toutes les feuilles qui seront créées : =(SOMME(Premier:Modèle!A3) ou
=(NBVAL(Premier:Modèle!A3)

Le bout de code ci-dessous fonctionne :-) quand les feuilles Premier et
Modèle sont affichées, mais *ne fonctionne pas* :-( lorsqu'elles sont
masquées :

'Boucle pour copier"Modèle" autant de fois qu'il y a de jours.
'Et renomme chaque feuille avec la date.
For A = 1 To LastDay Step 1
Sheets("Modèle").Select
Sheets("Modèle").Copy Before:=Sheets("Modèle")
Set Sh = Worksheets(Worksheets.Count - 2)
With Sh
.Visible = True
.Name = Format(DateSerial(Annee, LeMois, A), "ddd dd-mm-yy")
If Err <> 0 Then
Err = 0
End If
End With
Next

Un grand merci donc à qui voudra bien m'expliquer comment paramétrer Copy
Before et Worksheets.Count
pour que mes feuilles créées soient correctement nommées, soient placées
entre"Premier" et "Modèle", et restent visibles !!!

Question subsidiaire pour les gagnants : quelle différence entre
Sheets.Count et Worksheets.Count.

Désolé si ces questions sont basiques, mais je persiste à débuter en VBA.

PS : je pense que le classeur terminé pourrait être utile à d'autres, et je
le soumettrai à Misange.

Cordialement,

Patrick




Avatar
michdenis
Bonjour Patrick,

Ce code génère un nouveau classeur ayant toutes les feuilles du mois basé sur une feuille "Modèle" existant dans le
classeur où tu mettras cette macro.

'----------------------------------------
Sub AjouterFeuille()

'Définition des variables
Dim Wk As Workbook, NewWk As Workbook
Dim MaDate As Variant
Dim LastDay As Integer, Annee As Integer
Dim LeMois As Integer, A As Integer
Dim AcName As String

Application.ScreenUpdating = False

'Demande à l'usager le mois.
Do
MaDate = InputBox("Entrez une date du mois pour " & _
"lequel il faut créer une feuille pour " & _
"chacun des jours." & vbLf & vbLf & _
"Exemple : 1/2/2001", "Une feuille par jour")
'Si l'usager annule l'opération
If MaDate = "" Then Exit Sub
If Not IsDate(MaDate) Then
MsgBox "La donnée saisie ne représente " & _
"pas un format date reconnu par excel."
End If
Loop Until IsDate(MaDate) Or MaDate = "" = True

MaDate = Format(MaDate, "dd-mm-yy")
Annee = Year(MaDate)
LeMois = Month(MaDate)
'Détermine la dernière journée du mois choisi.
LastDay = Day(DateSerial(Annee, LeMois + 1, 0))

AcName = ThisWorkbook.Name

Set Wk = ThisWorkbook
Set NewWk = Workbooks.Add(-4167)
'Ajoute les feuilles.
For A = 1 To LastDay
With NewWk
Wk.Worksheets("Modèle").Copy _
after:=NewWk.Worksheets(NewWk.Worksheets.Count)
.ActiveSheet.Name = Format(DateSerial(Annee, _
LeMois, A), "dd-mm-yyyy")
End With
Next
Application.DisplayAlerts = False
With NewWk
.Worksheets("Feuil1").Delete
.Worksheets(1).Activate
End With

Workbooks(AcName).Activate
Application.DisplayAlerts = False

End Sub
'----------------------------------------


Salutations!




"Patrick Bastard" <bastardp"chez"free.fr> a écrit dans le message de news: %
Bonjour à tous

Je m'en sors petit à petit, tant bien que mal :

Créer un classeur mensuel avec une feuille par jour à partir d'un modèle en
reprenant mise en forme, validation, objets etc...

Mon classeur de départ : 3 onglets : "Premier", "Modèle" et "Total"
"Premier "est la solution que j'ai trouvée pour consolider dans "Total
"toutes les feuilles qui seront créées : =(SOMME(Premier:Modèle!A3) ou
=(NBVAL(Premier:Modèle!A3)

Le bout de code ci-dessous fonctionne :-) quand les feuilles Premier et
Modèle sont affichées, mais *ne fonctionne pas* :-( lorsqu'elles sont
masquées :

'Boucle pour copier"Modèle" autant de fois qu'il y a de jours.
'Et renomme chaque feuille avec la date.
For A = 1 To LastDay Step 1
Sheets("Modèle").Select
Sheets("Modèle").Copy Before:=Sheets("Modèle")
Set Sh = Worksheets(Worksheets.Count - 2)
With Sh
.Visible = True
.Name = Format(DateSerial(Annee, LeMois, A), "ddd dd-mm-yy")
If Err <> 0 Then
Err = 0
End If
End With
Next

Un grand merci donc à qui voudra bien m'expliquer comment paramétrer Copy
Before et Worksheets.Count
pour que mes feuilles créées soient correctement nommées, soient placées
entre"Premier" et "Modèle", et restent visibles !!!

Question subsidiaire pour les gagnants : quelle différence entre
Sheets.Count et Worksheets.Count.

Désolé si ces questions sont basiques, mais je persiste à débuter en VBA.

PS : je pense que le classeur terminé pourrait être utile à d'autres, et je
le soumettrai à Misange.

Cordialement,

Patrick
Avatar
Patrick Bastard
Bonsoir, *Alain *.


Et merci de ton aide.
Ton code fonctionne.
Il génère bien et nomme correctement les feuilles quand Premier et Modèle
sont masqués. ;-)
Cependant les feuilles créées sont placées après les feuilles masquées,
alors que je souhaite qu'elles soient placées entre ces feuilles (pour que
les formules déjà placées dans Total prennent en compte toutes les feuilles
créées). :-(

Toute autre suggestion est bien entendue la bienvenue.

Pour ce qui est de ta réponse à la "question subsidiaire", j'y retourne et
je te dis.

--
Bien cordialement,
==================================== P. Bastard.
Pour me contacter, remplacez "Chez" par @ dans l'adresse




Bonjour.

Ce code génére 3 feuilles avec les feuilles "Premier" et "Modèle"
masquées.

Sub Ajout()
Dim LastDay&, A&, Sh As Worksheet, Annee&, LeMois&, LeNom$, ElNom$
LastDay = 3&
Annee = 4&
LeMois = 11&
LeNom = Worksheets(1&).Name
'Boucle pour copier"Modèle" autant de fois qu'il y a de jours.
'Et renomme chaque feuille avec la date.
For A = 1& To LastDay
Worksheets("Modèle").Copy Worksheets("Total")
Set Sh = Worksheets(Worksheets.Count - 1&)
With Sh
ElNom = Format(DateSerial(Annee, LeMois, A), "ddd
dd-mm-yy") .Name = ElNom
.Move , Worksheets(LeNom)
.Visible = xlSheetVisible
LeNom = ElNom
End With
Next
Set Sh = Nothing
End Sub

Pour la question subsidiaire :
Insére une feuille graphique dans ton classeur puis lance cette macro.

Sub SheetsCount_OU_WorksheetsCount()
MsgBox "Worksheets.Count = " & Worksheets.Count & vbNewLine & _
vbNewLine & "Sheets.Count = " & Sheets.Count
End Sub

Alain CROS

"Patrick Bastard" <bastardp"chez"free.fr> a écrit dans le message de
news: #
Bonjour à tous

Je m'en sors petit à petit, tant bien que mal :

Créer un classeur mensuel avec une feuille par jour à partir d'un
modèle en reprenant mise en forme, validation, objets etc...

Mon classeur de départ : 3 onglets : "Premier", "Modèle" et "Total"
"Premier "est la solution que j'ai trouvée pour consolider dans
"Total "toutes les feuilles qui seront créées :
=(SOMME(Premier:Modèle!A3) ou =(NBVAL(Premier:Modèle!A3)

Le bout de code ci-dessous fonctionne :-) quand les feuilles Premier
et Modèle sont affichées, mais *ne fonctionne pas* :-( lorsqu'elles
sont masquées :

'Boucle pour copier"Modèle" autant de fois qu'il y a de jours.
'Et renomme chaque feuille avec la date.
For A = 1 To LastDay Step 1
Sheets("Modèle").Select
Sheets("Modèle").Copy Before:=Sheets("Modèle")
Set Sh = Worksheets(Worksheets.Count - 2)
With Sh
.Visible = True
.Name = Format(DateSerial(Annee, LeMois, A), "ddd
dd-mm-yy") If Err <> 0 Then
Err = 0
End If
End With
Next

Un grand merci donc à qui voudra bien m'expliquer comment paramétrer
Copy Before et Worksheets.Count
pour que mes feuilles créées soient correctement nommées, soient
placées entre"Premier" et "Modèle", et restent visibles !!!

Question subsidiaire pour les gagnants : quelle différence entre
Sheets.Count et Worksheets.Count.

Désolé si ces questions sont basiques, mais je persiste à débuter en
VBA.

PS : je pense que le classeur terminé pourrait être utile à
d'autres, et je le soumettrai à Misange.

Cordialement,

Patrick




1 2