MAC : autoriser l'accès à des fichiers

Bonjour,

Ce sujet semble traité dans beaucoup de forum mais je n'arrive pas à trouver de solution.

je ne suis pas super fort non plus en VBA...

Voici ma problématique :

Pour importer de manière automatique des images dans un fichier excel, j'ai créé une macro (+ de 1000 images à traiter).

principe du code :

1/ pour chaque ligne, en dernière colonne je crée le chemin d'accès à l'image souhaitée

2/ La macro boucle jusqu'à la fin de la feuille et insère une image, redimensionnée et liée à la cellule

NB : je crée un dossier image contenant les images en version vignette pour des raisons de poids.

A chaque fichier image la macro me demande de valider deux fois l'accès.
J'essaye d'utiliser GrantAccessToMultipleFiles sans succès.

Voici le code

Sub insert_img_excel()

Dim t()
Dim Limg, Himg As Integer
Dim fileAccessGranted As Boolean
Dim filePermissionCandidates

Limg = Range("F1").Value
Himg = Range("H1").Value

Application.ScreenUpdating = False
With ActiveSheet
    dl = .Cells(.Rows.Count, "Y").End(xlUp).Row 'dernière ligne non vide en Y

    '   Autorisation aux fichiers image ----------------------------------

    For i = 3 To dl 'de la ligne 3 à la dernière
        chemin = .Cells(i, "Y").Value 'chemin en Y
        filePermissionCandidates = Array(chemin)
        fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates)

     'insertion des images et dimensionnement ---------------------------

        ActiveCell.RowHeight = Limg
        ActiveCell.ColumnWidth = Himg

        If Dir(chemin) <> "" Then
            With .Cells(i, "Z") 'avec Z
                .RowHeight = Himg 'ajuste hauteur ligne
                imgLeft = .Left 'stocke position gauche de cellules
                imgTop = .Top 'stock position haute
                imgWidth = Limg 'larg col
                imgHeight = Himg 'haut lignes
            End With
            With .Shapes.AddPicture(chemin, msoFalse, msoTrue, imgLeft, imgTop, imgWidth, imgHeight) 'ajoute image (renvoie objet shape)
                .Name = Replace(chemin, ".jpg", "") & i 'modifie nom (sans ".jpg")
                .Placement = xlMoveAndSize 'pour vérouiller l'image à la cellule
            End With
        Else
            n = n + 1: ReDim Preserve t(1 To n): t(n) = chemin & " - ligne " & i
        End If
    Next i
    If n > 0 Then MsgBox "Images introuvables :" & vbCrLf & vbCrLf & Join(t, vbCrLf)

End With
Application.ScreenUpdating = True

End Sub

ainsi que mon fichier :

Et les fichiers images des trois premières lignes pour tester :

product val654ubredzzzzz00 1 product dslw8b98bckzzzzz00 1 product araq667abeizzzzz00 1

Bonjour Kerdaven,

Merci de compléter votre profil en mettant la version Excel Utilisée SVP (Exemple : Mac v16.73)

Cordialement

Merci pour le rappel ! c'est chose faite ;)

Bonjour,

Merci pour le rappel ! c'est chose faite ;)

Non du tout. Vous avez toujours Française V16


Pour votre demande, vous êtes sûr de votre adresse en B1 ? Je doute que cela commence réellement par "/users/...."
Ce que je ferais pour tester :
- Mettez votre fichier dans le répertoire mentionné en B1
- Mettez ce code dans un module puis exécutez -le

Sub test()
Msgbox Thisworkbook.path
End sub

Là vous devriez voir l'adresse exacte

Bonjour,

Merci pour le conseil.
J'ai bien le chemin que j'indique en B1 :

/Users/philippeestran/Documents/PROJETS/Studio_Plan_B/AO_S2_2021/MEERO/SIMUL_TAILLE_CB_RAL/DOUTEUX_T1_2023

Je n'ai malheureusement pas votre version excel, mais à titre de test essayez la ligne comme ceci

filePermissionCandidates = chemin

Si cela ne fonctionne pas, sans être sûr, peut être essayer ceci :

With ActiveSheet
    dl = .Cells(.Rows.Count, "Y").End(xlUp).Row 'dernire ligne non vide en Y

    '   Autorisation aux fichiers image ----------------------------------
    dim cheminarray

    cheminarray = chemin(0)

    For i = 3 To dl
        chemin = .Cells(i, "Y").Value
        cheminarray = cheminarray & ", " & chemin
    Next i
        filePermissionCandidates = Array(cheminarray)
        fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates)

     'insertion des images et dimensionnement ---------------------------
    For i = 3 To dl

NB : marrant on a exactement la même demande qu'ici... --> https://forum.macbidouille.com/index.php?showtopic=420958

OK je vais tester - merci !

le post chez Mcbidouille c'est moi mais j'avais eu moins de succès qu'ici.

alors voici le résultat de mon test :

ça bug sur "cheminarray = chemin(0)"

Message : Erreur de compilation Sub ou Function non définie

J'ai essayé en déclarant chemin comme variant mais là j'ai une erreur de compilation avec incompatibilité de type

Si je comprends bien ce code ajouté c'est pour remplir le tableau cheminarray avec les tous les chemins image de mon listing ?

le post chez Mcbidouille c'est moi mais j'avais eu moins de succès qu'ici.

Ouf cela remonte loin çà ....

ça bug sur "cheminarray = chemin(0)"
Message : Erreur de compilation Sub ou Function non définie

Vous avez bien mis DIm chemin ?
Ne mettez pas "variant"

Si je comprends bien ce code ajouté c'est pour remplir le tableau cheminarray avec les tous les chemins image de mon listing ?

Oui exact

Re,

Toujours même erreur : erreur 13 incompatibilité de type.

Sur la ligne modifiée : cheminarray = cheminarray & ", " & chemin(i - 2)

J'avais mis en commentaire la ligne cheminarray = chemin(0) et quand je la réactive c'est sur elle que se produit le bug.

Je me souviens que sur Mac la gestion des chemins est compliquée. J'ai vu des codes où des Posix ou Path to étaient utilisés... peut-être faut-il y recourir ?

J'avais mis en commentaire la ligne cheminarray = chemin(0) et quand je la réactive c'est sur elle que se produit le bug.

Essayez sans la ligne cheminarray=chemin(0)
Plus bas, enlevez aussi le i-2

Si cela passe il faudra affiner ensuite

Rem : dans votre version excel, comme précisé avant ajoutez la mention MAC devant V16. Sans quoi on pense à excel 2016 windows

Re !

Bon ça bug (erreur type 13 ) mais plus loin sur le second fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates) (voire code ci-dessous)

J'ai fais un essais en mettant en commentaire les trois dernières lignes du code ci-dessous.
ça me demande l'autorisation d'accès au premier fichier puis ça l'insère sur toutes les lignes. Donc ça boucle toujours sur le même fichier.

For i = 3 To dl
        chemin = .Cells(i, "Y").Value
        cheminarray = cheminarray & ", " & chemin
    Next i
        filePermissionCandidates = Array(cheminarray)
        fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates)

    For i = 3 To dl 'de la ligne 3 à la dernière
        chemin = .Cells(i, "Y").Value 'chemin en Y
        filePermissionCandidates = chemin
        fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates) ' ca bug ici

Pour lire contenu de cheminarray j'ai mis un MSgbox après la première boucle.
A priori ça fonctionne car je récupère ça :

, /Users/philippeestran/Documents/PROJETS/Studio_Plan_B/AO_S2_2021/MEERO/SIMUL_TAILLE_CB_RAL/DOUTEUX_T1_2023/product.VAL654UBREDZZZZZ00.1.jpg, /Users/philippeestran/Documents/PROJETS/Studio_Plan_B/AO_S2_2021/MEERO/SIMUL_TAILLE_CB_RAL/DOUTEUX_T1_2023/product.ARAQ667ABEIZZZZZ00.1.jpg, /Users/philippeestran/Documents/PROJETS/Studio_Plan_B/AO_S2_2021/MEERO/SIMUL_TAILLE_CB_RAL/DOUTEUX_T1_2023/product.DSLW8B98BCKZZZZZ00.1.jpg, /Users/philippeestran/Documents/PROJETS/Studio_Plan_B/AO_S2_2021/MEERO/SIMUL_TAILLE_CB_RAL/DOUTEUX_T1_2023/product.MBO3ZU6QBCKZZZZZ00.1.jpg, /Users/philippeestran/Documents/PROJETS/Studio_Plan_B/AO_S2_2021/MEERO/SIMUL_TAILLE_CB_RAL/DOUTEUX_T1_2023/product.MIUZ85FNSILZZZZZ00.1.jpg, /Users/philippeestran/Documents/PROJETS/Studio_Plan_B/AO_S2_2021/MEERO/SIMUL_TAILLE_CB_RAL/DOUTEUX_T1_2023/product.ATE87N2NBCKZZZZZ00.1.jpg, /Users/philippeestran/Documents/PROJETS/Studio_Plan_B/AO_S2_2021/MEERO/SIMUL_TAILLE_CB_RAL/DOUTEUX_T1_2023/product.BALB535KBCKZZZZZ00.1.jpg, /Users/philippeestran/Documents/PRO

Bon ça bug (erreur type 13 ) mais plus loin sur le second fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates) (voire code ci-dessous)

Mais vous ne devez l'avoir qu'une fois sinon cela revient à annuler ce que vous avez fait dans la boucle for i = to dl

Dans mon post précédent j'ai remis la boucle for i = 3 to dl qui concerne le reste du code If Dir(chemin) <>....

For i = 3 To dl
   chemin = .Cells(i, "Y").Value
   cheminarray = cheminarray & ", " & chemin
Next i
filePermissionCandidates = Array(cheminarray)
fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates)

'insertion des images et dimensionnement ---------------------------
ActiveCell.RowHeight = Limg
ActiveCell.ColumnWidth = Himg

For i = 3 to dl
    If Dir(chemin) <> "" Then
        With .Cells(i, "Z") 'avec Z
        .....
        .....
Next i

Essayez un peu comme cela (avec Dir(chemin) ou Dir(cheminarray))

Re bonjour,

ça ne fonctionne pas que ce soit avec DIR(chemin) ou DIR(cheminarray)
J'ai remarqué que l'image insérée est la dernière du listing.

Avec un msgbox je vois que DIR(cheminarray) est vide, du coup quand je mets DIR(cheminarray) ça sort de la boucle et ça m'indique que des images n'ont pas été trouvées (toute la liste image). Or quand je fais un msgboxsur cheminarray je vois que la variable n'est pas vide.

J'ai remarqué au passage que dans la seconde boucle For i to dl je n'incrémentais pas le chemin (d'où l'insertion de tjs la même image avec la dernière valeur lue de chemin).

J'ai donc ajouté chemin = .Cells(i, "Y").Value mais là j'ai une demande d'accès à chaque image. On revient au soucis initial...

Re

Je vais voir pour vous proposer autre chose :

1. A quoi servent ces deux instructions ou plutôt activecell correspond à quoi

ActiveCell.RowHeight = Limg
ActiveCell.ColumnWidth = Himg

2. Puis ensuite le but c'est de mettre les images en colonne Z sur les 750 lignes de la feuille liste_sku ?

Bonjour,

Ces deux lignes servent à fixer les valeurs hauteur largeur des images à insérer (en l'occurence 150 pxl)

ActiveCell.RowHeight = Limg

ActiveCell.ColumnWidth = Himg

Ensuite oui le but de la macro est d'insérer les images en colonne Z.
Sur chaque ligne figure les référence d'un produit, référence qu'on trouve dans le nom de l'image.
Les images sont nommées ainsi : "product."ref-produit".1.jpg"

Merci encore pour votre temps !

Bonjour

Ces deux lignes servent à fixer les valeurs hauteur largeur des images à insérer (en l'occurence 150 pxl)

Ok mais cela suppose que la cellule sélectionnée reste au même endroit. Pour moi, avec votre ligne .cells(i, y), les deux lignes ne semblent pas utilles

Ensuite oui le but de la macro est d'insérer les images en colonne Z.

J'ai un peu changer le code. Faites un peu un test avec ceci :

Sub insert_img_excel()
Dim Limg, Himg As Integer, i As Integer, dl As Integer
Dim fileAccessGranted As Boolean
Dim filePermissionCandidates
Dim cheminarray As Collection
Dim item

Limg = Range("F1").Value
Himg = Range("H1").Value

Application.ScreenUpdating = False
With ActiveSheet
    dl = .Cells(.Rows.Count, "Y").End(xlUp).Row 'dernire ligne non vide en Y

    'Autorisation aux fichiers image ----------------------------------

    Set cheminarray = New Collection
    For i = 3 To dl
        cheminarray.Add .Cells(i, "Y").Value
    Next i

    filePermissionCandidates = Array(cheminarray)
    fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates)

     'insertion des images et dimensionnement ---------------------------

    'ActiveCell.RowHeight = Limg
    'ActiveCell.ColumnWidth = Himg
    i = 3
    For Each item In cheminarray
        With .Cells(i, "Z") 'avec Z
            .RowHeight = Himg 'ajuste hauteur ligne
            imgLeft = .Left 'stocke position gauche de cellules
            imgTop = .Top 'stock position haute
            imgWidth = Limg 'larg col
            imgHeight = Himg 'haut lignes
        End With
        On Error Resume Next 'eviter erreur si image non trouvee
        With .Shapes.AddPicture(item, msoFalse, msoTrue, imgLeft, imgTop, imgWidth, imgHeight) 'ajoute image (renvoie objet shape)
            .Name = Replace(item, ".jpg", "") & i 'modifie nom (sans ".jpg")
            .Placement = xlMoveAndSize 'pour vŽrouiller l'image ˆ la cellule
        End With
        On Error GoTo 0
        i = i + 1
    Next item

End With
Application.ScreenUpdating = True
End Sub

Faites du pas à pas dans le code pour vérifier où cela plante

Crdlt

Bonjour,

Merci !

ça plante au premier "fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates)"

Bonjour

ça plante au premier "fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates)"

Heu pourquoi vous dites "au premier" ??
il n'y en a qu'un seul dan le code

Faites ces deux tests
- Après Next i, mettez Msgbox cheminarray --> Cela devrait vous montrer tous les liens enregistrés
- enlevez le ARRAY dans la ligne suivante

Aussi votre fichier se trouve où par rapport à votre dossier image ?

Oui en effet il n'y en a qu'un, désolé !
Le fichier est dans le même dossier que celui où se trouvent les images.
J'ai essayé avec un autre emplacement ans succès

le msgbox renvoi une erreur de compilation : "argument non facultatif"

j'ai saisis msgbox(cheminarray)

En ajoutant un indice dans le cheminarray ça m'affiche biensur la valeur à la position demandée (ex : msgbox(cheminarray(2)) fonctionne

Le bug est ensuite tjs sur le fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates)

Rechercher des sujets similaires à "mac autoriser acces fichiers"