2010-07-22 3 views
3

J'ai une feuille de calcul Excel 2007 avec de nombreux boutons et étiquettes qui agissent comme options de menu (l'utilisateur clique sur les boutons, les étiquettes avec des images) et est présenté avec des formes, ou quelque chose d'autre.Existe-t-il une alternative à LoadPicture ("bmp_or_icon_file_path") pour charger des images dans Excel 2007 VBA

Ces images/icônes pour les boutons et les étiquettes sont chargés dans VBA en affectant la Image propriété de la méthode de contrôle et d'appeler LoadPicture() avec le chemin du fichier de l'image en tant que paramètre, comme So.

With SomeFormObject 
     .cmdOpenFile.Picture = LoadPicture("F:\projectname\images\fileopen.BMP") 
    End With 

Cette méthode de chargement des images pour les boutons, d'autres contrôles est à l'origine de 2 problèmes. 1) Il crée une dépendance sur les fichiers image et l'emplacement physique pour chaque utilisateur, donc si un utilisateur n'a pas le lecteur mappé et les fichiers présents, le VBA échoue avec l'erreur d'exécution du fichier ou du chemin non trouvé.
2) L'application devient très lent si les images sont sur un disque partagé (ce qui est le cas)

Je veux éliminer les problèmes et en quelque sorte charger des icônes, des images dans le contrôle interne, sans dépendances externes sur externe fichiers image.

Quelle est la meilleure façon d'y parvenir dans Excel 2007 VBA?

Je ne pouvais pas créer de "Resource File Editor" de Visual Basic 6.0/Visual Studio avec cette fonction.

S'il vous plaît avis! merci

-Shiva @ mycodetrip.com

Répondre

3

J'espère vraiment qu'il ya un moyen plus facile de le faire, mais c'est le seul que je trouve:

L'idée est: Vous gardez les photos incorporé dans une feuille et chaque fois que vous souhaitez définir les images pour la commande, vous les exporter de votre feuille de calcul dans un fichier et les charger via LoadPicture. La seule façon d'exporter une image incorporée à travers VBA que j'ai trouvé est en le faisant d'abord un Chart.

Le code suivant est basé sur 'Export pictures from Excel' de johnske

Option Explicit 

Sub setAllPictures() 
    setPicture "Picture 18", "CommandButtonOpen" 
    setPicture "Picture 3", "CommandButtonClose" 
End Sub 

Sub setPicture(pictureName As String, commandName As String) 
    Dim pictureSheet As Worksheet 
    Dim targetSheet As Worksheet 
    Dim embeddedPicture As Picture 
    Dim pictureChart As Chart 

    Dim MyPicture As String 
    Dim PicWidth As Long 
    Dim PicHeight As Long 

    Set pictureSheet = Sheets("NameOfYourPictureSheet") ' <- to Change ' 
    Set targetSheet = Sheets("NameOfYourSheet") ' <- to Change ' 

    Set embeddedPicture = pictureSheet.Shapes(pictureName).OLEFormat.Object 
    With embeddedPicture 
     MyPicture = .Name 
     PicHeight = .ShapeRange.Height 
     PicWidth = .ShapeRange.Width 
    End With 

    Charts.Add 
    ActiveChart.Location Where:=xlLocationAsObject, Name:=pictureSheet.Name 
    Set pictureChart = ActiveChart 

    embeddedPicture.Border.LineStyle = 0 

    With pictureChart.Parent 
      .Width = PicWidth 
      .Height = PicHeight 
    End With 

    With pictureSheet 
     .Select 
     .Shapes(MyPicture).Copy 

     With pictureChart 
      .ChartArea.Select 
      .Paste 
     End With 

     .ChartObjects(1).Chart.Export Filename:="temp.jpg", FilterName:="jpg" 
    End With 

    pictureChart.Parent.Delete 
    Application.ScreenUpdating = True 

    targetSheet.Shapes(commandName).OLEFormat.Object.Object.Picture = LoadPicture("temp.jpg") 

    Set pictureChart = Nothing 
    Set embeddedPicture = Nothing 
    Set targetSheet = Nothing 
    Set pictureSheet = Nothing 
End Sub 

Sub listPictures() 
    ' Helper Function to get the Names of the Picture-Shapes ' 
    Dim pictureSheet As Worksheet 
    Dim sheetShape As Shape 

    Set pictureSheet = Sheets("NameOfYourSheet") 
    For Each sheetShape In pictureSheet.Shapes 
     If Left(sheetShape.Name, 7) = "Picture" Then Debug.Print sheetShape.Name 
    Next sheetShape 

    Set sheetShape = Nothing 
    Set pictureSheet = Nothing 
End Sub 

Pour Conclure: Chargement des images à partir d'un lecteur en réseau mappée semble moins en désordre, et il ne devrait pas être beaucoup d'une différence de vitesse.

+0

Merci pour l'extrait de code et les commentaires Marg! Vous avez raison, l'approche consistant à conserver les images dans une feuille, puis à les charger ne voit pas désordonné et maladroit. W.r.t. En utilisant le lecteur réseau mappé, il existe un délai important pour les utilisateurs situés dans des emplacements physiques distants. Je parle 2, 3 secondes pour le chargement local 20 icônes/images, vs 2 minutes ou plus pour un utilisateur dans un endroit à travers le pays. C'est ce que j'essaie d'éviter, donc garder les images dans le lecteur mappé est hors de question. je suppose que je pourrais redistribuer des images avec l'application afin qu'ils se chargent localement, mais qui construisent la dépendance sur les images étant présents .. :( – Shiva

0

2 alternatives auxquelles je peux penser: form.img.picture=pastepicture, et = oleobjects("ActiveXPictureName").object.picture.

Questions connexes