Tester si feuille existe dans classeur fermé (2UDF + 1 sub)

zebanx

XLDnaute Accro
Bonjour à tous,

Pourriez-vous m'aider pour cette vérification d'existence de feuille SVP, idéalement dans un classeur fermé.

Sur un fichier "test_a.xls" placé sur le bureau et qui comporte une "Feuil1", seule une méthode retourne un résultat exact.
Or c'est un sub (SheetE) et qui oblige à ouvrir et balayer le classeur donc pas idéal.

1. Idéalement, je souhaiterai utiliser la fonction HasSheet qui travaille dans un classeur Fermé
- Pourquoi la valeur retournée est-elle fausse s'il vous plait ?

2. Sur deux autres essais (SheetE et SEok), l'un avec Sub et l'autre en essayant de la mettre sous forme UDF, les résultats ne sont pas identiques !
Savez-vous pourquoi svp ?

Ci-joint le fichier contenant les 2 UDF + MACRO et le fichier pour le test.
(Le "path" de base doit être modifié svp quand vous placez "test_a.xls" sur votre bureau)

Je vous remercie par avance pour votre aide.

zebanx
 

Pièces jointes

  • SHEET existe.xls
    38 KB · Affichages: 31
  • test_a.xls
    19 KB · Affichages: 30
Dernière édition:

zebanx

XLDnaute Accro
Bonjour Nicole,

Merci pour ce retour.
Je n'arrive pas à faire fonctionner votre version mais c'est peut-être un problème de version (excel 2003).

Sans même faire fonctionner le premier UDF (hasheet), pourriez-vous me dire pourquoi l'UDF SEok et la sub SheetE qui sont construits de la même manière, ne donnent pas un résultat identique svp ?
Je n'ai pas compris où était mon erreur de syntaxe.

Merci.
Bonne soirée

zebanx
 

job75

XLDnaute Barbatruc
Bonjour zebanx, Nicole, le forum,

Il faut bien comprendre qu'une fonction VBA utilisant ExecuteExcel4Macro fonctionne bien quand la fonction est appelée par une procédure VBA (comme l'a montré Nicole).

Par contre utiliser la fonction dans une feuille de calcul n'est pas possible, elle ne fonctionne pas.

Alors autant utiliser directement ExecuteExcel4Macro dans la Sub :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i&
Application.ScreenUpdating = False
Application.EnableEvents = False
With [A1].CurrentRegion
  For i = 2 To .Rows.Count
    If Application.CountA(.Cells(i, 1).Resize(, 3)) < 3 Then .Cells(i, 4) = "" Else _
      .Cells(i, 4) = IsNumeric(ExecuteExcel4Macro("'" & .Cells(i, 1) & "\[" & .Cells(i, 2) & "]" & .Cells(i, 3) & "'!R65536C256"))
      '.Cells(i, 4) = HasWorksheet(.Cells(i, 1), .Cells(i, 2), .Cells(i, 3))
  Next
End With
Application.EnableEvents = True
End Sub
Petite explication : dans un fichier .xls normalement la cellule IV65536 est vide...

Téléchargez les 2 fichiers joints dans le même dossier (le bureau).

Bonne journée.
 

Pièces jointes

  • HasWorksheet(1).xls
    68.5 KB · Affichages: 30
  • Test.xls
    54.5 KB · Affichages: 25
Dernière édition:

zebanx

XLDnaute Accro
Merci Job75

Merci pour les explications, car je n'avais aucune connaissance de la restriction sur ExecuteExcel4Macro, et cette proposition.
Cela me fait deux bons codes à utiliser sur le sujet, parfait.

J'ai juste rajouté 2 display.alerts false / true pour éviter d'avoir une fenêtre qui s'ouvre si je mets un chemin / fichier qui est faux (et dans les deux propositions que vous avez faites avec Nicole).

Bonne journée -)
zebanx

PS : et le petit sucre en plus pour accompagner le café avec la formule en cellule A2 :):):)
 
Dernière édition:

job75

XLDnaute Barbatruc
Re,

Plutôt que Application.DisplayAlerts = False utiliser :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i&
Application.ScreenUpdating = False
Application.EnableEvents = False
With [A1].CurrentRegion
  For i = 2 To .Rows.Count
    If Application.CountA(.Cells(i, 1).Resize(, 3)) < 3 Then .Cells(i, 4) = "" Else _
      If Dir(.Cells(i, 1) & "\" & .Cells(i, 2)) = "" Then .Cells(i, 4) = "Fichier introuvable" Else _
        .Cells(i, 4) = IsNumeric(ExecuteExcel4Macro("'" & .Cells(i, 1) & "\[" & .Cells(i, 2) & "]" & .Cells(i, 3) & "'!R65536C256"))
        '.Cells(i, 4) = HasWorksheet(.Cells(i, 1), .Cells(i, 2), .Cells(i, 3))
  Next
End With
Application.EnableEvents = True
End Sub
Fichier (2).

A+
 

Pièces jointes

  • HasWorksheet(2).xls
    70 KB · Affichages: 23
  • Test.xls
    54.5 KB · Affichages: 23

eriiic

XLDnaute Barbatruc
Bonjour,

une autre écriture plus compacte de la dernière proposition de Nicole :
VB:
    ThisWorkbook.Names.Add "nomTest", RefersTo:="='D:\tmp\Téléchargement Chrome\[Classeur4.xlsm]Feuil1'!$D$2:$D$10"
    With Range("B4:B12")
        .FormulaArray = "=nomTest"
        .Value = .Value
    End With
eric
 

Discussions similaires

Statistiques des forums

Discussions
311 735
Messages
2 082 023
Membres
101 873
dernier inscrit
excellllll