ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: andyyan

[讨论] EXCEL如何批量导出图片并命名

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2010-9-12 00:05 | 显示全部楼层
原帖由 晨曦矇眬 于 2010-9-10 17:14 发表
请问版主:如何控制导出图片的大小尺寸?能否麻烦您简要说明一下宏中的主要参数?
并帮忙在附件中录入宏。(宏件中的宏图片在A列,型号在B列)
非常感谢!



Sub 遍历图片并输出()
    OpenFile = Application.GetOpenFilename("请选择任一文件后按确定(*.*),*.*", , "选择任一文件确定图片输出文件夹,或取消获得当前文件所在文件夹。")

    If OpenFile = False Then
        myDir = ThisWorkbook.Path & "\"
    Else
        myDir = Left(OpenFile, InStrRev(OpenFile, "\"))
    End If
   
    k = InputBox("1=列左,2=列右,3=上一行,4=下一行,取消=图片所在单元格或无名称", "选择图片名称位置:", 2)
    If k = 1 Then
        r = 0: c = -1
    ElseIf k = 2 Then
        r = 0: c = 1
    ElseIf k = 3 Then
        r = -1: c = 0
    ElseIf k = 4 Then
        r = 1: c = 0
    End If

    k = MsgBox("Yes=按原尺寸,No=按新设定,Cancel=按现在显示", vbYesNoCancel, "输出图片尺寸大小选择")
    For Each p In ActiveSheet.Shapes
        ph = p.Height
        pw = p.Width
        On Error Resume Next
        pn = p.TopLeftCell.Offset(r, c).Value
        If Err.Number <> 0 Then Err.Clear
        If pn = "" Then n = n + 1: pn = Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") - 1) & Format(n, "000")
        
GetPicName:
        On Error Resume Next
        p.Name = pn & ".jpg"
        If Err.Number <> 0 Then
            Err.Clear
            pn = InputBox("图片名称重复,请重新命名", "图片名称重复", pn)
            GoTo GetPicName
        End If
        
        p.Select
        If k = vbYes Then
            Selection.Copy
            ActiveSheet.PasteSpecial Format:="图片 (JPEG)" '英文版为"Picture (JPEG)"
            Selection.Name = "myPic"
        ElseIf k = vbNo Then
            Selection.ShapeRange.LockAspectRatio = msoFalse
            f = InputBox("放大缩小比率", "图片尺寸设定", 2)
            If IsNumeric(f) And f > 0 Then
                Selection.ShapeRange.Height = ph * f
                Selection.ShapeRange.Width = pw * f
            Else
                Selection.ShapeRange.Height = InputBox("重新设定图片高度", "图片高尺寸设定", ph)
                Selection.ShapeRange.Width = InputBox("重新设定图片宽度", "图片宽尺寸设定", pw)
            End If
        End If
        
        Selection.CopyPicture
        With ActiveSheet.ChartObjects.Add(0, 0, Selection.Width + 5, Selection.Height + 5).Chart
            .Paste
            .Export myDir & p.Name, "JPG"
            .Parent.Delete
        End With
        
        If k = vbYes Then
            ActiveSheet.Shapes("myPic").Delete
        ElseIf k = vbNo Then
            p.Height = ph
            p.Width = pw
        End If
        p.TopLeftCell.Offset(r, c).Select
    Next
   
End Sub

箱子.rar

229.85 KB, 下载次数: 898

TA的精华主题

TA的得分主题

发表于 2010-9-12 00:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 andyyan 于 2009-9-4 22:47 发表
如何导出B列中的所有图片,并以A列的货号做为图片的名称。非常感谢,问题请看附件。


楼主看我的改进加强版。

Sub PicOutput()
    OpenFile = Application.GetOpenFilename("请选择任一文件后按确定(*.*),*.*", , "选择任一文件确定图片输出文件夹,或取消获得当前文件所在文件夹。")

    If OpenFile = False Then
        myDir = ThisWorkbook.Path & "\"
    Else
        myDir = Left(OpenFile, InStrRev(OpenFile, "\"))
    End If
   
    k = InputBox("1=列左,2=列右,3=上一行,4=下一行,取消=图片所在单元格或无名称", "选择图片名称位置:", 2)
    If k = 1 Then
        r = 0: c = -1
    ElseIf k = 2 Then
        r = 0: c = 1
    ElseIf k = 3 Then
        r = -1: c = 0
    ElseIf k = 4 Then
        r = 1: c = 0
    End If

    k = MsgBox("Yes=按原尺寸,No=按新设定,Cancel=按现在显示", vbYesNoCancel, "输出图片尺寸大小选择")
    For Each p In ActiveSheet.Shapes
        ph = p.Height
        pw = p.Width
        On Error Resume Next
        pn = p.TopLeftCell.Offset(r, c).Value
        If Err.Number <> 0 Then Err.Clear
        If pn = "" Then n = n + 1: pn = Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") - 1) & Format(n, "000")
        
GetPicName:
        On Error Resume Next
        p.Name = pn & ".jpg"
        If Err.Number <> 0 Then
            Err.Clear
            pn = InputBox("图片名称重复,请重新命名", "图片名称重复", pn)
            GoTo GetPicName
        End If
        
        p.Select
        If k = vbYes Then
            Selection.Copy
            ActiveSheet.PasteSpecial Format:="图片 (JPEG)" '英文版为"Picture (JPEG)"
            Selection.Name = "myPic"
        ElseIf k = vbNo Then
            Selection.ShapeRange.LockAspectRatio = msoFalse
            f = InputBox("放大缩小比率", "图片尺寸设定", 2)
            If IsNumeric(f) And f > 0 Then
                Selection.ShapeRange.Height = ph * f
                Selection.ShapeRange.Width = pw * f
            Else
                Selection.ShapeRange.Height = InputBox("重新设定图片高度", "图片高尺寸设定", ph)
                Selection.ShapeRange.Width = InputBox("重新设定图片宽度", "图片宽尺寸设定", pw)
            End If
        End If
        
        Selection.CopyPicture
        With ActiveSheet.ChartObjects.Add(0, 0, Selection.Width + 5, Selection.Height + 5).Chart
            .Paste
            .Export myDir & p.Name, "JPG"
            .Parent.Delete
        End With
        
        If k = vbYes Then
            ActiveSheet.Shapes("myPic").Delete
        ElseIf k = vbNo Then
            p.Height = ph
            p.Width = pw
        End If
        p.TopLeftCell.Offset(, -1).Select
    Next
   
End Sub

批量导出图片.rar

108.02 KB, 下载次数: 820

TA的精华主题

TA的得分主题

发表于 2010-9-12 07:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主的问题是导出图片,我现在的问题是想导入图片。请问:怎样批量导入图片,比如将D盘的"图片"文件夹中的图片导入到B列,并且图片的名称与A列的货号相对应名称,应如何设置宏代码。

[ 本帖最后由 lbl016 于 2010-9-12 07:16 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-9-12 09:00 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-9-12 09:44 | 显示全部楼层
原帖由 lbl016 于 2010-9-12 07:13 发表
楼主的问题是导出图片,我现在的问题是想导入图片。请问:怎样批量导入图片,比如将D盘的"图片"文件夹中的图片导入到B列,并且图片的名称与A列的货号相对应名称,应如何设置宏代码。


这个更简单啊。参考:
http://club.excelhome.net/thread-611346-1-1.html

改进版,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

TA的精华主题

TA的得分主题

发表于 2010-9-12 10:09 | 显示全部楼层
香川群子老师,能否做到输入一个人的姓名或其他信息就直接从图片库中调入其照片到指定位置。(图片库中照片与其人的姓名或其他信息相对应)

[ 本帖最后由 lbl016 于 2010-9-12 10:24 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-9-12 11:13 | 显示全部楼层
香川群子老师,您在22楼及23楼所编VBA确实解决了图片导出问题,但是导出的图片文件名或为“箱子1、箱子2、箱子3”或为“批量导出图片1、批量导出图片2、批量导出图片3”,并没有按照某列自动命名为“YF0002-447-01、YF0002-447-02、YG0013-347-01”,请帮忙解决!~(最好可以临时选择“按B列命名或按A列命名”)
感激不尽!

TA的精华主题

TA的得分主题

发表于 2010-9-12 11:37 | 显示全部楼层
原帖由 晨曦矇眬 于 2010-9-12 11:13 发表
香川群子老师,您在22楼及23楼所编VBA确实解决了图片导出问题,但是导出的图片文件名或为“箱子1、箱子2、箱子3”或为“批量导出图片1、批量导出图片2、批量导出图片3”,并没有按照某列自动命名为“YF0002-447-01、 ...



可以选择的呀。

稍微又改了一下。
自己琢磨一下附件吧。

箱子2.rar

227.69 KB, 下载次数: 496

TA的精华主题

TA的得分主题

发表于 2010-9-12 12:10 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-9-12 19:49 | 显示全部楼层

导出图片时,选择已经存在的文件夹的代码。

Public FilePath As String
Public SubDir As Boolean
Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As FolderInfor) As Long
Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function EnableWindow Lib "user32" (ByVal hWnd As Long, ByVal fEnable As Long) As Long
Public Type FolderInfor
    hOwner As Long
    pidlRoot As Long
    pszDisplayName As String
    lpszTitle As String
    ulFlags As Long
    lpfn As Long
    lParam As Long
    iImage As Long
End Type

Function BrowseDir() As String
    Dim iFolder As FolderInfor
    Dim pidl As Long, Flag As Long, iPath As String, Pos As Integer, myPath As String
   
    EnableWindow FindWindow("XLMAIN", Application.Caption), False
    pidl& = SHBrowseForFolder(iFolder)
   
    EnableWindow FindWindow("XLMAIN", Application.Caption), True
    iPath = Space$(512)
   
    Flag = SHGetPathFromIDList(ByVal pidl, ByVal iPath)
    If Flag Then
        Pos = InStr(iPath, Chr$(0))
        BrowseDir = Left(iPath, Pos - 1)
    Else
        BrowseDir = ThisWorkbook.Path
    End If
End Function

这样的话,原来代码中改成

myDir = BrowseDir & "\"

就可以使用上面的代码得到文件夹参数啦。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-28 01:48 , Processed in 0.041974 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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