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 Subainsi que mon fichier :
Et les fichiers images des trois premières lignes pour tester :
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 subLà 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 = cheminSi cela ne fonctionne pas, sans être sûr, peut être essayer ceci :
With ActiveSheet
dl = .Cells(.Rows.Count, "Y").End(xlUp).Row 'dernire 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 dlNB : 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 iciPour 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 iEssayez 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 = Himg2. 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 'dernire 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 SubFaites 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)