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. ...
随机推荐
- POJ1523 SPF 单点故障
POJ1523 题意很简单,求删除割点后原先割点所在的无向连通图被分成了几个连通部分(原题说prevent at least one pair of available nodes from bein ...
- Python---进阶---logging---装饰器打印日志2
### logging - logging.debug - logging.info - logging.warning - logging.error - logging.critical ---- ...
- 《转》tensorflow学习笔记
from http://m.blog.csdn.net/shengshengwang/article/details/75235860 1. RNN结构 解析: (1)one to one表示单输入单 ...
- js 获取滚动位置,滚动到指定位置,平滑滚动
1.获取当前滚动条位置信息 var top = dom.scrollTop; // 获取y轴上的滚动位置 var left = dom.scrollLeft; // 获取x轴上的滚动位置 2.滚动到指 ...
- javascript 通用定义
通用约定 注释 原则 As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性.可读性. As long as necessary(如有必要,尽量详尽):合理的注释.空 ...
- [洛谷2257]ZAP-Queries 题解
前言 这道题还是比较简单的 解法 首先将题目转化为数学语言. 题目要我们求的是: \[\sum_{i=1}^a\sum_{j=1}^b[gcd(i,j)=d]\] 按照套路1,我们将其同时除以d转换为 ...
- 转载--C 的回归
转载自http://blog.codingnow.com/2007/09/c_vs_cplusplus.html 周末出差,去另一个城市给公司的一个项目解决点问题.回程去机场的路上,我用手机上 goo ...
- permutation 2
permutation 2 猜了发结论过了== $N$个数的全排列,$p_{1}=x,p_{2}=y$要求$|p_{i+1}-p_{i}|<=2|$求满足条件的排列个数. 首先考虑$x=1,y= ...
- 大数据笔记(十五)——Hive的体系结构与安装配置、数据模型
一.常见的数据分析引擎 Hive:Hive是一个翻译器,一个基于Hadoop之上的数据仓库,把SQL语句翻译成一个 MapReduce程序.可以看成是Hive到MapReduce的映射器. Hive ...
- 关于跨域踩的坑,浏览器 status code为200,但实际上是跨域了
背景 后端使用Nginx并更改本地host文件,起本地服务.将aaa.bbbb.com代理至本地IP地址(10.26.36.156).使用$.ajax调用后端restful接口,要求content-t ...