insérer et renommer avec une macro.

pa44pa28

XLDnaute Nouveau
Insérer et renommer une image avec une macro.

Bonjour à tous,
Je suis nouveau, je ne sais pas s'il ya un topic de présentation. Donc dites-le moi s'il y a des "formalités" à remplir...

Cela fait déjà quelques temps que je parcoure ce forum à la recherche d'informations sur les macros. Il y a 5 jours, je n'imaginais même pas que ça puisse éxister, et c'est dans le cadre d'un travail à faire que j'ai dû m'y mettre. Mes connaisssances sont donc proches de zéro et donc, pour parvenir à mes fins, j'ai procédé par imitation des matrices que j'ai pu rencontrer et trouver. Cependant, je suis bel et bien bloqué pour de bon.

Je vous expose mon problème : j'aimerai pouvoir insérer dans une cellule, une image et la renommer en même temps par l'intermédiaire d'une boîte de dialogue où l'on pourrait entrer le nom voulu. J'ai déjà réussi à réaliser la partie insertion mais c'est la partie renommage qui me bloque.

J'ai sur une feuille Excel, 8 cadres où je peux insérer et redimensionner de manière automatique les photos que j'insère. Pour contourner le problème, j'ai jusqu'à présent, créer 8 macros, avec le renommage à la fin par défaut : cf avant dernière ligne.

Code:
Sub insere_image_ratio_1q()
Dim ficimg As String, Ad As String
Dim MemW As Long, MemH As Long, T As Integer, L As Integer
Dim Lg As Integer, HT As Integer, RatioCell As Single
Dim CellH As Long, CellW As Long, RatioHz As Single, RatioVt As Single
    Ad = Selection.Address
    CellH = Selection.Height
    CellW = Selection.Width
    ficimg = Application.GetOpenFilename(".jpg,*.jpg", , "Choisissez l'image") ' choix nom du fichier
    If ficimg = "Faux" Then Exit Sub
    ActiveSheet.Pictures.Insert(ficimg).Select ' insertion
    With Selection.ShapeRange
        MemW = .Width: MemH = .Height
        'adapte les ratio
        If MemH < CellH And MemW < CellW Then
        'l'image < cellule
            RatioHz = MemH / CellH
            RatioVt = MemW / CellW
            If RatioVt < RatioHz Then 'adapter en hauteur
                HT = CellH:  Lg = MemW * (HT / MemH)
                T = 0: L = (CellW - Lg) / 2
            Else 'adapter en largeur
                Lg = CellW: HT = MemH * (CellW / MemW)
                L = 0: T = (CellH - HT) / 2
            End If
        ElseIf MemH > CellH And MemW > CellW Then
        'l'image > cellule
            RatioHz = CellH / MemH
            RatioVt = CellW / MemW
            If RatioVt > RatioHz Then 'adapter en hauteur
                HT = CellH:  Lg = MemW * (HT / MemH)
                T = 0: L = (CellW - Lg) / 2
            Else 'adapter en largeur
                Lg = CellW: HT = MemH * (Lg / MemW)
                L = 0: T = (CellH - HT) / 2
            End If
        ElseIf MemH > CellH And MemW < CellW Then
        'adapter en hauteur
            HT = CellH:  Lg = MemW * (HT / MemH)
            T = 0: L = (CellW - Lg) / 2
        ElseIf MemH < CellH And MemW > CellW Then
        'adapter en largeur
            Lg = CellW: HT = MemH * (Lg / MemW)
            L = 0: T = (CellH - HT) / 2
        Else
            Stop ' pas prévu ?
        End If
        
        .LockAspectRatio = False ' proportions d'origine lorsque vous la redimensionnez
        .Top = Range(Ad).Top + T ' haut de la cellule
        .Left = Range(Ad).Left + L ' gauche de la cellule
        .Height = HT
        .Width = Lg ' largeur des cellules fusionnées
    End With
    With Selection
        .Placement = xlMoveAndSize
        .PrintObject = True
    End With
    Selection.Name = "photo1"
End Sub

J'ai trouvé des macros pour renommer qqchose par l'intermédiare d'une inputbox mais uniquement pour renommer des feuilles d'un classeur comme sur ce topic : https://www.excel-downloads.com/threads/creer-une-inputbox-pour-renommer-un-onglet.121523/

Mais il faudrait remplacer dans la macro, la feuille par "la sélection" dans mon cas ou par "l'image" dans le code suivant, qui lui sert à renommer des feuilles :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim vr As String
Dim pl As Range
Dim r As Range
Dim pa As String

    If Target.Address <> "$B$4" Then Exit Sub
    If Target.Value = "" Then Exit Sub
    Target.Select
    vr = Range("B4").Value

    Set pl = Sheets("base de donnée").Range("A1").CurrentRegion
    Set pl = pl.Offset(1, 0).Resize(pl.Rows.Count - 1, pl.Columns.Count)

    pl.Interior.ColorIndex = xlNone
    Set r = pl.Find(vr, LookAt:=xlPart)
    If Not r Is Nothing Then
        pa = r.Address
        Do
            r.Interior.ColorIndex = 3
            Set r = pl.FindNext(r)
        Loop While Not r Is Nothing And r.Address <> pa
        Sheets("base de donnée").Activate
    Else
        MsgBox "Valeur non trouvée !"
    End If
End Sub
Merci d'avance.

Damien
 

Pièces jointes

  • test.xlsm
    24.7 KB · Affichages: 76
  • test.xlsm
    24.7 KB · Affichages: 78
  • test.xlsm
    24.7 KB · Affichages: 83
Dernière édition:

JNP

XLDnaute Barbatruc
Re : insérer et renommer avec une macro.

Bonjour Pa44Pa28 et bienvenue :cool:,
Oui, il y a une section où il est bien de se présenter ;).
Il y a aussi Lien supprimé à lire pour éviter les bévues...
Il y a une balise à cliquer (le # au dessus) pour mettre le code dans une présentation qui soient plus lisible.
Ceci expliquant peut-être cela, sur le nombre de réponse que tu as eu :rolleyes:...
Bon, j'ai pris mon courage à 2 mains et ai lu toute ta prose :p...
Code:
Dim NomImage As String
NomImage = InputBox("Nom de l'image ?", "Photo", "Photo1")
Selection.Name = Replace(NomImage, " ", "_")
devrait fonctionner. Attention, je n'ai remplacé que les "blancs" qui sont interdits, mais il faudrait certainement filtrer plus...
D'autre part, il faudrait ajouter un test pour vérifier si le nom n'est pas déjà utilisé.
Bon courage :cool:
 

pa44pa28

XLDnaute Nouveau
Re : insérer et renommer avec une macro.

ok merci beaucoup. Je vais voir ce que ça donne.
J'avais déjà jeté un coup d'oeil à la charte.
edit : Par contre, je ne comprends pas trop ce que tu veux dire par "Attention, je n'ai remplacé que les "blancs" qui sont interdits".

Pour le test, ça devrait rouler tout seul.

EDIT 2 : SUPER MERCI, CA MARCHE, CA COURE MEME. Merci beaucoup.

EDIT 3 : Bah en fait c'est plus compliqué que je ne le croyais pour le test du nom éxistant.
Donc, dans le code suivant quelques est la partie correspondant au test ? (Je demande ça car mes essais sont vains et j'aimerai comprendre sans que l'on me donne la réponse.)

Code:
Private Sub CommandButton1_Click()
'
' copy Macro
' Macro enregistrée le 17/12/2008 par Pol SOUMILLON
'
    Dim Msg, Style, Title, Help, Ctxt, Response, MyString
    Dim nom As String
    Dim nom1 As String
    Dim i As Byte
    Dim verif As Boolean
    Dim dte As Date
    Dim dte1 As String
'
' Sauve le classeur actif
    ActiveWorkbook.Save
' Sélection la feuille MODELE et la copie
    Sheets("MODELE").Select
    Sheets("MODELE").copy After:=Sheets(1)
' Renommer la feuille.
' Définit dte et dte1 avec l'année en cours
    dte = Now()
    dte1 = Format(dte, "yyyy")
'
' Définit le message d'invite
    Msg = "Définissez le nom de la nouvelle feuille" & Chr$(10)
    Msg = Msg & "Entrez le nom du mois auquel le calcul horaire" & Chr$(10)
    Msg = Msg & "fait référence" & Chr$(10)
    Msg = Msg & "caractères interdits : / \ ? * [ ]"
recom:
    verif = False
    nom = InputBox(Msg, "CALCUL HORAIRE")
    If nom = "" Then
        GoTo recom
    Else
        For i = 1 To Sheets.Count
            If Sheets(i).Name = nom Then
                verif = True
            End If
        Next
    End If
'
    If verif = True Then
        MsgBox "La feuille " & nom & " existe déjà, veuillez choisir un autre nom!"
        GoTo recom:
    End If
'
    nom1 = nom & " " & dte1
'
    verif = False
    For i = 1 To Sheets.Count
        If Sheets(i).Name = nom1 Then
            verif = True
            End If
        Next
'
    If verif = True Then
        MsgBox "La feuille " & nom1 & " existe déjà, veuillez choisir un autre nom!"
        GoTo recom:
    End If
'
    ActiveSheet.Name = nom1
End Sub
 
Dernière édition:

pa44pa28

XLDnaute Nouveau
Re : insérer et renommer avec une macro.

Nouveau message car nouveau problème.

Bon, j'ai maintenant un deuxième problème un peu différent du premier mais relevant encore du domaine d'Excel.
il s'agit de l'application de filtres. Pour une colonne de données, j'applique un filtre automatique et excel me crée un menu déroulant avec les différents entités. J'aimerai rajouter dans ce menu, un filtre qui regroupe toutes les cellules contenant entre autre le mot "premium". cf image. On peut le faire d'une certaine manière en passant par les filtres personnalisés, mais il est impossible de garder plusieurs filtres persos en parallèle,(sans nécessairement sans servir). Est-ce possible sans passer par les filtres élaborés ? Sinon, quelqu'un peut-il m'expliquer comment faire, car malgré les différents tutos trouvés sur Internet, je n'y arrive pas.
 

Pièces jointes

  • premium.jpg
    premium.jpg
    41.7 KB · Affichages: 82
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : insérer et renommer avec une macro.

Bonjour pa44pa28,

A ma connaissance, le contenu des listes déroulantes des filtres automatiques ne sont pas personnalisables (en Excel 2000 - 2003 en tout cas, je n'ai pas 2007)

Maintenant, il est sans doute possible de faire une liste déroulante personnalisée qui appliquerait le filtre automatique par macro (avec Données-Validation par exemple)
 

JNP

XLDnaute Barbatruc
Re : insérer et renommer avec une macro.

Re :),
EDIT 3 : Bah en fait c'est plus compliqué que je ne le croyais pour le test du nom éxistant.
Donc, dans le code suivant quelques est la partie correspondant au test ? (Je demande ça car mes essais sont vains et j'aimerai comprendre sans que l'on me donne la réponse.)
C'est pas si évident que ça de répondre, sans donner la réponse :p...
Code:
Dim NomImage As String, MaPhoto As Shape
Recommence:
NomImage = InputBox("Nom de l'image ?", "Photo", Selection.Name)
For Each MaPhoto In Sheets("Feuil1").Shapes
If MaPhoto.Name = NomImage Then
MsgBox "Ce nom est déjà utilisé !", vbCritical, "ATTENTION"
GoTo Recommence
End If
Next
Selection.Name = Replace(NomImage, " ", "_")
En gros, j'ai ajouté une variable "Forme" dont font partie les photos. J'ai mis une étiquette (Recommence: ) qui permet de faire repartir l'exécution depuis cette étiquette.
J'ai modifié la troisième partie de l'InputBox pour qu'il propose le nom existant comme départ.
Ensuite, je regarde toutes les formes de la feuille 1, et je regarde si le nom est déjà utilisé.
Bon courage :cool:
 

pa44pa28

XLDnaute Nouveau
Re : insérer et renommer avec une macro.

Ok merci à vous deux. ;) .Sauf que JNP,
Code:
For Each MaPhoto In Sheets("Feuil1").Shapes
, ça ne me plait pas trop ça parce que ça voudrait dire qu'il faudrait que je crée une macro pour chaque page différente. Or j'ai plus d'une cinquantaine de pages. En fait, c'est uniquement sur la page active que ça doit être valable. Donc en replaçant par activeSheet, ça devrait le faire.

EDIT : ah bah non ça fonctionne pas. Je cherche.
 
Dernière édition:

pa44pa28

XLDnaute Nouveau
Re : insérer et renommer avec une macro.

Quel est est la différence entre être dans un module, et être dans le module de feuille ? Comment peut-on le savoir ?

EDIT : C'est bon ça fonctionne. Merci. J'avais dû faire une bétise avant car c'est exactement ce que j'avais modifié avec ActiveSheet. Enfin bref, Ça fonctionne. Par contre, ma question tient toujours, car ça pourrait me servir plus tard.
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : insérer et renommer avec une macro.

Re :),
Quel est est la différence entre être dans un module, et être dans le module de feuille ? Comment peut-on le savoir ?
Dans l'éditeur VBA, il est possible de mettre des macros dans chaque feuille (avec une portée de niveau feuille, généralement utilisés pour les boutons sur la feuille, ou des événementielles), dans le module ThisWorkbook (généralement utilisés pour le Open, le Close, ou des événementielles concernant tout le classeur), et enfin des modules que tu crée (portée sur tous les classeurs ouverts). Mon explication est généraliste et pas forcément 100% exacte :).
En plus de ça, tu as les modules de Classe (que j'ai jamais bien compris :eek:), et les modules ratachés aux USF.
Bonne journée :cool:
 

Discussions similaires

Réponses
6
Affichages
641

Statistiques des forums

Discussions
312 217
Messages
2 086 354
Membres
103 197
dernier inscrit
sandrine.lacaussade@orang