2010-07-22 6 views
3

메뉴 옵션으로 작동하는 많은 버튼과 레이블이있는 Excel 2007 워크 시트가 있습니다 (예 : 사용자가 단추, 이미지 레이블 포함) 형식 또는 다른 어떤 것으로 제시됩니다.LoadPicture ("bmp_or_icon_file_path")를 사용하여 Excel 2007 VBA에서 이미지로드하기

이러한 이미지/버튼의 아이콘과 레이블 겠어요 - 같은 컨트롤의 사진 속성을 할당하고 매개 변수로 전체 이미지 파일 경로와 에는 LoadPicture() 메서드를 호출하여 VBA에서로드

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

단추, 다른 컨트롤에 대한 이미지를로드하는이 방법은 2 가지 문제를 일으 킵니다.

1) 모든 사용자의 이미지 파일 및 물리적 위치에 대한 종속성을 생성하므로 사용자가 드라이브를 매핑하지 않고 파일을 존재하지 않으면 파일 또는 경로의 런타임 오류로 인해 VBA가 실패합니다. 이미지가 내가 외부에 외부 의존하지 않고, 내부 컨트롤에 이미지를 아이콘을로드 어떻게 든 두 문제를 제거하고 싶어 (케이스 인)

공유 드라이브에있는 경우
2) 응용 프로그램은 매우 느리게 도착 이미지 파일.

Excel 2007 VBA에서 이것을 수행하는 가장 좋은 방법은 무엇입니까?

Visual Basic 6.0/Visual Studio 스타일의 "리소스 파일 편집기"/ 기능을 수행 할 수 없습니다.

제발 상담하십시오! 감사합니다

-Shiva mycodetrip.com

답변

3

난 정말이 할 수있는 쉬운 방법이 있다는 것을 희망한다, 그러나 이것은 내가 찾은 유일 @

아이디어는 다음과 같습니다 당신은 사진을 유지 시트에 임베드되어 있고 명령의 그림을 설정할 때마다 워크 시트에서 파일로 내보내고 LoadPicture을 통해로드합니다. VBA를 통해 포함 된 그림을 내보낼 수있는 유일한 방법은 먼저 Chart으로 만드는 것입니다.이 매핑 된 네트워크 드라이브에서 이미지를로드하는 것은 덜 지저분 해 보인다 , 그 정도가 안 :

은 다음 코드

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 

는 결론 johnske에서 'Export pictures from Excel'을 기반으로 속도 차이.

+0

코드 스 니펫 및 의견을 보내 주셔서 감사합니다. Marg! 당신은 옳습니다. 이미지를 시트에 보관하고로드하는 것은 지저분하고 까다 롭습니다. W.r.t. 매핑 된 네트워크 드라이브를 사용하면 원격 물리적 위치에있는 사용자에게 상당한 지연이 있습니다. 나는 2, 3 초 동안 20 ui 아이콘/이미지를 로컬로로드하는 것에 대해 이야기하고 있습니다. 그게 내가 피하려고 노력하는거야, 그래서 매핑 된 드라이브에 이미지를 유지하는 것은 의문의 여지가있다. 나는 그들이 로컬로로드 할 수 있도록 응용 프로그램으로 이미지를 재배포 할 수 있다고 생각하지만 현재 존재하는 이미지에 대한 종속성을 구축합니다. :( – Shiva

0

두 가지 대안을 생각해 볼 수 있습니다 : form.img.picture=pastepicture= oleobjects("ActiveXPictureName").object.picture.