需求:因为处理学生学籍照片,从照相馆拿回来的寸照是按班级整理好,文件名是相机编号的文件。那么处理的话,是这么一个思路,通过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版)的更多相关文章

  1. Excel VBA批量处理寸照名字

    需求:因为处理学生学籍照片,从照相馆拿回来的寸照是按班级整理好,文件名是相机编号的文件.那么处理的话,是这么一个思路,通过Excel表格打印出各班A4照片列表,让学生自行填上照片对应姓名.表格收回来后 ...

  2. Excel VBA ——批量工作表重命名

    虽然平常在用excel 2010重命名工作表的时候,一般可能会用"双击工作表"的方法来重名,但是遇到大批量重名的时候就很麻烦. 我的方法,先建一张新表,然后在第一列写好要命名的表名 ...

  3. Excel VBA批量修改文件夹下的文件名

    今天,有同事提出想批量修改文件名,规则比较简单,在第五位后加“-”即可, 上网没找到相关工具,就自己做了个excel,用宏代码修改. 代码如下: Private Sub CommandButton1_ ...

  4. Excel vba:批量生成超链接,添加边框,移动sheet等

    Excel vba 操作 批量生成sheet目录并添加超链接 Sub Add_Sheets_Link() 'Worksheets(5)为清单目录页 '在sheet页上生成sheet页名字并超链接 To ...

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

    一.简介 在上篇博客<[游戏开发]Excel表格批量转换成CSV的小工具> 中,我们介绍了如何将策划提供的Excel表格转换为轻便的CSV文件供开发人员使用.实际在Unity开发中,很多游 ...

  6. Excel VBA入门(九)操作工作薄

    虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做.绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理. ...

  7. 如何调试Excel VBA代码

    Excel VBA出错时给出的错误信息极少,需要充分利用各种工具来进行调试. 1.编译错误 常见的编译错误有: 错误的源代码格式,比如if后面缺少then:在编辑器中该行会变成红色. 错误的语法结构, ...

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

    VBA 中的用户窗体就是指带 UI 的用户界面,在运行的时候会单独弹出一个窗口,类似于在 windows 系统中运行的一个可执行程序一样(这个说法不太严谨,因为可执行程序也可能是只有命令窗口而没有 U ...

  9. 将excel文件批量转成pdf

    防止数据编辑.改动带来的不一致性,常常要将excel文件转成pdf文件再共享.发送给对方.有时excel文件还挺多,手头上保存实在是太慢了.就考虑用VBA批量转置. 掌握几个东西,就比较容易了: 1. ...

随机推荐

  1. wepy-数据双向绑定input

    初入wepy,发现wepy和vue神似,但还是有不一样的地方,例如v-model数据双向绑定 场景: 一个input搜索框,用户输入内容,点击“叉叉”按钮,输入的内容全部清空,这是一个很常见的场景 j ...

  2. 半小时写完替罪羊重构点分树做动态动态点分治之紫荆花之恋的wyy贴心指导

    刷题训练 初学者 有一定语言基础,但是不了解算法竞赛,水平在联赛一等奖以下的. 参考书:<算法竞赛入门经典--刘汝佳>,<算法竞赛入门经典训练指南--刘汝佳> 题库:洛谷(历年 ...

  3. 简单了解Spring中常用工具类_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 文件资源操作 Spring 定义了一个 org.springframework.core.io.Resource 接口, ...

  4. UVALive 3263: That Nice Euler Circuit (计算几何)

    题目链接 lrj训练指南 P260 //==================================================================== // 此题只需要考虑线 ...

  5. 不同地区Android开发者使用哪些设备测试APP?

    我们的团队密切关注着移动世界的趋势,以便可以提供所有有关变化的最紧密和最重要的信息.春天恰好是对app进行新一轮测试并检查其与不同Android设备兼容性如何的最佳时机.下面让我们一起来看看全世界范围 ...

  6. 果蝇优化算法(FOA)

    果蝇优化算法(FOA) 果蝇优化算法(Fruit Fly Optimization Algorithm, FOA)是基于果蝇觅食行为的仿生学原理而提出的一种新兴群体智能优化算法. 果蝇优化算法(FOA ...

  7. AC自动机2

    AC自动机 给N个模式串,求文本串中出现次数最多的模式串出现次数. #include<bits/stdc++.h> using namespace std; #define maxn 10 ...

  8. Oracle诊断: 服务器启后,无法连接

    Oracle 服务器启后,使用Toad 客户端连接oracle 时候,遇到下面的错误: oracle ORA-12514: TNS: no listener TNS: listener does no ...

  9. Ubuntu启动 卡在checking battery state 解决方案

    Ubuntu启动,卡在checking battery statALT + F1或者CTRL+ALT+F6切换到命令行[CTRL+ALT+F7返回界面]执行 sudo gdm start后就可以正常登 ...

  10. Ubuntu中几个字符小玩意儿

    1.黑客帝国特效: 打开终端,输入 sudo apt install cmatrix 即可.安装完成后,在终端输入 cmatrix 即可出现特效. 2.奔跑的小火车: 终端输入:sudo apt in ...