IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Depuis VBA, ouvrir un .jpg, .gif, etc. dont le nom contient un espace, avec mspaint


Sujet :

Macros et VBA Excel

  1. #1
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut Depuis VBA, ouvrir un .jpg, .gif, etc. dont le nom contient un espace, avec mspaint
    Tout est dans le titre mais j'explique :
    J'utilise VBA pour ouvrir un fichier image par l'intermédiaire de mspaint.
    Permet de modifier le fichier avant un simple copier/coller.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call Shell("C:\WINDOWS\SYSTEM32\mspaint.exe " & NomFich, 3)
    Si le nom du fichier ne contient pas d'espace, pas de problème, tout se déroule normalement.
    Mais s'il en contient un, il n'est pas reconnu.
    J'ai testé avec ShortName mais il n'est resté que "Le" dans le nom du fichier (pour "Le truc.gif")
    Il doit bien exister une solution puisque Paint le fait sans rechigner quand il est utilisé directement.
    C'est cette solution qu'il me faudrait.
    Par avance merci.

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour, ousk,

    Si le nom de ton fichier contient des espaces ===>> mets-le entre guillemets, ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Command1_Click()
      nomfich = """d:\sans titre.bmp"""
      Call Shell("C:\WINNT\SYSTEM32\mspaint.exe " & nomfich, 3)
    End Sub
    Ceci étant, j'utiliserais plutôt ShellExecute (je n'aurais alors pas besoin d'utiliser le chemin de MsPaint.exe )

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Tiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private 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 nShowCmd As Long) As Long
     
    Private Declare Function FindWindowA Lib "user32" _
      (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
     
    Const SW_SHOWNORMAL = 1
     
    Private Sub Command1_Click()
      Dim leHwnd As Long, monfich As String
      monfich = """d:\sans titre.bmp"""
      leHwnd = FindWindowA(vbNullString, Me.Caption)
      ShellExecute leHwnd, vbNullString, monfich, vbNullString, "C:\", SW_SHOWNORMAL
    End Sub
    Toi, avec VBA qui n'a pas de handle de Userform, il te faut rajouter ce handle
    avec une fonction supplémentaire (tu l'as dans la FAQ) et( uytiliser le hwnd trouvé, à la place de me.hwnd

    EDIT : j'ai complété pour toi (VBA) en ce qui concerne le handle.

    Inutile de te préciser que si tu mets des guillemets alors que le nom n'a pas d'espaces, cela marche également, bien sûr, si bien que tu peux systématiquement ajouter les guillemets.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Par défaut
    Salut Ouskel'n'or,

    Face à ce problème, j'aurais essayé de "découper" le nom du fichier et de le reconstruire : exemple "Le truc.gif" deviendrait "L", "e", " ", "t",....avec une boucle style "right(nomfich,i)", ensuite je le regrouperais en faisant "nomfichier=right(nomfich,1) & right(nomfich,2) & ....".
    puis : "Call Shell("C:\WINDOWS\SYSTEM32\mspaint.exe " & nomfichier, 3)

    Le VBA reconnaitrait peut-être l'espace à ce moment ....

    (Je sais que je n'ai pas le niveau, mais j'essaye de "te renvoyer la pareille", tu as toujours été sympa de m'aider à trouver , eput-être que cette piste pourra t'aider...)

    A+

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour, ericdev67

    Pourquoi se lancer dans tout ce mic-mac ?
    Il suffit de mettre entre guillemets !

    Edit (j'en profite) : Ousk, si tu veux en plus que la fenêtre de Paint s'ouvre à l'intérieur de ton UserForm, tu dis ...
    Et si tu veux en plus que l'on inhibe le menu de paint, tu dis également (on sait faire)

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Par défaut
    Salut ucfoutu,



    T'as raison, les solutions les plus simples sont les meilleures.....J'ai zappé ta dernière remarque "Inutile de te préciser que si tu mets des guillemets alors que le nom n'a pas d'espaces, cela marche également, bien sûr, si bien que tu peux systématiquement ajouter les guillemets"

    Skuz

    A+

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Merci à tous, je vais tester tout ça. Je prendrai le plus court (juste un à ucfoutu)
    Merci pour shellexecute, je n'y avais pas pensé, mais n'y a-t-il rien à déclarer ou de référence à valider ?
    A tout'

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Non...

    Juste les déclarations dans le code, s'agissant de fonctions de l'Api de Windows. Rien à charger.

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Pour ceux que ça intéressent, grâce à une idée de plusieurs, ouvre le fichier avec plein d'espaces dans Paint ouvert en premier plan.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
       (ByVal bla As Long, ByVal ble As String, _
        ByVal bli As String, ByVal blo As String, _
        ByVal blu As String, ByVal bly As Long) As Long
     
    Sub Lancer(NomComplet as string)
      ShellExecute 0, "open", NomComplet, "", "", 3 'le 3 c'est pour le plein écran en premier plan 
    End sub
    Faut simplement envoyer le chemin et le nom du fichier concaténés.
    Avec les triples guillemets, pas réussi et c'est normal puisque le nom de mon fichier est Me.textbox2. J'étais pourtant content, j'avais réussi à faire
    ""C:\DOCUME~1\User\MESDOC~1\MESIMA~1\ & Me.Textbox2 & ""
    ........................................................................
    Merci à tous.
    A très bientôt

    Edit
    Merci pour tes explications, ucfoutu, mais je veux simplement accéder au fichier, éventuellement le modifier et faire un copier/coller.

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonsoir, Ousk,

    Je n'aime vraiment pas cette histoire de hwnd = 0 (pour ramener au plus bas niveau des hwnd).... Que demain, pour une raison ou l'autre, Windows change cette "position primaire" et l'appli ne tournera plus !

    De surcroît : même ainsi : Ce ne sera jamais à ta fenêtre que Windows enverra des messages éventuels, mais à ... ton bureau !

    Raccroche-toi systématiquement à un hwnd identifiable (celui de la fenêtre active en est forcément un et c'est de très loin le plus indiqué....).

    Je n'aime pas non plus (pour les mêmes raisons) que l'on remplace le vbnullstring par "" et le répertoire par défaut par ""

    Il n'est par contre pas indispensable de spécifier "open" pour le paramètre lpoperation (le 2ème de la fonction) ... car :

    The lpOperation parameter can be NULL. In that case, the function opens the file specified by lpFile.
    Mais les choses tournent ainsi et tu es satisfait ?
    N'en parlons donc plus !

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Merci pour tes conseils, ucfoutu. Comme je ne pense pas que mon appli sera utilisée telle quelle, je ne pense pas non plus qu'elle dure assez longtemps pour poser problème aux générations futures
    Je crois que tu n'as pas Excel... C'est dommage, j'aurais pu te faire tester
    Bonne soirée

  12. #12
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Je crois que tu n'as pas Excel... C'est dommage, j'aurais pu te faire tester
    Tu n'y es pas, Ousk,

    1) j'ai Excel sur mon, portable

    2) Excel ou pas, ta façon (même depuis VB6 et même depuis un autre outil de développement acceptant la déclaration et l'exécution de fonctions de l'Api de Windows) de "court-circuiter" certains paramètres de la fonction marcherait !... Le problème n'est pas là du tout et Excel n'a rien à y voir !.... l'utilisation correcte de l'Api de Windows est et restera cette utilisation correcte (celle que recommande Microsoft). Lorsque la fonction ShellExecute est exécutée, ce n'est ni Excel ni VB6 ni quoi que ce soit d'autre que la libraiirie Shell32 qui intervient.

    Prends le temps de lire ceci :

    http://msdn2.microsoft.com/en-us/library/bb762153.aspx

    et attarde-toi le temps qu'il faut sur ce que spécifie (comment et pourquoi) chacun des paramètres utilisés par cette fonction.


    Bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] Proc SQL sur des variables dont le nom contient des espaces
    Par Oreo_ dans le forum SAS Base
    Réponses: 3
    Dernier message: 23/05/2013, 16h20
  2. Réponses: 3
    Dernier message: 26/07/2011, 19h27
  3. Réponses: 1
    Dernier message: 06/09/2010, 17h48
  4. copy dans un dossier dont le nom contient un espace
    Par amirym dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 23/06/2007, 19h54
  5. Réponses: 11
    Dernier message: 26/04/2007, 16h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo