2
votes

Appliquer le code Shell de travail dans une autre base de données

J'ai utilisé la fonction "Shell", dans d'autres bases de données Access, pour ouvrir des dossiers.
Avec la même structure de code, j'obtiens le

5 code d'erreur "Appel de procédure ou argument non valide"

En utilisant la fonction shell comme suit:

FreightFile_Path = "S:\Supply Chain\Freight"
Shell "explorer.exe " & FreightFile_Path, vbNormalFocus

J'ai essayé les doubles guillemets et les Chr (34) autour d'eux.
J'ai copié le code d'une base de données (dans laquelle il fonctionnait) vers une autre et cela a généré une erreur.

Est-ce que je manque quelque chose que je dois activer dans MS Access? J'ai vérifié les références dans VBA et je me suis assuré qu'elles correspondent.

Ce que j'ai essayé:

Dim i As String
i = "explorer.exe" & " " & FreightFile_Path
Shell i, vbNormalFocus
Dim retVal
retVal = Shell("explorer.exe" & " " & FreightFile_Path, vbNormalNoFocus)
Shell "explorer.exe" & " " & FreightFile_Path, vbNormalFocus


10 commentaires

C'est juste une chaîne vers un dossier. Je l'ai littéralement défini sur "S: \ Supply Chain \ Freight" à des fins de test. Je ne veux pas vraiment ouvrir un fichier spécifique comme un pdf ou un document Excel car il y en aura plusieurs dans ce dossier. J'ai également essayé d'utiliser le chemin d'accès complet du serveur et cela n'a pas fonctionné non plus


Le code dans l'extrait supérieur fonctionne parfaitement bien ici, ... étant donné un chemin valide, avec ou sans espaces. Le lecteur S est-il un lecteur réseau mappé? (devrait fonctionner correctement aussi) - Je ne peux pas reproduire l'erreur 5 que vous obtenez, même avec un chemin invalide (il ouvre "mes documents")


FWIW la fonction Shell est définie dans le module VBA.Interaction ; il est dans la bibliothèque standard VBA, tout comme MsgBox . Aucune «référence spéciale» n'est nécessaire.


Je me rends compte que c'est très étrange. J'ai une autre base de données sur le même ordinateur que le même code exact fonctionne parfaitement bien. Je me demande simplement si je n'ai pas de paramètre activé ou quelque chose qui l'empêche de fonctionner


Question stupide: le projet se compile-t-il? Déboguer ~> Compiler VBAProject


Oui, tout est compilé. Voici une photo du code côte à côte. Si vous regardez simplement les zones en surbrillance qui sont en cours d'exécution (le reste des choses fonctionnerait si je ne testais pas). Mais cela fonctionne sur l'un et pas sur l'autre imgur.com/YUpVQAW Vu que le shell d'appel n'était pas commenté, mais quand même - a commenté cette ligne et le même résultat


Est-il possible que le symbole Shell ait été redéfini ailleurs dans la base de données?


Pour ce que ça vaut, j'ai exactement le même problème: Shell fonctionne dans une base de données mais pas dans une autre. Mon test est aussi simple que possible: Shell "notepad.exe" . La question est ici: stackoverflow.com/questions/56676948/...


La seule instance de Shell est la seule fois que je l'utilise


OK, je suis curieux maintenant - si vous analysez le code avec Rubberduck , puis sélectionnez le Shell appel de fonction, la barre d'outils Rubberduck dit-elle VBE7.DLL; VBA.Interaction.Shell (fonction: Double) ou autre chose?


4 Réponses :


0
votes

Essayez ceci:

FreightFile_Path = "S:\Supply Chain\Freight"
Shell "cmd /c start explorer.exe """ & FreightFile_Path & """"

C'est un peu une solution de contournement, mais cela fonctionne ...


1 commentaires

Merci pour la réponse, malheureusement pas de dés. J'ai toujours l'erreur 5 Ce qui est étrange, c'est que je colle cela dans une base de données différente et que cela fonctionne très bien, je me demande si j'ai juste un fichier d'accès corrompu ...



0
votes

Nouvel essai. Utilisez un appel WinAPI

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _
    ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _
    ByVal lpDirectory As String, ByVal lpnShowCmd As Long) As Long

Public Sub ShellEx(ByVal Path As String, Optional ByVal Parameters As String, Optional ByVal HideWindow As Boolean)
    If Dir(Path) > "" Then
        ShellExecute 0, "open", Path, Parameters, "", IIf(HideWindow, 0, 1)
    End If
End Sub

Sub Test()
    FreightFile_Path = "S:\Supply Chain\Freight"
    ShellEx "c:\windows\explorer.exe", """" & FreightFile_Path & """"
End Sub


0 commentaires

0
votes

Merci à tous pour votre aide. Ce n'est peut-être pas vraiment une réponse au problème du Shell , mais cela fonctionnera pour ouvrir un chemin de fichier.

Dim FreightFilePath As String
FreightFilePath = "S:\Supply Chain\Freight"
Application.FollowHyperLink FreightFilePath


0 commentaires

1
votes

J'ai juste eu le même problème. Dans mon cas, il s'est avéré que c'était un antivirus qui bloquait Shell . Il se trouve que le service informatique a mis en place des exceptions pour mon ordinateur pour une base de données mais pas pour l'autre. Voir ma question et ma réponse pour plus de détails.


3 commentaires

Voilà la réponse. Je vous remercie


@goldgerm Doux! C'est tellement étrange que nous ayons tous les deux eu le même problème étrange le même jour. Heureux que cela ait fonctionné :)


Tout à fait. Ça me rendait fou! Entre les 2 bases de données c'était littéralement LA. MÊME. CODE. et ne fonctionne toujours pas