ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 29232|回复: 38

[原创] 在工作表中批量插入同一文件夹下图片到单元格中并对准

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-8-12 16:54 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
注意,8楼代码已经完全改变思路,效率更高更可靠。
本楼代码可以无视,仅作学习参考用。


Sub PicBatchIn()
    K = InputBox("请输入插入图片换行数,默认10张", "插入图片换行数", 10) '指定插入满10张图片后换行。当然可以根据需要改成k=5或者k=20之类的。
   If K = "" Then K = 1 '如果选择ESC退出输入对话框,则把k值设定为1,即在同一列中按行插入。
   
   Dim r As Range: Set r = ActiveCell  '指定当前单元格为开始插入图片的位置。
   
    OpenFile = Application.GetOpenFilename("Picture Files(*.jpg),*.jpg", , "Get Picture from here!")  '找到目标文件夹,并随便选取一张jpg图片。

    '如果图片格式不是*.jpg,请修改代码,如同下面:
    'OpenFile = Application.GetOpenFilename("Picture Files(*.bmp),*.bmp", , "Get Picture from here!")  '找到目标文件夹,并随便选取一张bmp图片。

    If OpenFile = False Then Exit Sub '如果选择为空或ESC,则结果为错误退出此vba过程。
    Application.ScreenUpdating = False '暂停屏幕刷新
   
    L = InStrRev(OpenFile, "\") '查找最后一个文件夹特定字符\
    myDir = Left(OpenFile, L) '抽取所选文件夹字符,如"D:\Documents\"
    P = Dir(myDir & "*.jpg") '用Dir命令寻找jpg图片。(或改为bmp图片)
  ActiveSheet.Pictures.Insert (myDir & P) '插入第一张图片
   '下面部分代码,是为了找到现在工作表中自动赋值的图片序号
   Dim Shp As Shape
    For Each Shp In ActiveSheet.Shapes '遍历所有工作表中图形
        ShpNm = Shp.Name '得到每个图形的名称
        PicNo = Val(Mid(ShpNm, InStr(ShpNm, " "), Len(ShpNm))) '查找空格并取其后的数值为图片序号。
        If PicNo > m Then m = PicNo '使N变量保持为较大值,直至遍历循环结束,即可找到最大值。
    Next
   
    Do While P <> "" '循环直至结束。
        r.Cells(1 + n \ k, n Mod k + 1).Select '选择将要插入图片的单元格,并按照指定k参数换行
        '即把n除以k以后的整数部分作为换行顺序值,而n对于k的余数部分作为列顺序值。
        If U = 0 Then U = 1 Else ActiveSheet.Pictures.Insert (myDir & P) '除第一张以外,每次插入新图片
            
              ActiveSheet.Shapes.Range("图片 " & m + n).Select '选择刚才插入的图片,已有图片序号m+新插入数n。
        'ActiveSheet.Shapes.Range("Picture " & m + n).Select '在英文版中的代码图片=Picture。
      
        '以下是确定让图片顶部、左侧位置以及图片高、宽对准单元格
      With Selection
            .Top = r.Cells(1 + N \ K, N Mod K + 1).Top
            .Left = r.Cells(1 + N \ K, N Mod K + 1).Left
            .ShapeRange.LockAspectRatio = msoFalse '设置图片格式为高宽不按比例变化。
       .Height = r.Cells(1 + N \ K, N Mod K + 1).Height
            .Width = r.Cells(1 + N \ K, N Mod K + 1).Width
            .Placement = xlMoveAndSize '设置图片格式为跟随单元格大小变化。
        End With
        n = n + 1 '图片序号+1
        P = Dir '用Dir命令继续下一张图片,直至内容为空
    Loop
    Application.ScreenUpdating = True '打开屏幕刷新
    r.Select '回到起始单元格。
End Sub

再次提醒,本代码不如8楼的代码好 !!!
==========================================

在这里,n \ k 是 int(n/k)的简写。


现在的代码,已经解决了同一工作表中,新插入图片序号不为1的问题。

另外,实际上,如果最初把换行列数的k值定为1的话,
宏运行的结果,就可以变成了在同一列里按行排序插入的结果了……

而如果定义的换行k值大于文件夹中图片数量,当然就变成了在同一行里按列插入的结果了。

If U = 0 Then U = 1 Else ActiveSheet.Pictures.Insert (myDir & P) '除第一张以外,每次插入图片

对上面这句代码解释如下:
If U = 0 Then
     U = 1 ‘处理第一张图片时,不需要再作图片插入,但要做好首件U标记。
Else
     ActiveSheet.Pictures.Insert (myDir & P)      '如果首件U标记已经不为0时则要插入图片
End If

[ 本帖最后由 香川群子 于 2010-9-9 18:57 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2010-8-12 16:56 | 显示全部楼层
谢谢楼主分享经验.

TA的精华主题

TA的得分主题

发表于 2010-8-12 17:02 | 显示全部楼层
支持

其他参考:(保持图片长宽比并适应单元大小)

★利用有效性信息批量调用信息和图片★        http://club.excelhome.net/thread-529975-1-1.html

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-8-12 20:43 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-8-12 20:56 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-9-12 22:00 | 显示全部楼层
原帖由 香川群子 于 2010-9-12 11:22 发表


当然可以,请参考这里。
http://club.excelhome.net/viewth ... p;page=2#pid4215756

如果你自己还不会调整,
那么请你上传你的基本框架的附件,
我可以帮你弄好的。

请香川群子老师帮我写下代码好吗?

TA的精华主题

TA的得分主题

发表于 2010-9-12 21:08 | 显示全部楼层
请香川群子老师帮我写下代码好吗?

TA的精华主题

TA的得分主题

发表于 2010-8-27 15:22 | 显示全部楼层
真是高高手  解决了我的一个大问题
谢谢分享

TA的精华主题

TA的得分主题

发表于 2010-9-5 00:15 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-9-7 16:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

改进版,39种图片格式自动导入图片及名称

Sub 单元格自动插入图片()
    Pf = "ai,"
    Pf = Pf & "bmp,bmz"
    Pf = Pf & "cdr,cgm,"
    Pf = Pf & "dib,dwg,dxf,"
    Pf = Pf & "emf,emz,eps,exf,exif,"
    Pf = Pf & "fpx,"
    Pf = Pf & "gfa,gif,"
    Pf = Pf & "hdr,"
    Pf = Pf & "ico,"
    Pf = Pf & "jfif,jpe,jpeg,jpg,"
    Pf = Pf & "pcd,pct,pcx,pcz,pict,png,psd,"
    Pf = Pf & "raw,rle,"
    Pf = Pf & "svg,"
    Pf = Pf & "tga,tif,tiff,"
    Pf = Pf & "ufo,"
    Pf = Pf & "wdp,wmf,wmz,"
   
    K = InputBox("插入行数,1=按列挿入", "插入行数", 1)
    If K = "" Then Exit Sub
   
    Dim Rng  As Range: Set Rng = ActiveCell
    OpenFile = Application.GetOpenFilename("Picture Files(*.*),*.*", , "Get Picture from here!")

    If OpenFile = False Then
        myDir = ThisWorkbook.Path & "\"
    Else
        myDir = Left(OpenFile, InStrRev(OpenFile, "\"))
    End If
    Application.ScreenUpdating = False
   
   Filename = Dir(myDir)
     
    Do While Filename <> ""
        If InStr(Pf, LCase(Right(Filename, Len(Filename) - InStrRev(Filename, ".")))) > 0 Then
            Rng.Cells(1 + n \ K, n Mod K + 1).Select
            ActiveCell = Filename 'Left(Filename, InStrRev(Filename, ".") - 1)
            
            ActiveSheet.Pictures.Insert(myDir & Filename).Select
            With Selection
                .Placement = xlMoveAndSize
                .ShapeRange.LockAspectRatio = msoFalse
                .Top = ActiveCell.Top
                .Left = ActiveCell.Left
                .Height = ActiveCell.Height
                .Width = ActiveCell.Width
            End With
            n = n + 1
        End If
        Filename = Dir
    Loop
    Application.ScreenUpdating = True
    Rng.Select
End Sub

[ 本帖最后由 香川群子 于 2010-9-12 09:44 编辑 ]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 19:44 , Processed in 0.042614 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表