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
 

Fichiers joints

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
 

zebanx

XLDnaute Accro
Super Nicole ;)
Le deuxième code va me permettre de finaliser.

Bonne soirée
zebanx

Edit : Nicole, deuxième code impeccable. Mon fichier est terminé grâce à vous. Bon we et merci.
 
Dernière édition:

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.
 

Fichiers joints

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,
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).
Un seul suffit, Application.DisplayAlerts = True à la fin n'est pas nécessaire.

A+
 

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+
 

Fichiers joints

eriiiic

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
 

zebanx

XLDnaute Accro
Merci pour vos dernières précisions -)
Bonne journée.
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas