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

Erreur d'exécution aléatoire [VBA]

7 réponses
Avatar
Patrick BASTARD
Bonjour à toutes et tous.

Qui d'entre vous aurait l'extrème gentillesse de me dire pourquoi cette sub,
sous la signature, plante ?
- Elle oublie parfois une journée... et pas toujours la même.
- et dans ce cas la cellule O3 de l'onglet qui suit le manquant contient la
date manquante.
(La formule en O3 avant recopiage spécial est : ="Montexte -
"&STXT(CELLULE("nomfichier");TROUVE("]";CELLULE("nomfichier"))+1;32)
Elle me permet de récupérer la date avec :
=DATE(DROITE(O3;2);GAUCHE(DROITE(O3;5);2);GAUCHE(DROITE(O3;8);2))+36525)
Un peu tordu, mais je n'ai pas trouvé mieux :-(

Merci en tous cas d'avoir lu...
Toutes vos suggestions seront les bienvenues.
--
Bien amicordialement,
P. Bastard

***********************************************************
Option Explicit
Private Sub CréationDesPagesJour()
'Avec l'aide de MPFE et en particulier Denis M
'Déclaration des variables
Dim MaDate As Variant
Dim Sh As Worksheet
Dim LastDay As Byte
Dim Annee As Integer
Dim LeMois As Byte
Dim A As Byte
'Gestion des erreurs
On Error Resume Next
'Désactivation de la mise à jour de l'écran
Application.ScreenUpdating = False
'Désactivation des procédures événementielles
Application.EnableEvents = False
'Test pour vérifier que les pages n'ont pas encore été créées
If Sheets.Count = 5 Then
'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/01/2006", "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 n'est " & _
"pas un format date reconnu par excel."
End If
Loop Until IsDate(MaDate) Or MaDate = "" = True
'Affectation des valeurs aux variables.
Annee = Year(MaDate)
LeMois = Month(MaDate)
LastDay = Day(DateSerial(Annee, LeMois + 1, 0))
On Error Resume Next
Application.ScreenUpdating = False
If Err <> 0 Then Err = 0
'La boucle copie "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), "dd.mm.yy")
'Recopie de la valeur de la formule en O3
Calculate
Range("O3").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
If Err <> 0 Then
Err = 0
End If
End With
'Boucle pour rediriger les hyperliens de "Modèle" vers la feuille créée.
Dim Hl As Hyperlink
For Each Hl In ActiveSheet.Hyperlinks
Hl.SubAddress = Replace(Hl.SubAddress, "Modèle!", "")
Next Hl
Next
Application.DisplayAlerts = True
'Vidage des variables
Set Sh = Nothing
Set MaDate = Nothing
Set Hl = Nothing
'Masque les feuilles "Premier" "Administration" et "Modèle"
Sheets(Array("Premier", "Administration", "Modèle")).Visible = False
'Réactivation des procédures événementielles
Application.EnableEvents = True
'Lancement de la private sub qui liste les feuilles dans le tableau de
"Total"
ListerFeuilles
End
End If
End Sub
'*********************************************************************************
--
Bien amicordialement,
P. Bastard

7 réponses

Avatar
AV
STXT(CELLULE("nomfichier");TROUVE("]";CELLULE("nomfichier"))+1;32)


Il ne faut, par principe, jamais faire l'impasse sur le 2° argument (soi-disant
facultatif) de la fonction CELLULE
Cela a pour effet de rendre la fonction non volatile (pas de recalcul)
Donc, pour ton cas, corriger en
STXT(CELLULE("nomfichier";A1);TROUVE("]";CELLULE("nomfichier";A1))+1;32)

AV

Avatar
Patrick BASTARD
Bonjour, *Alain*

Je te remercie.

Je corrige immédiatement.
Je reviendrais à la charge si le défaut constaté persistait.


--
Bien amicordialement,
P. Bastard



STXT(CELLULE("nomfichier");TROUVE("]";CELLULE("nomfichier"))+1;32)


Il ne faut, par principe, jamais faire l'impasse sur le 2° argument
(soi-disant facultatif) de la fonction CELLULE
Cela a pour effet de rendre la fonction non volatile (pas de recalcul)
Donc, pour ton cas, corriger en
STXT(CELLULE("nomfichier";A1);TROUVE("]";CELLULE("nomfichier";A1))+1;32)

AV



Avatar
Patrick BASTARD
Bonsoir à vous, toutes et tous.

Je reviens -hélàs.

J'ai effectué la modif que Alain m'as conseillée, et les dates correspondent
désormais aux noms des onglets.

Cependant certains onglets ne sont parfois pas créés (pas toujours les
mêmes...)

Y aurait-il une raison pour que ma boucle saute un -ou des- pas de manière
aléatoire ?

Quelle erreur aurai-je commise ?

J'attends avec la plus grande impatience vos avis éclairés, avant d'arracher
rageusement les quelques cheveux qui me restent.


--
Bien amicordialement,
P. Bastard





STXT(CELLULE("nomfichier");TROUVE("]";CELLULE("nomfichier"))+1;32)


Il ne faut, par principe, jamais faire l'impasse sur le 2° argument
(soi-disant facultatif) de la fonction CELLULE
Cela a pour effet de rendre la fonction non volatile (pas de recalcul)
Donc, pour ton cas, corriger en
STXT(CELLULE("nomfichier";A1);TROUVE("]";CELLULE("nomfichier";A1))+1;32)

AV



Avatar
michdenis
Bonjour Patrick,

Essaie ceci, et lis les commentaires que j'ai ajoutées dans le code :



'-------------------------------
Sub CréationDesPagesJour()
'Avec l'aide de MPFE et en particulier Denis M
'Déclaration des variables
Dim MaDate As Variant
Dim Sh As Worksheet
Dim LastDay As Byte
Dim Annee As Integer
Dim LeMois As Byte
Dim A As Byte
Dim Hl As Hyperlink 'Préférable de définir toute tes variable
'en début de procédure

'Désactivation des procédures événementielles
Application.EnableEvents = False
'Test pour vérifier que les pages n'ont pas encore été créées
If Sheets.Count = 3 Then
'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/01/2006", "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 n'est " & _
"pas un format date reconnu par excel."
End If
Loop Until IsDate(MaDate) = True
'Affectation des valeurs aux variables.
Annee = Year(MaDate)
LeMois = Month(MaDate)
LastDay = Day(DateSerial(Annee, LeMois + 1, 0))

Application.ScreenUpdating = False
'La boucle copie "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").Copy before:=Sheets("Modèle")
Set Sh = ActiveSheet
With Sh
.Visible = True
.Name = Format(DateSerial(Annee, LeMois, A), "dd.mm.yy")
'Recopie de la valeur de la formule en O3
Calculate
'Je ne saisis pas ce que tu veux copier
'et où tu veux le faire !
Range("O3").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:úlse, Transpose:úlse
End With
'Boucle pour rediriger les hyperliens de "Modèle" vers la feuille créée.
For Each Hl In ActiveSheet.Hyperlinks
Hl.SubAddress = Replace(Hl.SubAddress, "Modèle!", "")
Next Hl
Next

'Masque les feuilles "Premier" "Administration" et "Modèle"
Sheets(Array("Premier", "Administration", "Modèle")).Visible = False
'Réactivation des procédures événementielles
Application.EnableEvents = True
'Lancement de la private sub qui liste les feuilles dans le tableau de "Total"
ListerFeuilles
End 'Attention cette commande remet toutes les variables à 0
'Y compris les variables déclarées "Public"
End If

'Vidage des variables -> ceci s'applique seulement pour
'les variables objets "Range", Worksheet, workbook ...
'MaDate n'est pas une variable objet mais une variable
'de type variant devant recevoir éventuellement une date ...
Set Sh = Nothing
' Set MaDate = Nothing
Set Hl = Nothing

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


Salutations!



"Patrick BASTARD" a écrit dans le message de news:
Bonsoir à vous, toutes et tous.

Je reviens -hélàs.

J'ai effectué la modif que Alain m'as conseillée, et les dates correspondent
désormais aux noms des onglets.

Cependant certains onglets ne sont parfois pas créés (pas toujours les
mêmes...)

Y aurait-il une raison pour que ma boucle saute un -ou des- pas de manière
aléatoire ?

Quelle erreur aurai-je commise ?

J'attends avec la plus grande impatience vos avis éclairés, avant d'arracher
rageusement les quelques cheveux qui me restent.


--
Bien amicordialement,
P. Bastard





STXT(CELLULE("nomfichier");TROUVE("]";CELLULE("nomfichier"))+1;32)


Il ne faut, par principe, jamais faire l'impasse sur le 2° argument
(soi-disant facultatif) de la fonction CELLULE
Cela a pour effet de rendre la fonction non volatile (pas de recalcul)
Donc, pour ton cas, corriger en
STXT(CELLULE("nomfichier";A1);TROUVE("]";CELLULE("nomfichier";A1))+1;32)

AV



Avatar
Patrick BASTARD
Bonjour, *michdenis*

Merci, une nouvelle fois, de me tendre une main secourable...
;-)

Je teste et je reviens.


--
Bien amicordialement,
P. Bastard



Bonjour Patrick,

Essaie ceci, et lis les commentaires que j'ai ajoutées dans le code :



'-------------------------------
Sub CréationDesPagesJour()
'Avec l'aide de MPFE et en particulier Denis M
'Déclaration des variables
Dim MaDate As Variant
Dim Sh As Worksheet
Dim LastDay As Byte
Dim Annee As Integer
Dim LeMois As Byte
Dim A As Byte
Dim Hl As Hyperlink 'Préférable de définir toute tes variable
'en début de procédure

'Désactivation des procédures événementielles
Application.EnableEvents = False
'Test pour vérifier que les pages n'ont pas encore été créées
If Sheets.Count = 3 Then
'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/01/2006", "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 n'est " & _
"pas un format date reconnu par excel."
End If
Loop Until IsDate(MaDate) = True
'Affectation des valeurs aux variables.
Annee = Year(MaDate)
LeMois = Month(MaDate)
LastDay = Day(DateSerial(Annee, LeMois + 1, 0))

Application.ScreenUpdating = False
'La boucle copie "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").Copy before:=Sheets("Modèle")
Set Sh = ActiveSheet
With Sh
.Visible = True
.Name = Format(DateSerial(Annee, LeMois, A), "dd.mm.yy")
'Recopie de la valeur de la formule en O3
Calculate
'Je ne saisis pas ce que tu veux copier
'et où tu veux le faire !
Range("O3").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:úlse, Transpose:úlse
End With
'Boucle pour rediriger les hyperliens de "Modèle" vers la feuille
créée. For Each Hl In ActiveSheet.Hyperlinks
Hl.SubAddress = Replace(Hl.SubAddress, "Modèle!", "")
Next Hl
Next

'Masque les feuilles "Premier" "Administration" et "Modèle"
Sheets(Array("Premier", "Administration", "Modèle")).Visible > False 'Réactivation des procédures événementielles
Application.EnableEvents = True
'Lancement de la private sub qui liste les feuilles dans le tableau
de "Total" ListerFeuilles
End 'Attention cette commande remet toutes les variables à 0
'Y compris les variables déclarées "Public"
End If

'Vidage des variables -> ceci s'applique seulement pour
'les variables objets "Range", Worksheet, workbook ...
'MaDate n'est pas une variable objet mais une variable
'de type variant devant recevoir éventuellement une date ...
Set Sh = Nothing
' Set MaDate = Nothing
Set Hl = Nothing

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


Salutations!



"Patrick BASTARD" a écrit dans
le message de news: Bonsoir
à vous, toutes et tous.

Je reviens -hélàs.

J'ai effectué la modif que Alain m'as conseillée, et les dates
correspondent
désormais aux noms des onglets.

Cependant certains onglets ne sont parfois pas créés (pas toujours les
mêmes...)

Y aurait-il une raison pour que ma boucle saute un -ou des- pas de
manière
aléatoire ?

Quelle erreur aurai-je commise ?

J'attends avec la plus grande impatience vos avis éclairés, avant
d'arracher
rageusement les quelques cheveux qui me restent.



STXT(CELLULE("nomfichier");TROUVE("]";CELLULE("nomfichier"))+1;32)


Il ne faut, par principe, jamais faire l'impasse sur le 2° argument
(soi-disant facultatif) de la fonction CELLULE
Cela a pour effet de rendre la fonction non volatile (pas de
recalcul) Donc, pour ton cas, corriger en
STXT(CELLULE("nomfichier";A1);TROUVE("]";CELLULE("nomfichier";A1))+1;32)

AV





Avatar
Patrick BASTARD
Bonjour, *Denis*


Mes cheveux, sauvés in extremis, te remercient.
;-)

Après modification selon tes conseils, et plusieurs tests, cette anomalie ne
s'est pas reproduite.
Oufff...

Je te remercie également d'avoir épuré cette proc, et d'y avoir ajouté tes
commentaires.

Pour info, le If Sheets.Count = 5 est bien 5, car 2 feuilles se situent à
l'origine avant Modèle (Anomalies, Administration, Premier, Modèle et Total,
qui récapitule tout ce qu'il y a depuis Premier jusqu'à Modèle).

Donc, Merci, Merci, et Merci.

PS : seras-tu des nôtres, le 17/12 ?


--
Bien amicordialement,
P. Bastard



Bonjour Patrick,

Essaie ceci, et lis les commentaires que j'ai ajoutées dans le code :



'-------------------------------
Sub CréationDesPagesJour()
'Avec l'aide de MPFE et en particulier Denis M
'Déclaration des variables
Dim MaDate As Variant
Dim Sh As Worksheet
Dim LastDay As Byte
Dim Annee As Integer
Dim LeMois As Byte
Dim A As Byte
Dim Hl As Hyperlink 'Préférable de définir toute tes variable
'en début de procédure

'Désactivation des procédures événementielles
Application.EnableEvents = False
'Test pour vérifier que les pages n'ont pas encore été créées
If Sheets.Count = 3 Then
'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/01/2006", "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 n'est " & _
"pas un format date reconnu par excel."
End If
Loop Until IsDate(MaDate) = True
'Affectation des valeurs aux variables.
Annee = Year(MaDate)
LeMois = Month(MaDate)
LastDay = Day(DateSerial(Annee, LeMois + 1, 0))

Application.ScreenUpdating = False
'La boucle copie "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").Copy before:=Sheets("Modèle")
Set Sh = ActiveSheet
With Sh
.Visible = True
.Name = Format(DateSerial(Annee, LeMois, A), "dd.mm.yy")
'Recopie de la valeur de la formule en O3
Calculate
'Je ne saisis pas ce que tu veux copier
'et où tu veux le faire !
Range("O3").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:úlse, Transpose:úlse
End With
'Boucle pour rediriger les hyperliens de "Modèle" vers la feuille
créée. For Each Hl In ActiveSheet.Hyperlinks
Hl.SubAddress = Replace(Hl.SubAddress, "Modèle!", "")
Next Hl
Next

'Masque les feuilles "Premier" "Administration" et "Modèle"
Sheets(Array("Premier", "Administration", "Modèle")).Visible > False 'Réactivation des procédures événementielles
Application.EnableEvents = True
'Lancement de la private sub qui liste les feuilles dans le tableau
de "Total" ListerFeuilles
End 'Attention cette commande remet toutes les variables à 0
'Y compris les variables déclarées "Public"
End If

'Vidage des variables -> ceci s'applique seulement pour
'les variables objets "Range", Worksheet, workbook ...
'MaDate n'est pas une variable objet mais une variable
'de type variant devant recevoir éventuellement une date ...
Set Sh = Nothing
' Set MaDate = Nothing
Set Hl = Nothing

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


Salutations!



"Patrick BASTARD" a écrit dans
le message de news: Bonsoir
à vous, toutes et tous.

Je reviens -hélàs.

J'ai effectué la modif que Alain m'as conseillée, et les dates
correspondent
désormais aux noms des onglets.

Cependant certains onglets ne sont parfois pas créés (pas toujours les
mêmes...)

Y aurait-il une raison pour que ma boucle saute un -ou des- pas de
manière
aléatoire ?

Quelle erreur aurai-je commise ?

J'attends avec la plus grande impatience vos avis éclairés, avant
d'arracher
rageusement les quelques cheveux qui me restent.



STXT(CELLULE("nomfichier");TROUVE("]";CELLULE("nomfichier"))+1;32)


Il ne faut, par principe, jamais faire l'impasse sur le 2° argument
(soi-disant facultatif) de la fonction CELLULE
Cela a pour effet de rendre la fonction non volatile (pas de
recalcul) Donc, pour ton cas, corriger en
STXT(CELLULE("nomfichier";A1);TROUVE("]";CELLULE("nomfichier";A1))+1;32)

AV





Avatar
michdenis
| seras-tu des nôtres, le 17/12 ?

Ce n'est pas la mer à boire mais à traverser qui cause problème !!!

;-))


Salutations!