Excel VBA批量处理寸照名字(类模块加FSO版)

需求:因为处理学生学籍照片,从照相馆拿回来的寸照是按班级整理好,文件名是相机编号的文件。那么处理的话,是这么一个思路,通过Excel表格打印出各班A4照片列表,让学生自行填上照片对应姓名。表格收回来后Excel表格上填入对应姓名,通过VBA更改电子档照片文件名。(此次重写使用了类模块和fso,并对插入的图片类型进行了过滤,避免了插入非图片类型文件)

大概流程如下图:

操作界面如下图:

vba代码模块如下图,包括ThisWorkbook的open事件代码、测试过程代码(即插入图片、删除图片、重命名图片三个按钮的代码):

1、ThisWorkbook的open事件代码:

Private Sub Workbook_Open()
    ThisWorkbook.Sheets(1).Select
    Dim dirs As String
    Dim rngList As Range
    Dim sht As New MySheet

    Set rngList = Range("l1")
    rngList.ClearContents
    rngList.Validation.Delete

    dirs = sht.getThisWorkbookSubFolders()
    Set sht = Nothing
    If dirs <> "" Then
        rngList.Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=dirs
        rngList.Value = Split(dirs, ",")(0)
    End If
End Sub

2、“测试过程”代码:

Sub doInsertPics()
‘插入图片
    Dim arrFiles() As String
    Dim myPath As String
    Dim i, j As Integer
    i = 2: j = 1
    Dim sht1 As New MySheet

    If Range("l1").Value = "" Then Exit Sub
    myPath = ThisWorkbook.Path & "\" & Range("l1").Value & "\"
    arrFiles = sht1.getSubFolderFiles(myPath, "jpg")

    On Error Resume Next
    MsgBox "文件夹“" & Range("l1") & "”总共有" & UBound(arrFiles) + 1 & "张照片!"

    For Each file In arrFiles
            Call sht1.insertPic(file, Cells(i, j), 3)
            Cells(i, j).Offset(1, 0).NumberFormatLocal = "@"
            Cells(i, j).Offset(1, 0) = sht1.getFileNameFromFullName(file, False)
            j = j + 1
            If j > 9 Then
                j = 1
                i = i + 3
                If i > 20 Then Exit For
            End If
    Next
    Set sht1 = Nothing
End Sub

Sub doDeletePics()
‘删除图片
    Dim sht1 As New MySheet
    Call sht1.deleteAllPics
    Set sht1 = Nothing
End Sub

Sub doRenamePics()
‘重命名图片
Dim i, j As Integer
Dim picPath As String

picPath = ThisWorkbook.Path & "\" & Range("l1").Value & "\"

For i = 1 To 7
    For j = 1 To 9
        If Sheets("照片处理").Range("a" & i).Offset(0, j - 1).Value = "" Or Sheets("照片处理").Range("a" & i).Offset(1, j - 1).Value = "" Then Exit Sub
        Name picPath & Sheets("照片处理").Range("a" & i).Offset(0, j - 1).Value As picPath & Sheets("照片处理").Range("a" & i).Offset(1, j - 1).Value
    Next

Next

End Sub

3、MySheet类模块代码:

Private sht As Worksheet
Private wb As Workbook

Public Sub Class_Initialize() ‘对象初始化函数
    Set wb = ThisWorkbook ‘wb初始化为活动工作表ThisWorkbook
    Set sht = ActiveSheet ‘sht初始化为活动工作表ActiveSheet
End Sub
‘=======================================================================================================
‘函数:   insertPic          在当前工作表插入图片
‘参数1: PictureFileName    图片全名(含完整路径)
‘参数2: TargetCell         图片插入目标单元格
‘参数3: blank              图片四周留白(可选)
‘作用:  在当前工作表的目标单元格插入图片,并可以在图片四周留白
‘=======================================================================================================
Sub insertPic(ByVal PictureFileName As String, ByVal TargetCell As Range, Optional ByVal blank As Integer = 0)
    Application.ScreenUpdating = False ‘禁止屏幕刷新
    Dim p As Shape

    If TypeName(ActiveSheet) <> "Worksheet" Then Exit Sub      ‘“工作表”外的其他类型表(如宏表,图表)中不插图片
    If Dir(PictureFileName) = "" Then Exit Sub      ‘文件名路径为空,没有图片,退出插入操作

    Dim t As Double, l As Double, w As Double, h As Double ‘t:top,l:left,w:with,h:height
    t = TargetCell.Top: l = TargetCell.Left: w = TargetCell.Width: h = TargetCell.Height

    Set p = sht.Shapes.AddPicture(PictureFileName, msoFalse, msoTrue, l + blank, t + blank, w - 2 * blank, h - 2 * blank)
    p.Placement = xlMoveAndSize
    Set p = Nothing
    Application.ScreenUpdating = True ‘恢复屏幕刷新
End Sub

‘=======================================================================================================
‘函数:   deleteAllPics   删除当前工作簿的所有图片,并清除图片下面单元格的图片名字
‘=======================================================================================================
Sub deleteAllPics()
    Application.ScreenUpdating = False ‘禁止屏幕刷新

    Dim shp As Shape
    For Each shp In sht.Shapes
        If shp.Type = msoPicture Or shp.Type = msoLinkedPicture Then shp.Delete ‘图形的类型为mosPicture(图片)或mosLinkedPicture(链接图片)则删除
    Next
    For i = 0 To 7
        sht.Range("a3:i3").Offset(3 * i).ClearContents
    Next

    Application.ScreenUpdating = True ‘恢复屏幕刷新
End Sub
‘=======================================================================================================
‘函数:   getSubFolders   ‘获取thePath路径下的子文件名称
‘=======================================================================================================
Function getSubFolders(ByVal thePath As String) As String ‘获取thePath路径下的子文件名称
    Dim fso As Object
    Dim fld As Object
    Dim arr() As String
    Dim i As Integer
    i = 0
    Set fso = CreateObject("scripting.filesystemobject")
    For Each fld In fso.getfolder(thePath).subfolders
        ReDim Preserve arr(i)
        arr(i) = fld.Name
        i = i + 1
    Next
    Set fso = Nothing
    If i > 0 Then
        getSubFolders = VBA.Join(arr, ",")
    Else
        getSubFolders = ""
    End If
End Function
‘=======================================================================================================
‘函数:   getThisWorkbookSubFolders  获取当前工作簿路径下的“子文件夹”名称
‘=======================================================================================================
Function getThisWorkbookSubFolders() As String ‘获取当前工作簿路径下的子文件名称
    Dim fso As Object
    Dim fld As Object
    Dim arr() As String
    Dim i As Integer
    i = 0
    Set fso = CreateObject("scripting.filesystemobject")
    For Each fld In fso.getfolder(wb.Path).subfolders
        ReDim Preserve arr(i)
        arr(i) = fld.Name
        i = i + 1
    Next
    Set fso = Nothing
    If i > 0 Then
        getThisWorkbookSubFolders = VBA.Join(arr, ",")
    Else
        getThisWorkbookSubFolders = ""
    End If
End Function
‘=======================================================================================================
‘函数:   getSubFolderFiles  获取folderPath路径下的某类文件全名(即含路径文件名),返回数组
‘=======================================================================================================

Function getSubFolderFiles(ByVal folderPath As String, Optional ByVal ExtensionName As String = "") As String()
    Dim fso, fil As Object
    Dim arr() As String
    Dim i As Integer
‘    MsgBox fso.folderexists(folderPath)

    i = 0
    Set fso = CreateObject("scripting.filesystemobject")
    If fso.folderexists(folderPath) Then
        For Each fil In fso.getfolder(folderPath).Files
            If fso.getExtensionName(fil.Path) Like ExtensionName & "*" Then
                ReDim Preserve arr(i)
                arr(i) = fil.Path
    ‘            arr(1, i) = fil.Name
                i = i + 1
            End If
        Next
    End If
    Set fso = Nothing
    Set fil = Nothing
    If i > 0 Then
        getSubFolderFiles = arr
    End If
End Function
‘=======================================================================================================
‘函数:   getFileNameFromFullName   根据文件带全路径全名获得文件名
‘参数1: strFullName  文件全名
‘参数2: ifExName true 返回字符串含扩展名,默认是:False
‘参数3: strSplitor  各级文件夹分隔符
‘作用:  从带路径文件全名径获取返回:  文件名(true带扩展名)
‘=======================================================================================================
Public Function getFileNameFromFullName(ByVal strFullName As String, _
                               Optional ByVal ifExName As Boolean = False, _
                               Optional ByVal strSplitor As String = "\") As String
    ‘=======代码开始==============================================================================
    Dim ParentPath As String
    Dim FileName As String
    ParentPath = Left$(strFullName, InStrRev(strFullName, strSplitor, , vbTextCompare)) ‘反向查找路径分隔符,获取文件父级目录
    FileName = Replace(strFullName, ParentPath, "") ‘替换父级目录为空得到文件名
    If ifExName = False Then
        getFileNameFromFullName = Left(FileName, InStrRev(FileName, ".") - 1) ‘返回不带扩展名文件名
    Else
        getFileNameFromFullName = FileName ‘返回带扩展名文件名
    End If
End Function
‘=======================================================================================================

Function isEmptyArr(ByRef arr()) As Boolean   ‘判断是否为空数组
Dim tempStr As String
tempStr = Join(arr, ",")
isEmptyArr = LenB(tempStr) <= 0
End Function

4、原文件下载

时间: 2024-10-07 04:17:29

Excel VBA批量处理寸照名字(类模块加FSO版)的相关文章

Excel VBA批量处理寸照名字

需求:因为处理学生学籍照片,从照相馆拿回来的寸照是按班级整理好,文件名是相机编号的文件.那么处理的话,是这么一个思路,通过Excel表格打印出各班A4照片列表,让学生自行填上照片对应姓名.表格收回来后Excel表格上填入对应姓名,通过VBA更改电子档照片文件名. Function getSubDirectory()'获取当前文件的下层所有目录 Dim strCurDir, strDirectoryName, strDirs As String Dim arrDirectoryName() Dim

VBA excel中批量创建超链接代码(连接当前文档中的sheet)

excel中批量创建超链接代码(连接当前文档中的sheet),在sheet1中B列中要创建一系列的超链接,链接的内容是本文档中的其他sheet,如下图,在sheet1下创建宏,代码如下. Sub 宏1() Dim temp, temp2 Dim i, j j = 1 For i = 5 To 74 temp = "'G" & j & "'!A1" temp2 = "G" & j Range("B" &a

别怕excel vba其实很简单(第2版)pdf

下载地址:网盘下载 内容简介  · · · · · · 对于大部分没有编程基础的职场人士来说,在学习VBA时往往会有很大的畏难情绪.本书正是针对这样的人群,用浅显易懂的语言和生动形象的比喻,并配合大量插画,对Excel中看似复杂的概念和代码,从简单的宏录制.VBA编程环境和基础语法的介绍,到常用对象的操作与控制.执行程序的自动开关-对象的事件.设计自定义的操作界面.调试与优化编写的代码,都进行了形象的介绍. 本书适合那些希望提高工作效率的职场人士,特别是经常需要处理和分析大量数据的用户,也适合财

如何调试Excel VBA代码

Excel VBA出错时给出的错误信息极少,需要充分利用各种工具来进行调试. 1.编译错误 常见的编译错误有: 错误的源代码格式,比如if后面缺少then:在编辑器中该行会变成红色. 错误的语法结构,比如if和end if没有对应上:代码运行前会给出编译错误提示. 类型不匹配:函数输入的参数与定义时的参数类型不同时会出现该类错误. 变量未定义:指使用了没有申明的变量类型(当Option Explicit时) 建议: 格式规范化,严格缩进.VBA插件Smart Indent是一个很好的辅助工具.这

【游戏开发】Excel表格批量转换成lua的转表工具

一.简介 在上篇博客<[游戏开发]Excel表格批量转换成CSV的小工具> 中,我们介绍了如何将策划提供的Excel表格转换为轻便的CSV文件供开发人员使用.实际在Unity开发中,很多游戏都是使用Lua语言进行开发的.如果要用Lua直接读取CSV文件的话,又要写个对应的CSV解析类,不方便的同时还会影响一些加载速度,牺牲游戏性能.因此我们可以直接将Excel表格转换为lua文件,这样就可以高效.方便地在Lua中使用策划配置的数据了.在本篇博客中,马三将会和大家一起,用C#语言实现一个Exce

Excel VBA入门(十)用户窗体开发

VBA 中的用户窗体就是指带 UI 的用户界面,在运行的时候会单独弹出一个窗口,类似于在 windows 系统中运行的一个可执行程序一样(这个说法不太严谨,因为可执行程序也可能是只有命令窗口而没有 UI 的).再具体一点,就是一个窗口界面当中,有可能会包含有文本框.复选框.单选按钮.下拉列表,就如在网页中填写的表单一样.再具体一点,就是如下图这样的: 1. 用户界面设计 如上图,UI 设计的部分其实是很简单的,微软的特色,直接拖拉拽就可以实现了.而每一个控件(或者称为元素,也即放进窗体中的各种按

VBA类模块--创建Table类(1)

VBA开发接触了两个月,自认为拜托了新手期,遇到很多问题,也有一些心得.根据开发中遇到的问题开始陆续总结. 开发过程中,遇到程序运行过程中的存储大量临时数据问题,这些数据只是用于下一步的计算,不需要呈现在最后的结果中.为了后面步骤使用和管理方便,创建了Table类模块. 类模块:CTable 1 Option Explicit 2 3 '==================================== 4 '名称: CTable 5 '功能: 描述一个Excel表格区域 6 '=====

Excel VBA(宏):添加宏

写在前面: 1.编写宏,打开VBA,双击ThisWorkbook对当前工作薄进行编写宏:双击Sheet1,对整个sheet编写宏: 或者创建模块,在模块里,编写.调试代码. 打开VBA的方法见第一讲,结合常用窗口进行编写.调试. 2.部分对象有提示,如Dim a As,敲击空格后有提示. 3.所有宏要运行,必须启动宏.(2007版启动宏,点击表格左上角 "excel选项" "信任中心" "信任中心设置" "启用宏") 4.&q

2017-5-29 Excel VBA 小游戏

---恢复内容开始--- 转一个Excel VBA的小游戏,最近对excel有了更深入的了解,功能很强大,也刷新了我对待事情的态度. 一.准备界面 我们先来把游戏界面准备好,选中前4行,行高调成50,这时候单元格就近似一个正方形.然后给4*4的单元格加上全部框线,再加粗外框线.字体改成微软雅黑,加粗,居中.第6行A列写上SCORE,C列写上MOVES,都加粗. 一般2048这样的游戏需要用状态机来实现,就是程序无限运行直到游戏结束.在Excel中这种方法不太合适,使用工作表自带的Workshee