要在excel里实现点个按钮、直接在弹出的窗体里预览图片的效果,核心逻辑其实很简单:先插入userform窗体,往里面放一个image控件和一个操作按钮,按钮代码调用 application.getopenfilename 调出选图窗口,再用 loadpicture 把选中的图片加载到image控件里就行。本次操作环境是microsoft 365版本的excel,提醒大家最后保存文件一定要选 .xlsm 格式,不然写好的vba代码存不住。
第一步:插入窗体
按 Alt + F11 快捷键打开VBA编辑器,在左边的工程面板里选中你当前正在编辑的工作簿,点顶部菜单栏的「插入」-「用户窗体」就行。刚生成的窗体默认名称是 UserForm1,后面所有配套代码都是按这个默认名写的,要是你自己改了窗体名,后面的运行入口代码也得跟着调整,不然运行会报错哦。

第二步:放入预览控件
在弹出来的工具箱里选Image控件,拖到窗体中间当图片预览区,再拖一个CommandButton普通按钮放旁边就好。建议顺手把Image控件的 Name 属性改成 imgPreview,按钮的 Name 属性改成 cmdChoose,再把按钮上的显示文字改成「选择图片」。要是找不到属性面板,按 F4 就能调出来。

第三步:写入选择图片代码
双击刚才做好的「选择图片」按钮,直接进入按钮的单击事件编辑页面,把下面这段代码粘进去就好。这段代码默认只筛选常用的图片格式,选完文件后会先判断路径有没有效,再自动把图片加载到 imgPreview.Picture 里。
Private Sub cmdChoose_Click()
Dim picPath As Variant
picPath = Application.GetOpenFilename( _
FileFilter:="图片文件 (*.jpg;*.jpeg;*.png;*.bmp),*.jpg;*.jpeg;*.png;*.bmp", _
Title:="请选择要预览的图片")
If picPath = False Then Exit Sub
Me.imgPreview.PictureSizeMode = fmPictureSizeModeZoom
Me.imgPreview.Picture = LoadPicture(CStr(picPath))
End Sub

第四步:添加运行入口
回到VBA编辑器左边的工程面板,右键点当前工作簿,插入一个普通模块,写一段用来弹出窗体的启动代码就行。代码特别短,只要你的窗体还是默认名 UserForm1,运行 ShowPreviewForm 这个过程就能直接调出预览窗体。
Sub ShowPreviewForm()
UserForm1.Show
End Sub

第五步:选择图片并检查预览效果
运行 ShowPreviewForm,点窗体上的「选择图片」,挑一张本地存的图片选好,预览区就会自动按原图比例显示。要是图片被拉伸变形了,先检查下Image控件的 PictureSizeMode 有没有设成 fmPictureSizeModeZoom;要是选完图弹出路径报错,先确认图片文件没被挪到别的文件夹,也没有系统权限限制。

LoadPicture 函数和选图语法说明
LoadPicture 是VBA里专门用来加载图片的函数,最常用的写法是 LoadPicture(pathname),返回的图片对象可以直接赋值给窗体、Image控件或者其他支持显示图片的对象。这里的 pathname 是图片的完整存储路径,一般用字符串格式传进去;要是路径为空、文件不存在或者格式不支持,运行的时候就会弹出「无效的图片」这类运行错误。
| 项目 | 写法或含义 |
|---|---|
| 语法 | LoadPicture([pathname]) |
| pathname | 可选参数;图片文件完整路径,常见为 jpg、jpeg、png、bmp |
| 返回值 | Picture 对象,可赋给 Image.Picture
|
| 清空图片 | Set Me.imgPreview.Picture = Nothing |
Application.GetOpenFilename 是Excel自带的、用来调出系统选文件窗口的方法,常用语法是 Application.GetOpenFilename(FileFilter, FilterIndex, Title)。这个例子里只用到 FileFilter 和 Title 两个参数,它的返回值要么是你选中的文件完整路径,要么是点取消时返回的 False,所以接收返回值的变量用 Variant 类型兼容性更好,不容易出类型不匹配的问题。
| 参数 | 作用 | 本例写法 |
|---|---|---|
| FileFilter | 限制可选文件的类型 | 图片文件 (*.jpg;*.jpeg;*.png;*.bmp),*.jpg;*.jpeg;*.png;*.bmp |
| FilterIndex | 默认选中第几个筛选条件 | 省略 |
| Title | 文件选择窗口的显示标题 | 请选择要预览的图片 |
要是想让窗体一打开就自动显示一张预设的默认图,直接在 UserForm_Initialize 窗体初始化事件里加两行代码就好:
Private Sub UserForm_Initialize()
Me.imgPreview.PictureSizeMode = fmPictureSizeModeZoom
Me.imgPreview.Picture = LoadPicture(ThisWorkbook.Path & "\sample.jpg")
End Sub
这里用到的 sample.jpg 得和你这个xlsm文件放在同一个文件夹里,你把文件发给别人的时候,这张默认图也要一起打包发过去,不然对方打开的时候找不到路径,默认图就显示不出来啦。











