Excel VBA批量处理寸照名字

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

Function getSubDirectory()‘获取当前文件的下层所有目录
    Dim strCurDir, strDirectoryName, strDirs As String
    Dim arrDirectoryName()
    Dim i As Integer

    strCurDir = ThisWorkbook.Path & "\"

    strDirectoryName = Dir(strCurDir, vbDirectory)
     ‘暂存目录的数组arrTemp下标从“0”开始
    i = 0
    Do While strDirectoryName <> ""      ‘ 开始循环。
        ‘跳过当前的目录及上层目录(一个点个两个点为名字的目录)。
        If strDirectoryName <> "." And strDirectoryName <> ".." Then
            ‘使用位比较来确定 MyName 代表一目录。
            If (GetAttr(strCurDir & strDirectoryName) And vbDirectory) = vbDirectory Then
                ‘动态增加数组元素
                ReDim Preserve arrDirectoryName(i)
                arrDirectoryName(i) = strDirectoryName
                i = i + 1
                ‘Debug.Print MyName
                ‘如果它是一个目录,将其名称显示出来。
            End If
        End If
        strDirectoryName = Dir
        If strDirectoryName = "" And i = 0 Then
            getSubDirectory = ""
            Exit Function
        End If

        ‘查找下一个目录。
    Loop

    If UBound(arrDirectoryName) = 0 Then
        getSubDirectory = arrDirectoryName(0)
    Else
        strDirs = Join(arrDirectoryName, ",") ‘把数组处理为“,”分隔字符串返回
        Erase arrDirectoryName
        getSubDirectory = strDirs
    End If
End Function
Function getSubDirFileNames(subDir1 As String) As String() ‘返回当前工作簿目录的指定子目录文件名数组的函数
    Dim arrFileNames() As String  ‘存储文件名数组
    Dim i As Integer

    If subDir1 = "" Then
        ReDim Preserve arrFileNames(0)
        arrFileNames(0) = ""
        getSubDirFileNames = arrFileNames
        Exit Function
    End If

    myPath = ThisWorkbook.Path + "\" + subDir1 + "\*.jpg" ‘当前工作簿目录子目录文件存放路径

    i = 0
    strName = Dir(myPath)
    Do While strName <> ""
        ReDim Preserve arrFileNames(i)
        arrFileNames(i) = strName
        i = i + 1
        strName = Dir ‘再次执行不带参数dir函数即显示下一文件的文件名(参照vba的dir函数执行规则)
    Loop

    If i < 1 Then
        ReDim Preserve arrFileNames(0)
        arrFileNames(0) = ""
        getSubDirFileNames = arrFileNames
        Exit Function
    End If
    getSubDirFileNames = arrFileNames
End Function

Sub deletePictures() ‘删除工作表所有图片函数

    Application.ScreenUpdating = False ‘禁止屏幕刷新
    ‘=====================================
    Dim shp As Shape
    For Each shp In ActiveSheet.Shapes
        If shp.Type = msoPicture Then ‘shape类型包含按钮、美术字、自选图形之类,msoPicture代表图片
            shp.Delete
        End If
    Next
    ‘=====================================

    Application.ScreenUpdating = True ‘恢复屏幕刷新

End Su
Sub insertPicture(PictureFileName As String, TargetCell As Range)‘插入图片函数

    Dim p As Object
    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    

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

    TargetCell.Select
    Set p = ActiveSheet.Pictures.Insert(PictureFileName)‘Pictures.Insert()函数是老版本函数,vbe对象浏览器中隐藏了,需要查看的话按F2键
    p.Placement = xlMoveAndSize‘图片随单元格缩放

    p.Width = w - 6‘根据需要调整图片高宽
    p.Height = h - 2

    p.Left = l + 3‘根据需要调整图片左上插入位置
    p.Top = t + 1
    ‘p.Left = p.Left + (TargetCell.Offset(0, 1).Left - l - p.Width) / 2
    ‘insertPicture = p
    Set p = Nothing

End Sub

下面是ThisWorkbook的open过程跟“插入图片”、“删除图片”、“重命名图片”的按钮代码

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

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

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

End Sub

“插入图片”按钮

Sub doInsertPictures()
Dim arrFiles() As String
Dim myPath As String
Dim i, j As Integer
i = 2: j = 1
Sheets(1).Select
myPath = ThisWorkbook.Path & "\" & Range("l1").Value & "\"
arrFiles = getSubDirFileNames(Range("l1").Value)
If arrFiles(0) <> "" Then
    For Each file In arrFiles
        Call insertPicture((myPath & file), Sheets(1).Cells(i, j))
        Sheets(1).Cells(i, j).Offset(1, 0).Value = file
        j = j + 1
        If j > 9 Then
            j = 1
            i = i + 3
            If i > 20 Then Exit For
        End If
    Next
End If
End Sub

“删除图片”按钮

Sub deletePicsNpicNames()
Call deletePictures
For i = 0 To 7
    Sheets(1).Range("a3:i3").Offset(i * 3).ClearContents
Next
End Sub

“重命名图片”按钮

Sub renamePics()
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

源文件下载:照片处理xls

时间: 2024-09-29 00:07:09

Excel VBA批量处理寸照名字的相关文章

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

需求:因为处理学生学籍照片,从照相馆拿回来的寸照是按班级整理好,文件名是相机编号的文件.那么处理的话,是这么一个思路,通过Excel表格打印出各班A4照片列表,让学生自行填上照片对应姓名.表格收回来后Excel表格上填入对应姓名,通过VBA更改电子档照片文件名.(此次重写使用了类模块和fso,并对插入的图片类型进行了过滤,避免了插入非图片类型文件) 大概流程如下图: 操作界面如下图: vba代码模块如下图,包括ThisWorkbook的open事件代码.测试过程代码(即插入图片.删除图片.重命名

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

bat批量修改图片的名字实现(两种方法)

问题描述: 业务中遇到需要批量修改大量图片的名字. 如下图,需要修改为图片名字"u="之后和","之前的那一串 解决思路1: bat批处理,网上查找相关代码如下: 1 @echo off 2 SetLocal EnableDelayedExpansion 3 4 REM 要查找的文件 5 set ext=*.jpg 6 7 REM 新文件名在原文件名中的起始位置,从0开始 8 set pstart=2 9 10 REM 新文件名在原文件名中的长度 11 set le

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

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

[VBA]批量替换PPT里的字体颜色

不知道为什么计组老师的大量课件字体是伤害视力的亮蓝色……看久了眼睛疼,想把颜色替换成保护视力一点的灰色,但是找了N久也没找到在图形界面上直接操作的方法,于是在MSDN上晃了晃,Google了一下,写了个VBA小脚本,只替换选定颜色,这样可以保留红色或者其他颜色的高亮,顺便把让人分心的花花背景也干掉. Sub ReplaceColor() Dim shape As shape Dim slide As slide Dim txt As TextRange On Error Resume Next

【分享】通过Excel生成批量SQL语句,处理大量数据的好办法

我们经常会遇到这样的要求:用户给发过来一些数据,要我们直接给存放到数据库里面,有的是Insert,有的是Update等等,少量的数据我们可以采取最原始的办法,也就是在SQL里面用Insert into来实现,但是如果有几十条几百条甚至上千条数据的时候继续写单独的SQL语句的话那就惨了,其实有两种简单的方法: 第一,将Excel数据整理好了之后,通过SQL的导入功能直接导进数据库,但是得保证数据库字段和Excel的字段一致. 第二,通过Excel来生成对应的SQL语句,直接将SQL语句复制到分析器