Есть ли альтернатива использованию LoadPicture ("bmp_or_icon_file_path") для загрузки изображений в Excel 2007 VBA - PullRequest
3 голосов
/ 22 июля 2010

У меня есть Excel 2007 Worksheet со множеством кнопок и надписей, которые действуют как пункты меню (т. Е. Пользователь нажимает кнопки, надписи с изображениями) и представлены с формами или чем-то еще.

Эти изображения /Значки для кнопок и надписей загружаются в VBA, назначая свойство Picture элемента управления и вызывая метод LoadPicture () с полным путем к файлу изображения в качестве параметра, например, So.

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

Этот метод загрузки изображений для кнопок и других элементов управления вызывает 2 проблемы.

1) Он создает зависимость от файлов изображений и физического местоположения для каждого пользователя, поэтому, если пользователь делаетЕсли диск не сопоставлен, а файлы отсутствуют, VBA завершается с ошибкой во время выполнения файла или путь не найден.
2) Приложение работает очень медленно, если образы находятся на общем диске (что имеет место)

Я хочу устранить обе проблемы и каким-то образом загрузить значки, изображения для внутреннего контроля, без каких-либо внешних зависимостей от внешних файлов изображений.

Каков наилучший способ добиться этого в Excel 2007 VBA?

Я не смог подать файл / редактор "Resource File" в Visual Basic 6.0 / Visual Studio, с помощью которого можно выполнитьэто.

Пожалуйста, совет!спасибо

-Шива @ mycodetrip.com

Ответы [ 2 ]

3 голосов
/ 22 июля 2010

Я действительно надеюсь, что есть более простой способ сделать это, но это единственный, который я нашел:

Идея заключается в следующем: Вы сохраняете рисунки встроенными в лист, и каждый раз, когда вы хотите установить рисунки для команды, вы экспортируете их из своего рабочего листа в файл и загружаете их через LoadPicture. Единственный способ экспортировать внедренную картинку через VBA, которую я нашел, - сначала сделать ее Chart.

Следующий код основан на 'Экспорт изображений из Excel' из 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

Заключить: Загрузка изображений с подключенного сетевого диска выглядит менее грязной, и разница в скорости не должна быть большой.

0 голосов
/ 12 июня 2016

2 альтернативы, которые я могу придумать: form.img.picture=pastepicture и = oleobjects("ActiveXPictureName").object.picture.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...