从工作表中获取图片到Excel Userform

时间:2014-05-23 20:55:48

标签: excel vba excel-vba

我希望在用户窗体上的Image控件中查看工作表中的图像。

此图像将根据组合框上的值更改。我已将(使用:插入 - >图片)一些图像插入到我的工作簿的“Sheet1”中,并将其命名为“Picture1”& “图片2”。

我创建了以下UserForm:

Form http://im56.gulfup.com/msKyqi.png

这是我尝试使用的代码,以便从工作表中加载图像,但不幸的是,目前这不起作用。

Private Sub ComboBox1_Change()

UserForm1.Image1.Picture = LoadPicture(Worksheets("Sheet1").Shapes(ComboBox1.Value))

End Sub

Private Sub UserForm_Initialize()

UserForm1.ComboBox1.Clear
UserForm1.ComboBox1.AddItem "Picture1"
UserForm1.ComboBox1.AddItem "Picture2"

UserForm1.ComboBox1.Value = "Picture1"

UserForm1.Image1.Picture = LoadPicture(Worksheets("Sheet1").Shapes(ComboBox1.Value))

End Sub

每次运行此代码时,都会出现以下错误:

Error http://im43.gulfup.com/YoWvTp.png

请告知。

3 个答案:

答案 0 :(得分:7)

我明白了!

当我使用UserForm时,有一个问题的解决方法。

而不是让工作表中的图像然后尝试在我尝试在UserForm中首先使用它们的形式加载它们,这里是如何。

在您的用户表单上创建一个框架: Frame http://im88.gulfup.com/Moy8I6.png

将框架的visible属性设置为“ False ”: Visible http://im88.gulfup.com/sAIQqh.png

通过添加图片控件插入图像并加载图像,您可以根据需要添加任意数量的图像: Images http://im88.gulfup.com/oas0EQ.png

为图片命名: Name http://im88.gulfup.com/cIO317.png

将所有图像一个拖到另一个框架中(然后可以将框架移动到一个角落,这样就不会打扰你了:

Drag http://im88.gulfup.com/1fOSut.png Move Away http://im88.gulfup.com/Q1fzKd.png

接下来创建一个图片控件,这将用于根据选择显示图片:

Form View http://im88.gulfup.com/X1UVRB.png

在这个例子中,我将使用组合框进行选择。现在将以下代码插入到非常简单的表单中:

    Private Sub ComboBox1_Change()

    ' Image1 is the name of the created picture control
    UserForm3.Controls.Item("Image1").Picture = UserForm3.Controls.Item(UserForm3.ComboBox1.Value).Picture 

    End Sub

    Private Sub UserForm_Initialize()

    UserForm3.ComboBox1.AddItem "Argentina"
    UserForm3.ComboBox1.AddItem "Brazil"
    UserForm3.ComboBox1.AddItem "Chile"

    End Sub

正如您将看到的,带有图片的框架是隐藏的,并且图片控件内部的图像会根据选择进行更改:

Result http://im88.gulfup.com/MSqyHF.png

我认为这是更好的方法,而不是将图像从工作表导出到Temp文件夹,然后将它们加载回图片控件。

答案 1 :(得分:3)

LoadImage()函数需要一个文件名(可以使用驱动器号和路径完全限定)。你得到的类型不匹配,因为它需要一个字符串,你给它一个图像对象。

据我所知,没有简单的方法可以将当前应用程序中的图像放入图像控件中。我所知道的(hackish)解决方法是将图像导出到文件,然后使用LoadImage()导入同一个文件。

如果要嵌入动态更新为用户表单的图表,则必须使用相同的路径。您将图表导出为图像(例如,JPEG),然后使用LoadImage()将图像拉回图像控件。

答案 2 :(得分:0)

我知道这篇文章很古老,但是我在这里找到了自己的出路。我想出了一个稍微不同的解决方案。根据组合框的选择,我大约需要加载30张图片。首先,所有组合框选项(讨论“ XX”)都保存到单独的工作表中,该表对用户“非常隐藏”,并在激活用户表单时加载到组合框中。在用户窗体上添加了一个框架,在该框架中放置了30个完全重叠的图像框。每个图像框都被仔细命名为“ Img_XX”,其中XX是简单的两个字母的标识符。

使用此设置,现在可以遍历框架中的每个“控件”(图像框)并将其全部隐藏,但名称与组合框值匹配的控件除外。 Combobox_Change()函数中的userform模块中的代码如下所示:

 Private Sub ComboBox_Change()
    Dim SearchValue as String
    SearchValue = me.Combobox.value

    Dim Ctrl as Control
    For each Ctrl in Me.TestFrame.Controls
        If Ctrl.Name Like "img_" & SearchValue Then
            Ctrl.visible = True
        else
            Ctrl.Visible = False
        End If
    next Ctrl
 End Sub

我希望这会有所帮助,让我知道您的想法。 :)