Microsoft 365 Application.GetOpenFilename et multiSelect

Cédric06400

XLDnaute Junior
Bonjour,

j'ai créé un code pour importer une photo depuis un UF vers ma feuille active avec mise en forme.

Maintenant j'aimerai modifier ce code pour que pouvoir sélectionner plusieurs photos en meme temps.

Tout en gardant la section de toutes les photos pour une mise en forme glogale.

Sub Cmd_image()

On Error Resume Next
Photo = Application.GetOpenFilename("Fichiers jpg,*.jpg")
If Not Photo = False Then
Set monimage = ActiveSheet.Pictures.Insert(Photo)
End If
'
If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
Formatphoto
Else
Formatphotosans
End If
On Error GoTo 0

End Sub

Pourriez vous m'aider ?

Merci
 
Solution
re
Bonjour @fanch55 oui tu a raison je sais pas pourquoi je l'ai enlevé dans le else
va savoir des fois :oops:je déraille
edit:
heu ..non ma reponse en post #12 est valide

VB:
Sub Cmd_image()
    Dim photo As Variant, I&, OK As Boolean ' variables

    photo = Application.GetOpenFilename("Image JpG (*.jpg;*.jpeg), *.jpg;*.jpeg", 1, "CHOISIR DES IMAGES", , True)
    'ouverture du dialog

    If IsArray(photo) Then ' si multi selection

        'OK devient true ou false selon la reponse
        If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then OK = True

        For I = LBound(photo) To UBound(photo) 'boucle sur tout les item selectionnés dans le dialog

            Set monimage =...

patricktoulon

XLDnaute Barbatruc
Bonjour
photo doit être variant et on boucle sur ce variant
comme ceci : le code est commenté
VB:
Sub Cmd_image()
    Dim photo As Variant, I& ' variables

    photo = Application.GetOpenFilename("Fichiers jpg,*.jpg") 'ouverture du dialog
   
    If photo = False Then Exit Sub ' si click sur annuler ou fermeture par croix

    If IsArray(photo) Then ' si multi selection
        For I = LBound(photo) To UBound(photo) 'boucle sur tout les item selectionnés dans le dialog

            Set monimage = ActiveSheet.Pictures.Insert(photo(I)) 'insertion de la photo
           
            ' à chaque  nouvelle photo question et traitement en fonction de la réponse
            If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
                Formatphoto 'appel de la sub pour formater
            Else
                Formatphotosans 'appel de la sub sans formatage
            End If
       
        Next

    Else 'sinon si il y a qu'une photo

        Set monimage = ActiveSheet.Pictures.Insert(photo) 'insertion photo
       
        'question et traitement en fonction de la réponse pour la seul photo selectionnée
        If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
            Formatphoto 'appel de la sub pour formater
        Else
            Formatphotosans 'appel de la sub sans formatage
        End If
 
    End If

End Sub

on pourrait simplifier en ne demandant qu'une seule fois la question de mise en forme
sauf si c'est pour le cas ou les photo serait retourné là par contre on laisse comme ça car c'est au cas par cas
bonne route
patrick ;)
 

Cédric06400

XLDnaute Junior
Bonjour
photo doit être variant et on boucle sur ce variant
comme ceci : le code est commenté
VB:
Sub Cmd_image()
    Dim photo As Variant, I& ' variables

    photo = Application.GetOpenFilename("Fichiers jpg,*.jpg") 'ouverture du dialog
  
    If photo = False Then Exit Sub ' si click sur annuler ou fermeture par croix

    If IsArray(photo) Then ' si multi selection
        For I = LBound(photo) To UBound(photo) 'boucle sur tout les item selectionnés dans le dialog

            Set monimage = ActiveSheet.Pictures.Insert(photo(I)) 'insertion de la photo
          
            ' à chaque  nouvelle photo question et traitement en fonction de la réponse
            If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
                Formatphoto 'appel de la sub pour formater
            Else
                Formatphotosans 'appel de la sub sans formatage
            End If
      
        Next

    Else 'sinon si il y a qu'une photo

        Set monimage = ActiveSheet.Pictures.Insert(photo) 'insertion photo
      
        'question et traitement en fonction de la réponse pour la seul photo selectionnée
        If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
            Formatphoto 'appel de la sub pour formater
        Else
            Formatphotosans 'appel de la sub sans formatage
        End If
 
    End If

End Sub

on pourrait simplifier en ne demandant qu'une seule fois la question de mise en forme
sauf si c'est pour le cas ou les photo serait retourné là par contre on laisse comme ça car c'est au cas par cas
bonne route
patrick ;)
Hello merci,

je testerais ta solution ce soir.

J'avais une solution avec une boucle, mais ça lagué. Je vais tester

Bien à toi
 

Cédric06400

XLDnaute Junior
Bonjour
photo doit être variant et on boucle sur ce variant
comme ceci : le code est commenté
VB:
Sub Cmd_image()
    Dim photo As Variant, I& ' variables

    photo = Application.GetOpenFilename("Fichiers jpg,*.jpg") 'ouverture du dialog
  
    If photo = False Then Exit Sub ' si click sur annuler ou fermeture par croix

    If IsArray(photo) Then ' si multi selection
        For I = LBound(photo) To UBound(photo) 'boucle sur tout les item selectionnés dans le dialog

            Set monimage = ActiveSheet.Pictures.Insert(photo(I)) 'insertion de la photo
          
            ' à chaque  nouvelle photo question et traitement en fonction de la réponse
            If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
                Formatphoto 'appel de la sub pour formater
            Else
                Formatphotosans 'appel de la sub sans formatage
            End If
      
        Next

    Else 'sinon si il y a qu'une photo

        Set monimage = ActiveSheet.Pictures.Insert(photo) 'insertion photo
      
        'question et traitement en fonction de la réponse pour la seul photo selectionnée
        If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
            Formatphoto 'appel de la sub pour formater
        Else
            Formatphotosans 'appel de la sub sans formatage
        End If
 
    End If

End Sub

on pourrait simplifier en ne demandant qu'une seule fois la question de mise en forme
sauf si c'est pour le cas ou les photo serait retourné là par contre on laisse comme ça car c'est au cas par cas
bonne route
patrick ;)
Hello,
Je viens de tester ta solution
Lors de l'ouverture de la boite de dialogue je ne peux sélectionner qu'une seule photo
Merci de ton retour

Cédric
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour
oui mille excuses j'ai fait la moitié du travail
VB:
Sub Cmd_image()
    Dim photo As Variant, I& ' variables

    photo = Application.GetOpenFilename("Image JpG (*.jpg;*.jpeg), *.jpg;*.jpeg", 1, "CHOISIR DES IMAGES", , True)
    'ouverture du dialog

    If IsArray(photo) Then ' si multi selection
        For I = LBound(photo) To UBound(photo) 'boucle sur tout les item selectionnés dans le dialog

            Set monimage = ActiveSheet.Pictures.Insert(photo(I)) 'insertion de la photo

            ' à chaque  nouvelle photo question et traitement en fonction de la réponse
            If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
                Formatphoto 'appel de la sub pour formater
            Else
                Formatphotosans 'appel de la sub sans formatage
            End If

        Next

    Else 'sinon si il y a qu'une photo

        If photo = False Then Exit Sub ' si click sur annuler ou fermeture par croix

        Set monimage = ActiveSheet.Pictures.Insert(photo) 'insertion photo

        'question et traitement en fonction de la réponse pour la seul photo selectionnée
        If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
            Formatphoto 'appel de la sub pour formater
        Else
            Formatphotosans 'appel de la sub sans formatage
        End If

    End If

End Sub
 

job75

XLDnaute Barbatruc
Bonjour Cédric06400, Patrick,

Au lieu de Application.GetOpenFilename utilisez Application.FileDialog(msoFileDialogFilePicker)

Avec .AllowMultiSelect = True

Qu'il y ait un ou plusieurs fichiers sélectionnés l'utilisation est la même avec .SelectedItems.

A+
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour @job75
oui encodé dans un bloc with pour le test show -1 sinon c'est le boom quand on annule
return à prendre en considération
  1. un
  2. plusieurs
  3. annuler
getopenfilename lui renvoie
  1. un variant string pour un
  2. un variant() array pour plusieurs
  3. false si annuler
et cela sans avoir besoins de tester le .show bien évidemment puisque c'est une fonction externe ouvrant un dialog et renvoyant ce qui est fait dans le dialog
 

Cédric06400

XLDnaute Junior
re
Bonjour
oui mille excuses j'ai fait la moitié du travail
VB:
Sub Cmd_image()
    Dim photo As Variant, I& ' variables

    photo = Application.GetOpenFilename("Image JpG (*.jpg;*.jpeg), *.jpg;*.jpeg", 1, "CHOISIR DES IMAGES", , True)
    'ouverture du dialog

    If IsArray(photo) Then ' si multi selection
        For I = LBound(photo) To UBound(photo) 'boucle sur tout les item selectionnés dans le dialog

            Set monimage = ActiveSheet.Pictures.Insert(photo(I)) 'insertion de la photo

            ' à chaque  nouvelle photo question et traitement en fonction de la réponse
            If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
                Formatphoto 'appel de la sub pour formater
            Else
                Formatphotosans 'appel de la sub sans formatage
            End If

        Next

    Else 'sinon si il y a qu'une photo

        If photo = False Then Exit Sub ' si click sur annuler ou fermeture par croix

        Set monimage = ActiveSheet.Pictures.Insert(photo) 'insertion photo

        'question et traitement en fonction de la réponse pour la seul photo selectionnée
        If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
            Formatphoto 'appel de la sub pour formater
        Else
            Formatphotosans 'appel de la sub sans formatage
        End If

    End If

End Sub
Hello,
Merci beaucoup pour le code qui fonctionne parfaitement.
J'ai cependant une amélioration à te demander.
Avec ce code tu boucles sur chaque photo pour demander le type de Mise en forme, ce qui peut être fastidieux si tu as beaucoup de photos.
Ce que j'applique manuellement depuis des années c'est de réaliser la mise en forme sur l'ensemble de la sélection, ce qui permet de répondre une seule fois à la question.
Je sais que j'abuse, j'ai fait beaucoup de progrès grâce à vous tous, malheureusement je suis encore très limité.
Si tu as encore quelques minutes ...
Merci infiniment
Cédric
 

patricktoulon

XLDnaute Barbatruc
Bonjour @Cédric06400
Avec ce code tu boucles sur chaque photo pour demander le type de Mise en forme, ce qui peut être fastidieux si tu as beaucoup de photos.
Ce que j'applique manuellement depuis des années c'est de réaliser la mise en forme sur l'ensemble de la sélection, ce qui permet de répondre une seule fois à la question.
c'est justement la proposition que je t'ai faite en post#2
je cite
on pourrait simplifier en ne demandant qu'une seule fois la question de mise en forme
sauf si c'est pour le cas ou les photo serait retourné là par contre on laisse comme ça car c'est au cas par cas
donc voila la simplification pour la selection multiple dans le dialog
VB:
Sub Cmd_image()
    Dim photo As Variant, I&, OK As Boolean ' variables

    photo = Application.GetOpenFilename("Image JpG (*.jpg;*.jpeg), *.jpg;*.jpeg", 1, "CHOISIR DES IMAGES", , True)
    'ouverture du dialog

    If IsArray(photo) Then ' si multi selection

        'OK devient true ou false selon la reponse
        If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then OK = True

        For I = LBound(photo) To UBound(photo) 'boucle sur tout les item selectionnés dans le dialog

            Set monimage = ActiveSheet.Pictures.Insert(photo(I)) 'insertion de la photo

            If OK Then 'si OK est true on formate
                ' à chaque  nouvelle photo question et traitement en fonction de la réponse
                Formatphoto 'appel de la sub pour formater
            Else 'sinon on formate pas
                Formatphotosans 'appel de la sub sans formatage
            End If

        Next

    Else 'sinon si il y a qu'une photo

        If photo = False Then Exit Sub ' si click sur annuler ou fermeture par croix

        Set monimage = ActiveSheet.Pictures.Insert(photo) 'insertion photo

        ' dans la partie un seul fichier selectionné on change pas le code
        'question et traitement en fonction de la réponse pour la seul photo selectionnée
        If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
            Formatphoto 'appel de la sub pour formater
        Else
            Formatphotosans 'appel de la sub sans formatage
        End If

    End If

End Sub
voili voilou
si ton problème est résolu pointe le comme solution sur la réponse qui te convient le plus
1730275572623.png
 

Cédric06400

XLDnaute Junior
Bonjour @Cédric06400

c'est justement la proposition que je t'ai faite en post#2
je cite

donc voila la simplification pour la selection multiple dans le dialog
VB:
Sub Cmd_image()
    Dim photo As Variant, I&, OK As Boolean ' variables

    photo = Application.GetOpenFilename("Image JpG (*.jpg;*.jpeg), *.jpg;*.jpeg", 1, "CHOISIR DES IMAGES", , True)
    'ouverture du dialog

    If IsArray(photo) Then ' si multi selection

        'OK devient true ou false selon la reponse
        If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then OK = True

        For I = LBound(photo) To UBound(photo) 'boucle sur tout les item selectionnés dans le dialog

            Set monimage = ActiveSheet.Pictures.Insert(photo(I)) 'insertion de la photo

            If OK Then 'si OK est true on formate
                ' à chaque  nouvelle photo question et traitement en fonction de la réponse
                Formatphoto 'appel de la sub pour formater
            Else 'sinon on formate pas
                Formatphotosans 'appel de la sub sans formatage
            End If

        Next

    Else 'sinon si il y a qu'une photo

        If photo = False Then Exit Sub ' si click sur annuler ou fermeture par croix

        Set monimage = ActiveSheet.Pictures.Insert(photo) 'insertion photo

        ' dans la partie un seul fichier selectionné on change pas le code
        'question et traitement en fonction de la réponse pour la seul photo selectionnée
        If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
            Formatphoto 'appel de la sub pour formater
        Else
            Formatphotosans 'appel de la sub sans formatage
        End If

    End If

End Sub
voili voilou
si ton problème est résolu pointe le comme solution sur la réponse qui te convient le plus
Regarde la pièce jointe 1206163
Hello,

Pardon mais j'ai 2 soucis :

Le 1ere est que la boucle sur la mise en forme de chaque photo est toujours présente, alors qu'on souhaite formater l'ensemble de la sélection sur une seule réponse.
1730358226747.png


Ensuite une fois la (les) photo(s) insérée(s) la macro ne garde pas la sélection aussi les macros de mise en forme s'arrêtent.

Sub Formatphoto()
'
Selection.ShapeRange.Height = 113.3858267717
Selection.ShapeRange.IncrementRotation 90
Selection.ShapeRange.ZOrder msoSendToBack
End Sub

Sub Formatphotosans()
'
Selection.ShapeRange.Height = 113.3858267717
Selection.ShapeRange.ZOrder msoSendToBack
End Sub

On y est presque encore merci pour ton aide

Cédric
 

Cédric06400

XLDnaute Junior
Bonjour @Cédric06400

c'est justement la proposition que je t'ai faite en post#2
je cite

donc voila la simplification pour la selection multiple dans le dialog
VB:
Sub Cmd_image()
    Dim photo As Variant, I&, OK As Boolean ' variables

    photo = Application.GetOpenFilename("Image JpG (*.jpg;*.jpeg), *.jpg;*.jpeg", 1, "CHOISIR DES IMAGES", , True)
    'ouverture du dialog

    If IsArray(photo) Then ' si multi selection

        'OK devient true ou false selon la reponse
        If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then OK = True

        For I = LBound(photo) To UBound(photo) 'boucle sur tout les item selectionnés dans le dialog

            Set monimage = ActiveSheet.Pictures.Insert(photo(I)) 'insertion de la photo

            If OK Then 'si OK est true on formate
                ' à chaque  nouvelle photo question et traitement en fonction de la réponse
                Formatphoto 'appel de la sub pour formater
            Else 'sinon on formate pas
                Formatphotosans 'appel de la sub sans formatage
            End If

        Next

    Else 'sinon si il y a qu'une photo

        If photo = False Then Exit Sub ' si click sur annuler ou fermeture par croix

        Set monimage = ActiveSheet.Pictures.Insert(photo) 'insertion photo

        ' dans la partie un seul fichier selectionné on change pas le code
        'question et traitement en fonction de la réponse pour la seul photo selectionnée
        If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
            Formatphoto 'appel de la sub pour formater
        Else
            Formatphotosans 'appel de la sub sans formatage
        End If

    End If

End Sub
voili voilou
si ton problème est résolu pointe le comme solution sur la réponse qui te convient le plus
Regarde la pièce jointe 1206163
Hello je me permet de revenir vers toi,


Pardon mais j'ai 2 soucis :

Le 1ere est que la boucle sur la mise en forme de chaque photo est toujours présente, alors qu'on souhaite formater l'ensemble de la sélection sur une seule réponse.
1730358226747.png



Ensuite une fois la (les) photo(s) insérée(s) la macro ne garde pas la sélection aussi les macros de mise en forme s'arrêtent.

Sub Formatphoto()
'
Selection.ShapeRange.Height = 113.3858267717
Selection.ShapeRange.IncrementRotation 90
Selection.ShapeRange.ZOrder msoSendToBack
End Sub

Sub Formatphotosans()
'
Selection.ShapeRange.Height = 113.3858267717
Selection.ShapeRange.ZOrder msoSendToBack
End Sub

On y est presque encore merci pour ton aide

Cédric
 

patricktoulon

XLDnaute Barbatruc
bonjour
et bien on select pas on cible
VB:
Sub Cmd_image()
    Dim photo As Variant, I&, OK As Boolean ' variables

    photo = Application.GetOpenFilename("Image JpG (*.jpg;*.jpeg), *.jpg;*.jpeg", 1, "CHOISIR DES IMAGES", , True)
    'ouverture du dialog

    If IsArray(photo) Then ' si multi selection

        'OK devient true ou false selon la reponse
        If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then OK = True

        For I = LBound(photo) To UBound(photo) 'boucle sur tout les item selectionnés dans le dialog

            Set monimage = ActiveSheet.Pictures.Insert(photo(I)) 'insertion de la photo

            If OK Then 'si OK est true on formate
                ' à chaque  nouvelle photo question et traitement en fonction de la réponse
                Formatphoto monimage 'appel de la sub pour formater
            Else 'sinon on formate pas
                Formatphotosans monimage 'appel de la sub sans formatage
            End If

        Next

    Else 'sinon si il y a qu'une photo

        If photo = False Then Exit Sub ' si click sur annuler ou fermeture par croix

        Set monimage = ActiveSheet.Pictures.Insert(photo) 'insertion photo

        ' dans la partie un seul fichier selectionné on change pas le code
        'question et traitement en fonction de la réponse pour la seul photo selectionnée
        If MsgBox("Mise en forme avec rotation ?", vbYesNoCancel, "Mise en forme photo") = vbYes Then
            Formatphoto monimage 'appel de la sub pour formater
        Else
            Formatphotosans monimage 'appel de la sub sans formatage
        End If

    End If

End Sub

Sub Formatphoto(img)
    With ActiveSheet.Shapes(img.Name)
        .Height = 113.3858267717
        .IncrementRotation 90
        .ZOrder msoSendToBack
    End With
End Sub

Sub Formatphotosans(img)
    With ActiveSheet.Shapes(img.Name)
        .Height = 113.3858267717
        .ZOrder msoSendToBack
    End With
End Sub
 

Cédric06400

XLDnaute Junior
j'avoue que je pige pas ta question la
qu'est ce qu'on en a a foutre de les faire toute en même temps ou l'une après l'autre lors de insertion ?
Hello,
Il n'est pas rare que j'importe 50 photos en même temps, donc répondre 50 fois à la même question est inutile.
Ce qui rend l'opération inutile dans mon cas.
Ce programme vise à intégrer la fonction "insérer un ou des image"
1731043679556.png
dans un userform qui me permet de trier, déplacer et placer correctement les photos dans chaque rapport.
1731043821908.png

Voila maintenant tu sais tout.
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
315 087
Messages
2 116 083
Membres
112 655
dernier inscrit
fannycordi