Contournement de la déclaration Scripting.FileSystemObject

  • Initiateur de la discussion Initiateur de la discussion dionys0s
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

dionys0s

XLDnaute Impliqué
Bonjour le forum

je travaille sur des fonctions mixtes PC-Mac, dont voici l'exemple pour l'une d'elles :
VB:
Public Function IsFolder(ByVal Path As String) As Boolean

  Dim FSO As New Scripting.FileSystemObject

  If MyOS = Excel.XlPlatform.xlMacintosh Then 'MyOS est une variable du module (Private)
    IsFolder = VBA.Interaction.MacScript( _
      "tell application ""Finder""" & VBA.Constants.vbCr & _
      "exists folder """ & CPath(True, Path) & """" & VBA.Constants.vbCr & _
      "end tell") 'CPath : fonction perso de vérification/conversion d'un String supposé pointer vers un dossier ou fichier

  ElseIf MyOS = Excel.XlPlatform.xlWindows Then
    IsFolder = FSO.FolderExists(CPath(True, Path))

  Else: Call ElseError: End If 'ElseError : Sub d'interruption du programme

End Function

Sur PC, aucun soucis. Mais sur Mac, à la compilation du projet, j'ai la ligne "FSO As New Scripting.FileSystemObject" surlignée avec le message d'erreur suivant : "Type défini par l'utilisateur non défini"

J'avais pensé, pour contourner ce bug, placer la fonction dans un module de code qui ne comporterait pas la mention "Option Explicit", mais le bug persiste. En effet la bibliothèque "Microsoft Scripting Runtime" n'existe pas sur Mac. Existe-t-il un moyen de contourner ce bug, un paramètre à activer/désactiver pour forcer la compilation dans ce cas ?

D'avance merci pour votre aide.
 
Dernière édition:
Re : Contournement de la déclaration Scripting.FileSystemObject

Re,

alors en fait, si je désactive (commente) la ligne "Dim FSO As New Scripting.FileSystemObject" (pas d'Option Explicit donc), c'est désormais à l'exécution sur PC que la macro plante ("Objet requis").

Y a-t-il un moyen de faire l'affectation sans passer par la déclaration, un peu comme dans l'exemple suivant, mais appliqué à un classeur :
VB:
Sub TrucMachin()

  With Excel.Application.Workbooks.Add
    'blablabla du code
   End With

End Sub

D'avance merci
 
Dernière édition:
Re : Contournement de la déclaration Scripting.FileSystemObject

Euh, je croyais que l'objet "FileSystemObject (FSO) permet de manipuler le système de fichiers de Windows. "

Donc il me parait normal que ça ne fonctionne pas sous MAC.
 
Re : Contournement de la déclaration Scripting.FileSystemObject

Bonjour.

Essayez d'encadrer vos groupes d'instructions de directives de compilations :
VB:
#If Mac Then
instructions spécifiques Macintosh
#ElseIf Vba7 Then
version des instructions nécessaires pour VBA 7
#Else
code à appliquer dans les autres cas
#End If
Dites moi si ça fonctionne
 
Re : Contournement de la déclaration Scripting.FileSystemObject

Re,

Dranreb, ça ne fonctionne pas. Le code va directement à l'instruction Else sans tester les conditions If et ElseIf (il ne passe même pas dessus).
VB:
Public Function IsFolder(ByVal Path As String, ByVal MyOS As String) As Boolean
Stop
  'Dim FSO As New Scripting.FileSystemObject

  #If MyOS = "MAC" Then
    IsFolder = VBA.Interaction.MacScript( _
      "tell application ""Finder""" & VBA.Constants.vbCr & _
      "exists folder """ & CPath(True, Path) & """" & VBA.Constants.vbCr & _
      "end tell")

  #ElseIf MyOS = "WIN" Then
    IsFolder = FSO.FolderExists(Path)

  #Else
    Call ElseError

  #End If

End Function

Le code passe sur le Stop puis directement sur Call ElseError
 
Re : Contournement de la déclaration Scripting.FileSystemObject

N'écrivez pas autre chose que ce que je vous ai indiqué. Je ne pense pas qu'il existe de constante de compilation conditionnelle nommée MyOS. Par contre j'ai dans ma (vieille) doc :
Constantes de compilation


Visual Basic pour Applications définit des constantes exclusivement utilisées avec la consigne #If...Then...#Else. Ces constantes sont fonctionnellement identiques à celles définies avec la consigne #If...Then...#Else, mais ont cependant une portée globale, c'est-à-dire qu'elles s'appliquent à l'ensemble d'un projet.
Sur les plates-formes de développement 16 bits, les constantes de compilation sont définies de la manière suivante :
ConstanteValeurDescription

[TD="class: T, width: 19%"] Win16 [/TD]
[TD="class: T, width: 19%"] True [/TD]
[TD="class: T, width: 62%"]Indique que l'environnement de développement est en 16 bits.[/TD]

[TD="class: T, width: 19%"] Win32 [/TD]
[TD="class: T, width: 19%"] False [/TD]
[TD="class: T, width: 62%"]Indique que l'environnement de développement n'est pas en 32 bits.[/TD]

Sur les plates-formes de développement 32 bits, les constantes de compilation sont définies de la manière suivante :
ConstanteValeurDescription

[TD="class: T, width: 24%"] Vba6 [/TD]
[TD="class: T, width: 18%"] True [/TD]
[TD="class: T, width: 58%"]Indique que l'environnement de développement est Visual Basic pour Applications, version 6.0.[/TD]

[TD="class: T, width: 24%"] Vba6 [/TD]
[TD="class: T, width: 18%"] False [/TD]
[TD="class: T, width: 58%"]Indique que l'environnement de développement n'est pas Visual Basic pour Applications, version 6.0.[/TD]

[TD="class: T, width: 24%"] Win16 [/TD]
[TD="class: T, width: 18%"] False [/TD]
[TD="class: T, width: 58%"]Indique que l'environnement de développement n'est pas en 16 bits.[/TD]

[TD="class: T, width: 24%"] Win32 [/TD]
[TD="class: T, width: 18%"] True [/TD]
[TD="class: T, width: 58%"]Indique que l'environnement de développement est en 32 bits.[/TD]

[TD="class: T, width: 24%"] Mac [/TD]
[TD="class: T, width: 18%"] False [/TD]
[TD="class: T, width: 58%"]Indique que l'environnement de développement n'est pas Macintosh.[/TD]

[TD="class: T, width: 24%"] Win16 [/TD]
[TD="class: T, width: 18%"] False [/TD]
[TD="class: T, width: 58%"]Indique que l'environnement de développement n'est pas en 16 bits.[/TD]

[TD="class: T, width: 24%"] Win32 [/TD]
[TD="class: T, width: 18%"] False [/TD]
[TD="class: T, width: 58%"]Indique que l'environnement de développement est en 32 bits Windows.[/TD]

[TD="class: T, width: 24%"] Mac [/TD]
[TD="class: T, width: 18%"] True [/TD]
[TD="class: T, width: 58%"]Indique que l'environnement de développement est Macintosh.[/TD]

Note Ces constantes étant définies par Visual Basic, vous ne pouvez, à aucun niveau, définir des constantes portant le même nom.
 
Dernière édition:
Re : Contournement de la déclaration Scripting.FileSystemObject

Re,
ok je comprends.

La nouvelle fonction :
VB:
Public Function IsFolder(ByVal Path As String, ByVal MyOS As String) As Boolean

  #If Mac Then
    IsFolder = VBA.Interaction.MacScript( _
      "tell application ""Finder""" & VBA.Constants.vbCr & _
      "exists folder """ & CPath(True, Path) & """" & VBA.Constants.vbCr & _
      "end tell")

   #ElseIf Vba7 Then
    With New Scripting.FileSystemObject
      IsFolder = .FolderExists(Path)
    End With

  #Else
    Call ElseError

  #End If

End Function

Diagnostic : le même rigoureusement que mon post précédent.
 
Re : Contournement de la déclaration Scripting.FileSystemObject

Si Mac n'est pas détecté, je dois le savoir. Essayez cette procédure sur diverses machines :
VB:
Sub test()
#If Mac Then
Const Rés = "Mac: Vrai"
#ElseIf VBA7 Then
Const Rés = "VBA7: Vrai"
#ElseIf VBA6 Then
Const Rés = "VBA6: Vrai"
#Else
Const Rés = "Aucune des CCC n'est vraie."
#End If
MsgBox Rés, vbInformation, "test"
End Sub
 
Re : Contournement de la déclaration Scripting.FileSystemObject

Ok c'est bon je crois que je viens de piger.
En fait en exécutant le code en mode arrêt, on ne voit pas la ligne #If surlignée en jaune mais elle est bel et bien testée. C'est donc que je me plante de VBA. Excel 2007 (PC) c'est bien VBA6 ?
 
Re : Contournement de la déclaration Scripting.FileSystemObject

Re,

c'est bon ça fonctionne !!!! Dernière version :
VB:
Public Function IsFile(ByVal Path As String) As Boolean

  #If Mac Then
    IsFile = VBA.Interaction.MacScript( _
      "tell application ""Finder""" & VBA.Constants.vbCr & _
      "exists file """ & CPath(False, Path) & """" & VBA.Constants.vbCr & _
      "end tell")

  #ElseIf VBA6 Or VBA7 Then
    With New Scripting.FileSystemObject
      IsFile = .FileExists(Path)
    End With

  #Else
    Call ElseError

  #End If

End Function

Merci merci merci beaucoup Dranreb. Ton aide m'a été une fois de plus bien précieuse !
 
Re : Contournement de la déclaration Scripting.FileSystemObject

Je ne connais pas les détails, je sais seulement que seul en VBA7 le mot clé PtrSafe est reconnu derrière l'instruction Declare et qu'il est indispensable pour que les API fonctionnent sur les architectures de CPU à 64 bits.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour