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

bcp de questions

4 réponses
Avatar
pb
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.

Merci

4 réponses

Avatar
MichDenis
Bonjour,



J'ai le code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)

On Error Resume Next ' ce que tu dois ajouter

Feuil4.Select
Application.DisplayAlerts = False
Sheets("tcd1").Delete
Sheets("tcd2").Delete
Sheets("tcd3").Delete
Application.DisplayAlerts = True

End Sub
Avatar
Gloops
[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.

Merci




Avatar
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
'--------------------------
Avatar
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
'--------------------------