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

操作界面如下图:

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

1、ThisWorkbook的open事件代码:
Private Sub Workbook_Open()
ThisWorkbook.Sheets().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, ",")()
End If
End Sub
2、“测试过程”代码:
Sub doInsertPics()
'插入图片
Dim arrFiles() As String
Dim myPath As String
Dim i, j As Integer
i = : j =
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) + & "张照片!" For Each file In arrFiles
Call sht1.insertPic(file, Cells(i, j), )
Cells(i, j).Offset(, ).NumberFormatLocal = "@"
Cells(i, j).Offset(, ) = sht1.getFileNameFromFullName(file, False)
j = j +
If j > Then
j =
i = i +
If i > 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 = To
For j = To
If Sheets("照片处理").Range("a" & i).Offset(, j - ).Value = "" Or Sheets("照片处理").Range("a" & i).Offset(, j - ).Value = "" Then Exit Sub
Name picPath & Sheets("照片处理").Range("a" & i).Offset(, j - ).Value As picPath & Sheets("照片处理").Range("a" & i).Offset(, j - ).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 = )
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 - * blank, h - * 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 = To
sht.Range("a3:i3").Offset( * 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 =
Set fso = CreateObject("scripting.filesystemobject")
For Each fld In fso.getfolder(thePath).subfolders
ReDim Preserve arr(i)
arr(i) = fld.Name
i = i +
Next
Set fso = Nothing
If i > 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 =
Set fso = CreateObject("scripting.filesystemobject")
For Each fld In fso.getfolder(wb.Path).subfolders
ReDim Preserve arr(i)
arr(i) = fld.Name
i = i +
Next
Set fso = Nothing
If i > 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 =
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 +
End If
Next
End If
Set fso = Nothing
Set fil = Nothing
If i > 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, ".") - ) '返回不带扩展名文件名
Else
getFileNameFromFullName = FileName '返回带扩展名文件名
End If
End Function
'======================================================================================================= Function isEmptyArr(ByRef arr()) As Boolean '判断是否为空数组
Dim tempStr As String
tempStr = Join(arr, ",")
isEmptyArr = LenB(tempStr) <=
End Function
4、原文件下载
Excel VBA批量处理寸照名字(类模块加FSO版)的更多相关文章
- Excel VBA批量处理寸照名字
需求:因为处理学生学籍照片,从照相馆拿回来的寸照是按班级整理好,文件名是相机编号的文件.那么处理的话,是这么一个思路,通过Excel表格打印出各班A4照片列表,让学生自行填上照片对应姓名.表格收回来后 ...
- Excel VBA ——批量工作表重命名
虽然平常在用excel 2010重命名工作表的时候,一般可能会用"双击工作表"的方法来重名,但是遇到大批量重名的时候就很麻烦. 我的方法,先建一张新表,然后在第一列写好要命名的表名 ...
- Excel VBA批量修改文件夹下的文件名
今天,有同事提出想批量修改文件名,规则比较简单,在第五位后加“-”即可, 上网没找到相关工具,就自己做了个excel,用宏代码修改. 代码如下: Private Sub CommandButton1_ ...
- Excel vba:批量生成超链接,添加边框,移动sheet等
Excel vba 操作 批量生成sheet目录并添加超链接 Sub Add_Sheets_Link() 'Worksheets(5)为清单目录页 '在sheet页上生成sheet页名字并超链接 To ...
- 【游戏开发】Excel表格批量转换成lua的转表工具
一.简介 在上篇博客<[游戏开发]Excel表格批量转换成CSV的小工具> 中,我们介绍了如何将策划提供的Excel表格转换为轻便的CSV文件供开发人员使用.实际在Unity开发中,很多游 ...
- Excel VBA入门(九)操作工作薄
虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做.绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理. ...
- 如何调试Excel VBA代码
Excel VBA出错时给出的错误信息极少,需要充分利用各种工具来进行调试. 1.编译错误 常见的编译错误有: 错误的源代码格式,比如if后面缺少then:在编辑器中该行会变成红色. 错误的语法结构, ...
- Excel VBA入门(十)用户窗体开发
VBA 中的用户窗体就是指带 UI 的用户界面,在运行的时候会单独弹出一个窗口,类似于在 windows 系统中运行的一个可执行程序一样(这个说法不太严谨,因为可执行程序也可能是只有命令窗口而没有 U ...
- 将excel文件批量转成pdf
防止数据编辑.改动带来的不一致性,常常要将excel文件转成pdf文件再共享.发送给对方.有时excel文件还挺多,手头上保存实在是太慢了.就考虑用VBA批量转置. 掌握几个东西,就比较容易了: 1. ...
随机推荐
- oracle数据库架构
3.1 Client/Server Oracle 采取的是 Client/Server 架构. oracle 服务端分为两部分: Instance 实例 Database 数据库 实例, 又称为数据库 ...
- Django【第21篇】:Ajax之FormData
ajax补充--------FormData等... 一.回顾上节知识点 1.什么是json字符串? 轻量级的数据交换格式 2.定时器:关于setTimeout setTimeout(foo,3000 ...
- 阅读《Effective Java》每条tips的理解和总结(2)(持续更新)
15. 使类和成员的可访问性最小化 一个好用的类的属性必须要隐藏起来,干净的将它与类的api分离开来,类之间只通过api相互使用,降低他们之间的耦合性.为了做到这一点,建议根据情况选择尽可能低的访问级 ...
- Python---进阶---常用模块os、jso
一.写一个6位随机验证码程序(使用 random模块),要求验证码中至少包含一个数字.一个小写字母.一个大写字母 import randomimport string #help(string) co ...
- luogu 4381 [IOI2008]Island 单调队列 + 基环树直径 + tarjan
Description 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样 ...
- CopyOnWrite 个人理解以及应用
缘由 最近在看<Redis 设计与实现>,看到Redis的执行bgsave生成dump.rdb是根据CopyOnWrite的 之前也不是很懂为啥要有CopyOnWrite这个东西 翻看文章 ...
- es的索引库模板
在实际的生产中,如果要插入大批量数据的时候需要使用多个索引库,如果我们还是手工指定每个索引的配置信息settings和mappings,是非常耗时的: 针对这种情况,es有index template ...
- HDU 6592 (LIS+输出字典序最大最小)
题意:给你一个序列,让你找长度最长的字典序最小和最大的单峰序列,单峰序列就是满足先增后降的序列. 思路:先正着求一遍LIS,再反着求一遍LIS,然后用单调栈来模拟. 求字典序最小的话,首先找到第一个顶 ...
- 整体二分初探 两类区间第K大问题 poj2104 & hdu5412
看到好多讲解都把整体二分和$CDQ$分治放到一起讲 不过自己目前还没学会$CDQ$分治 就单独谈谈整体二分好了 先推荐一下$XHR$的 <浅谈数据结构题的几个非经典解法> 整体二分在当中有 ...
- VMware 虚拟化编程(10) — VMware 数据块修改跟踪技术 CBT
目录 目录 前文列表 数据块修改跟踪技术 CBT 为虚拟机开启 CBT CBT 修改数据块偏移量获取函数 QueryChangedDiskAreas changeId 一个 QueryChangedD ...