【问题标题】:Get Picture from Worksheet into Excel Userform将工作表中的图片获取到 Excel 用户窗体中
【发布时间】:2020-02-01 00:37:45
【问题描述】:

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

此图像将根据组合框上的值进行更改。我已在工作簿的“Sheet1”中插入(使用:插入 -> 图片)几张图片,并将它们命名为“Picture1”和“Picture2”。

我创建了以下用户窗体:

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

请指教。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    我想通了!

    由于我使用的是用户窗体,因此有一个解决方法。

    我首先尝试将它们放在用户窗体中,而不是将图像放在工作表中然后尝试将它们加载到表单中,方法如下。

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

    将框架的可见属性设置为“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

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

    【讨论】:

    • 加载图像两次不会增加文件大小吗? (一次在工作表中,第二次在您的用户表单中)
    • @JohnsonJason 工作表中没有图像,它们位于用户窗体上的隐藏图片控件中。你可以再看一遍答案。
    • 我了解到您的回答仅涉及表单中的图像,以便启用动态表单图像切换。但是,正如原始问题所述,我在工作表中有图像。我无法将它们移出工作表,因为它们是界面的一部分。我希望这些图像也能以这种形式出现。所以使用你的解决方案我会得到两次图像。
    • @JohnsonJason 在这种情况下是的 :(。但这是我能想出的唯一解决方案,因为 excel 用户表单不会直接从工作表中读取图像,可能没有很多额外的代码。
    • @JohnsonJason - 图片有多大?如果它们很大,也许您可​​以优化它们的大小,即使用一个好的图像编辑器使它们成为您在工作表或用户窗体中需要的大小,而不必在工作表或用户窗体中缩小它们。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

       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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-16
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多