Bonjour,
Je sais que cela fait beaucoup de questions aujourd'hui, mais juste la
dernière de cette journée et après je ne vous embête plus.
J'ai code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Feuil4.Select
Application.DisplayAlerts = False
Sheets("tcd1").Delete
Sheets("tcd2").Delete
Sheets("tcd3").Delete
Application.DisplayAlerts = True
Qui plante bien sûr lorsque les feuilles n'existent pas.
Comment faire pour en quelque sorte:
si tcd1 existe alors on détruit sinon on vérifie l'existence de tcd2 que
l'on détruit si elle existe et ainsi de suite.
La réponse de MichDenis a un très gros avantage : sa simplicité.
Si maintenant on veut être très orthodoxe et ne pas laisser passer to ute autre erreur, on peut aussi tester l'existence de la feuille, et ne l'effacer que dans l'affirmative.
Là où on comprend le recours à la facilité, c'est qu'à ma conna issance il faut parcourir en boucle la liste des feuilles pour comparer le nom de chacune au nom qu'on veut vérifier, si le nom est le même c'est qu e la feuille existe et on sort de la fonction, si on arrive à la fin de l a liste et qu'aucun des noms n'est égal c'est que la feuille n'existe pas .
Bien sûr, c'est plus lourd.
Function ExisteFeuille(strNomFeuille As String) As Boolean ExisteFeuille = False For Each W in ThisWorkbook.Worksheets If W.Name = strNomFeuille Then ExisteFeuille = True Exit Function End If Next End Function
If ExisteFeuille("tcd1") Then Sheets("tcd1").Delete End IF
If ExisteFeuille("tcd2") Then Sheets("tcd2").Delete End IF
If ExisteFeuille("tcd3") Then Sheets("tcd3").Delete End IF
(Je n'ai pas Excel sous la main, je fais confiance à la syntaxe indiqué e dans la question :) )
_________________________________ pb a écrit, le 04/04/2009 13:45 :
Bonjour, Je sais que cela fait beaucoup de questions aujourd'hui, mais juste la dernière de cette journée et après je ne vous embête plus.
J'ai code: Private Sub Workbook_BeforeClose(Cancel As Boolean) Feuil4.Select Application.DisplayAlerts = False Sheets("tcd1").Delete Sheets("tcd2").Delete Sheets("tcd3").Delete Application.DisplayAlerts = True
Qui plante bien sûr lorsque les feuilles n'existent pas. Comment faire pour en quelque sorte: si tcd1 existe alors on détruit sinon on vérifie l'existence de tc d2 que l'on détruit si elle existe et ainsi de suite.
Merci
[Effacement d'une feuille si elle existe]
Bonjour,
La réponse de MichDenis a un très gros avantage : sa simplicité.
Si maintenant on veut être très orthodoxe et ne pas laisser passer to ute
autre erreur, on peut aussi tester l'existence de la feuille, et ne
l'effacer que dans l'affirmative.
Là où on comprend le recours à la facilité, c'est qu'à ma conna issance
il faut parcourir en boucle la liste des feuilles pour comparer le nom
de chacune au nom qu'on veut vérifier, si le nom est le même c'est qu e
la feuille existe et on sort de la fonction, si on arrive à la fin de l a
liste et qu'aucun des noms n'est égal c'est que la feuille n'existe pas .
Bien sûr, c'est plus lourd.
Function ExisteFeuille(strNomFeuille As String) As Boolean
ExisteFeuille = False
For Each W in ThisWorkbook.Worksheets
If W.Name = strNomFeuille Then
ExisteFeuille = True
Exit Function
End If
Next
End Function
If ExisteFeuille("tcd1") Then
Sheets("tcd1").Delete
End IF
If ExisteFeuille("tcd2") Then
Sheets("tcd2").Delete
End IF
If ExisteFeuille("tcd3") Then
Sheets("tcd3").Delete
End IF
(Je n'ai pas Excel sous la main, je fais confiance à la syntaxe indiqué e
dans la question :) )
_________________________________
pb a écrit, le 04/04/2009 13:45 :
Bonjour,
Je sais que cela fait beaucoup de questions aujourd'hui, mais juste la
dernière de cette journée et après je ne vous embête plus.
J'ai code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Feuil4.Select
Application.DisplayAlerts = False
Sheets("tcd1").Delete
Sheets("tcd2").Delete
Sheets("tcd3").Delete
Application.DisplayAlerts = True
Qui plante bien sûr lorsque les feuilles n'existent pas.
Comment faire pour en quelque sorte:
si tcd1 existe alors on détruit sinon on vérifie l'existence de tc d2 que
l'on détruit si elle existe et ainsi de suite.
La réponse de MichDenis a un très gros avantage : sa simplicité.
Si maintenant on veut être très orthodoxe et ne pas laisser passer to ute autre erreur, on peut aussi tester l'existence de la feuille, et ne l'effacer que dans l'affirmative.
Là où on comprend le recours à la facilité, c'est qu'à ma conna issance il faut parcourir en boucle la liste des feuilles pour comparer le nom de chacune au nom qu'on veut vérifier, si le nom est le même c'est qu e la feuille existe et on sort de la fonction, si on arrive à la fin de l a liste et qu'aucun des noms n'est égal c'est que la feuille n'existe pas .
Bien sûr, c'est plus lourd.
Function ExisteFeuille(strNomFeuille As String) As Boolean ExisteFeuille = False For Each W in ThisWorkbook.Worksheets If W.Name = strNomFeuille Then ExisteFeuille = True Exit Function End If Next End Function
If ExisteFeuille("tcd1") Then Sheets("tcd1").Delete End IF
If ExisteFeuille("tcd2") Then Sheets("tcd2").Delete End IF
If ExisteFeuille("tcd3") Then Sheets("tcd3").Delete End IF
(Je n'ai pas Excel sous la main, je fais confiance à la syntaxe indiqué e dans la question :) )
_________________________________ pb a écrit, le 04/04/2009 13:45 :
Bonjour, Je sais que cela fait beaucoup de questions aujourd'hui, mais juste la dernière de cette journée et après je ne vous embête plus.
J'ai code: Private Sub Workbook_BeforeClose(Cancel As Boolean) Feuil4.Select Application.DisplayAlerts = False Sheets("tcd1").Delete Sheets("tcd2").Delete Sheets("tcd3").Delete Application.DisplayAlerts = True
Qui plante bien sûr lorsque les feuilles n'existent pas. Comment faire pour en quelque sorte: si tcd1 existe alors on détruit sinon on vérifie l'existence de tc d2 que l'on détruit si elle existe et ainsi de suite.
Merci
MichDenis
Bonjour Gloops,
Il aurait été aussi possible de fonctionner comme ceci :
'-------------------------- Sub test() Dim Arr(), Elt As Variant, Sh As Worksheet Arr = Array("tcd1", "tcd2", "tcd13") On Error Resume Next For Each Elt In Arr Set Sh = Worksheets(Elt) If Err = 0 Then Sh.Delete Else Err = 0 Next End Sub '--------------------------
Bonjour Gloops,
Il aurait été aussi possible de fonctionner comme ceci :
'--------------------------
Sub test()
Dim Arr(), Elt As Variant, Sh As Worksheet
Arr = Array("tcd1", "tcd2", "tcd13")
On Error Resume Next
For Each Elt In Arr
Set Sh = Worksheets(Elt)
If Err = 0 Then Sh.Delete Else Err = 0
Next
End Sub
'--------------------------
Il aurait été aussi possible de fonctionner comme ceci :
'-------------------------- Sub test() Dim Arr(), Elt As Variant, Sh As Worksheet Arr = Array("tcd1", "tcd2", "tcd13") On Error Resume Next For Each Elt In Arr Set Sh = Worksheets(Elt) If Err = 0 Then Sh.Delete Else Err = 0 Next End Sub '--------------------------
Gloops
Bonjour,
Effectivement, nous n'avons pas épuisé le sujet.
Une autre façon de détecter l'existence d'une feuille est effectiveme nt l'absence d'erreur lorsqu'on l'invoque, avec d'ailleurs l'avantage qu'on peut vérifier le numéro d'erreur, ce qui peut permettre plus de souplesse si apparaissent d'autres raisons de ne pas pouvoir accéder à la feuille (dysfonctionnement du disque, du réseau, problème de droit s bien que sur une feuille je n'ai pas connaissance que ceci soit déjà implémenté...)
Je mentionne un exemple juste en tant que tel, à chacun de donner les bonnes valeurs aux entiers err1, err2, err3, de décider dans quels cas il y a lieu d'afficher un message et lequel, au besoin d'écrire une variante qui puisse tester l'existence d'une feuille dans un autre classeur, et au passage de contrôler la syntaxe.
On peut aussi imaginer une variante qui retourne différentes valeurs entières selon le cas, en admettant que la suite du traitement ne soit pas la même (par exemple dans un cas on réessaie quelques minutes plu s tard, dans un autre on propose de créer la feuille ...)
Public Function ExisteFeuille(strNomFeuille As String) As Boolean
Dim F As WorkSheet On Error Goto ErrExisteFeuille Set F = ActiveWorkbook.Worksheets(strNomFeuille) Set F = Nothing ExisteFeuille = True Exit Function ErrExisteFeuille: ExisteFeuille = False Select Case Err.Number Case err1 MsgBox "La feuille " + strNomFeuille + _ " n'a pas été trouvée pour des raisons obscures" Case err2 MsgBox "La feuille " + strNomFeuille + _ " n'a pas été trouvée pour des raisons très simples" Case err3 MsgBox "La feuille " + strNomFeuille + " n'existe pas" Case Else 'Cas non prévu : 'afficher davantage d'informations pour aider à corriger MsgBox "Erreur n° " + VBA.Str$(Err.Number) + _ " dans la fonction ExisteFeuille, sur la source " + _ Err.Source + " : " + VBA.Chr$(13) + _ Err.Message End Select End Function
'Pour la concaténation, la syntaxe utilisée est celle qui peut franch ir 'la migration entre Access 95 et Access 97, dans la mesure où de l'eau 'est passée sous les ponts depuis j'imagine qu'on peut alléger.
________________________________________ MichDenis a écrit, le 05/04/2009 15:52 :
Bonjour Gloops,
Il aurait été aussi possible de fonctionner comme ceci :
'-------------------------- Sub test() Dim Arr(), Elt As Variant, Sh As Worksheet Arr = Array("tcd1", "tcd2", "tcd13") On Error Resume Next For Each Elt In Arr Set Sh = Worksheets(Elt) If Err = 0 Then Sh.Delete Else Err = 0 Next End Sub '--------------------------
Bonjour,
Effectivement, nous n'avons pas épuisé le sujet.
Une autre façon de détecter l'existence d'une feuille est effectiveme nt
l'absence d'erreur lorsqu'on l'invoque, avec d'ailleurs l'avantage qu'on
peut vérifier le numéro d'erreur, ce qui peut permettre plus de
souplesse si apparaissent d'autres raisons de ne pas pouvoir accéder à
la feuille (dysfonctionnement du disque, du réseau, problème de droit s
bien que sur une feuille je n'ai pas connaissance que ceci soit déjà
implémenté...)
Je mentionne un exemple juste en tant que tel, à chacun de donner les
bonnes valeurs aux entiers err1, err2, err3, de décider dans quels cas
il y a lieu d'afficher un message et lequel, au besoin d'écrire une
variante qui puisse tester l'existence d'une feuille dans un autre
classeur, et au passage de contrôler la syntaxe.
On peut aussi imaginer une variante qui retourne différentes valeurs
entières selon le cas, en admettant que la suite du traitement ne soit
pas la même (par exemple dans un cas on réessaie quelques minutes plu s
tard, dans un autre on propose de créer la feuille ...)
Public Function ExisteFeuille(strNomFeuille As String) As Boolean
Dim F As WorkSheet
On Error Goto ErrExisteFeuille
Set F = ActiveWorkbook.Worksheets(strNomFeuille)
Set F = Nothing
ExisteFeuille = True
Exit Function
ErrExisteFeuille:
ExisteFeuille = False
Select Case Err.Number
Case err1
MsgBox "La feuille " + strNomFeuille + _
" n'a pas été trouvée pour des raisons obscures"
Case err2
MsgBox "La feuille " + strNomFeuille + _
" n'a pas été trouvée pour des raisons très simples"
Case err3
MsgBox "La feuille " + strNomFeuille + " n'existe pas"
Case Else
'Cas non prévu :
'afficher davantage d'informations pour aider à corriger
MsgBox "Erreur n° " + VBA.Str$(Err.Number) + _
" dans la fonction ExisteFeuille, sur la source " + _
Err.Source + " : " + VBA.Chr$(13) + _
Err.Message
End Select
End Function
'Pour la concaténation, la syntaxe utilisée est celle qui peut franch ir
'la migration entre Access 95 et Access 97, dans la mesure où de l'eau
'est passée sous les ponts depuis j'imagine qu'on peut alléger.
________________________________________
MichDenis a écrit, le 05/04/2009 15:52 :
Bonjour Gloops,
Il aurait été aussi possible de fonctionner comme ceci :
'--------------------------
Sub test()
Dim Arr(), Elt As Variant, Sh As Worksheet
Arr = Array("tcd1", "tcd2", "tcd13")
On Error Resume Next
For Each Elt In Arr
Set Sh = Worksheets(Elt)
If Err = 0 Then Sh.Delete Else Err = 0
Next
End Sub
'--------------------------
Une autre façon de détecter l'existence d'une feuille est effectiveme nt l'absence d'erreur lorsqu'on l'invoque, avec d'ailleurs l'avantage qu'on peut vérifier le numéro d'erreur, ce qui peut permettre plus de souplesse si apparaissent d'autres raisons de ne pas pouvoir accéder à la feuille (dysfonctionnement du disque, du réseau, problème de droit s bien que sur une feuille je n'ai pas connaissance que ceci soit déjà implémenté...)
Je mentionne un exemple juste en tant que tel, à chacun de donner les bonnes valeurs aux entiers err1, err2, err3, de décider dans quels cas il y a lieu d'afficher un message et lequel, au besoin d'écrire une variante qui puisse tester l'existence d'une feuille dans un autre classeur, et au passage de contrôler la syntaxe.
On peut aussi imaginer une variante qui retourne différentes valeurs entières selon le cas, en admettant que la suite du traitement ne soit pas la même (par exemple dans un cas on réessaie quelques minutes plu s tard, dans un autre on propose de créer la feuille ...)
Public Function ExisteFeuille(strNomFeuille As String) As Boolean
Dim F As WorkSheet On Error Goto ErrExisteFeuille Set F = ActiveWorkbook.Worksheets(strNomFeuille) Set F = Nothing ExisteFeuille = True Exit Function ErrExisteFeuille: ExisteFeuille = False Select Case Err.Number Case err1 MsgBox "La feuille " + strNomFeuille + _ " n'a pas été trouvée pour des raisons obscures" Case err2 MsgBox "La feuille " + strNomFeuille + _ " n'a pas été trouvée pour des raisons très simples" Case err3 MsgBox "La feuille " + strNomFeuille + " n'existe pas" Case Else 'Cas non prévu : 'afficher davantage d'informations pour aider à corriger MsgBox "Erreur n° " + VBA.Str$(Err.Number) + _ " dans la fonction ExisteFeuille, sur la source " + _ Err.Source + " : " + VBA.Chr$(13) + _ Err.Message End Select End Function
'Pour la concaténation, la syntaxe utilisée est celle qui peut franch ir 'la migration entre Access 95 et Access 97, dans la mesure où de l'eau 'est passée sous les ponts depuis j'imagine qu'on peut alléger.
________________________________________ MichDenis a écrit, le 05/04/2009 15:52 :
Bonjour Gloops,
Il aurait été aussi possible de fonctionner comme ceci :
'-------------------------- Sub test() Dim Arr(), Elt As Variant, Sh As Worksheet Arr = Array("tcd1", "tcd2", "tcd13") On Error Resume Next For Each Elt In Arr Set Sh = Worksheets(Elt) If Err = 0 Then Sh.Delete Else Err = 0 Next End Sub '--------------------------