Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
 

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
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
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
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
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
 

Cédric06400

XLDnaute Junior
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.


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
 

Discussions similaires

Réponses
12
Affichages
692
Réponses
6
Affichages
356
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…