EXCEL单元格内容朗读方法

  1. 通过单元格位置改变出发的工作表事件
  2. Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  3. '双击单元格,Excel程序会朗读单元格的文字
  4. Target.Select
  5. Selection.Speak
  6. End Sub

按需求动态分配给每个人需要的工作表

  1. 姓名 项目表
  2. 张三 表一、表二
  3. 李四 表三、表一
  4. 王五 表二
  5. Sub shishi()
  6. 最大行 = ThisWorkbook.Sheets("方案").Range("A1").CurrentRegion.Rows.Count
  7. arr = ThisWorkbook.Sheets("方案").Range("A2:B" & 最大行)
  8. For i = 1 To UBound(arr)
  9. Set 工作簿 = Workbooks.Add
  10. brr = Split(arr(i, 2), "、")
  11. For j = LBound(brr) To UBound(brr)
  12. ThisWorkbook.Sheets(brr(j)).Copy after:=工作簿.Sheets(Sheets.Count)
  13. Next
  14. Excel.Application.DisplayAlerts = False
  15. 工作簿.Sheets(1).Delete
  16. Excel.Application.DisplayAlerts = True
  17. 工作簿.SaveAs "F:\" & arr(i, 1) & "xlsx"
  18. 工作簿.Close
  19. Next
  20. End Sub

按指定名称批量新建工作簿保存到指定文件夹下

  1. Sub CreateFiles()
  2. Dim strPath As String, strFileName As String
  3. Dim i As Long, r
  4. On Error Resume Next
  5. With Application.FileDialog(msoFileDialogFolderPicker)
  6. '用户选择文件夹路径
  7. If .Show Then strPath = .SelectedItems(1) Else Exit Sub
  8. '如果用户为选择文件夹则退出程序
  9. End With
  10. If Right(strPath, 1) <> "\" Then strPath = strPath & "\"
  11. Application.ScreenUpdating = False '取消屏幕刷新
  12. Application.DisplayAlerts = False '取消警告提示,当有重名工作簿时直接覆盖
  13. r = Range("a1:a" & Cells(Rows.Count, 1).End(xlUp).Row) '数据装入数组r
  14. For i = 2 To UBound(r) '标题不要,因此从第2个元素开始遍历数组r
  15. With Workbooks.Add '新建工作簿
  16. .SaveAs strPath & r(i, 1), xlWorkbookDefault
  17. '以指定名称、默认文件类型保存工作簿
  18. .Close True '关闭工作簿
  19. End With
  20. Next
  21. Application.ScreenUpdating = True
  22. Application.DisplayAlerts = True
  23. MsgBox "创建完成。"
  24. End Sub

按指定目录批量创建工作表

  1. Sub NewSht()
  2. Dim shtActive As Worksheet, sht As Worksheet
  3. Dim i As Long, strShtName As String
  4. On Error Resume Next '当代码出错时继续运行
  5. Set shtActive = ActiveSheet
  6. For i = 2 To shtActive.Cells(Rows.Count, 1).End(xlUp).Row
  7. '单元格A1是标题,跳过,从第2行开始遍历工作表名称
  8. strShtName = shtActive.Cells(i, 1).Value
  9. '工作表名强制转换为字符串类型
  10. Set sht = Sheets(strShtName)
  11. '当工作簿不存在工作表Sheets(strShtName)时,这句代码会出错,然后……
  12. If Err Then
  13. '如果代码出错,说明不存在工作表Sheets(t),则新建工作表
  14. Worksheets.Add , Sheets(Sheets.Count)
  15. '新建一个工作表,位置放在所有已存在工作表的后面
  16. ActiveSheet.Name = strShtName
  17. '新建的工作表必然是活动工作表,为之命名
  18. Err.Clear
  19. '清除错误状态
  20. End If
  21. Next
  22. shtActive.Activate
  23. '重新激活原工作表
  24. End Sub

把同文件夹下的图片批量插入到表格自动适应中

  1. Option Explicit
  2. Sub 插入图片()
  3. Dim i, 图片插入位置
  4. Sheets("sheet1").Shapes.SelectAll '选中工作表中所有的Shape对象
  5. Selection.Delete '删除这些选中的对象
  6. i = 2
  7. Do While Range("A" & i) <> ""
  8. Set 图片插入位置 = Sheet1.Cells(i, 2)
  9. Sheets("sheet1").Shapes.AddPicture(ThisWorkbook.Path & "\" & Sheet1.Cells(i, 1) & ".png", True, True, 图片插入位置.Left + 2, 图片插入位置.Top + 2, 图片插入位置.Width - 4, 图片插入位置.Height - 4).Select
  10. '取消图片的纵横比,适应单元格大小
  11. '如果想改变纵横比设置True,如果高和宽分别更改设置False
  12. Selection.ShapeRange.LockAspectRatio = msoFalse
  13. i = i + 1
  14. Loop
  15. Set 图片插入位置 = Nothing
  16. End Sub

对office文件设置自杀程序

  1. Private Sub Workbook_Open()
  2. Dim dat As Date
  3. dat = DateSerial(2020, 1, 1)
  4. If Date >= dat Then
  5. Application.DisplayAlerts = False
  6. MsgBox "你是在偷看我的文件吗?" & vbCr & "别以为我不知道,我就在你身后看着你!白衣服,长头发,没有腿的那个。"
  7. With ThisWorkbook
  8. .Saved = True
  9. .ChangeFileAccess xlReadOnly
  10. Kill .FullName
  11. .Close
  12. End With
  13. End If
  14. End Sub

多个Excel文件合并

  1. Sub a()
  2. Dim i, w1, arr
  3. Set w2 = ActiveWorkbook
  4. Set s2 = ActiveSheet
  5. arr = Excel.Application.GetOpenFilename("Excel文件,*.xls*", MultiSelect:=True)
  6. If IsArray(arr) Then
  7. For i = LBound(arr) To UBound(arr)
  8. Set w1 = Workbooks.Open(arr(i))
  9. For Each s1 In w1.Sheets
  10. s1.Copy after:=w2.Sheets(w2.Sheets.Count)
  11. w2.Sheets(w2.Sheets.Count).Name = Split(w1.Name, ".")(0) & s1.Name
  12. Next
  13. w1.Close
  14. Next
  15. End If
  16. End Sub

多个工作簿合并到一个工作簿。

  1. 在由多个工作簿合并到一个工作表之前,我们先把多个工作簿合并到一个工作簿。
  2. 1、新建一个工作薄,将其命名为合并后的名字,例如叫做:汇总工作簿。
  3. 2、打开此工作簿:“汇总工作簿”
  4. 3、在“汇总工作簿”下任一个工作表标签上点击右键,选择“查看代码”。
  5. Sub 工作薄间工作表合并()
  6. Dim FileOpen
  7. Dim X As Integer
  8. Application.ScreenUpdating = False
  9. FileOpen = Application.GetOpenFilename(FileFilter:="Microsoft Excel文件(.xlsx),.xlsx", MultiSelect:=True, Title:="合并工作薄")
  10. X = 1
  11. While X <= UBound(FileOpen)
  12. Workbooks.Open Filename:=FileOpen(X)
  13. Sheets().Move After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
  14. X = X + 1
  15. Wend
  16. ExitHandler:
  17. Application.ScreenUpdating = True
  18. Exit Sub
  19. errhadler:
  20. MsgBox Err.Description
  21. End Sub

多个工作簿指定工作表筛选指定内容进行合并

  1. Sub shishi()
  2. Excel.Application.ScreenUpdating = False
  3. Set FSO对象 = CreateObject("Scripting.FileSystemObject")
  4. Set 文件夹 = FSO对象.GetFolder("C:\Users\hp\Desktop\网友")
  5. For Each i In 文件夹.Files
  6. 文件名 = FSO对象.GetBaseName(i)
  7. Set 工作簿 = Workbooks.Open(i)
  8. Set 工作表 = 工作簿.Worksheets("Sheet1")
  9. 总行数 = 工作表.Range("A1").CurrentRegion.Rows.Count
  10. 工作表.Range("A1").AutoFilter field:=1, Criterial:=文件名
  11. Set 合并表 = ThisWorkbook.Worksheets("Sheet1")
  12. 合并表总行数 = 合并表.Range("A1").CurrentRegion.Rows.Count + 1
  13. 工作表.Rows("2:" & 总行数).Copy 合并表.Rows(合并表总行数)
  14. 工作簿.Close 0
  15. Next

访问当前工作簿属性

  1. Sub a()
  2. 'ThisWorkbook是代码所在的工作簿对象
  3. Range("B2") = ThisWorkbook.Name '获得工作簿名称
  4. Range("B3") = ThisWorkbook.Path '获得工作簿文件所在的路径
  5. Range("B4") = ThisWorkbook.FullName '获得带路径的工作簿名称
  6. End Sub

给当前工作簿重命名

  1. Sub a()
  2. Excel.Application.DisplayAlerts = False
  3. ActiveWorkbook.SaveAs Filename:="C:\Users\hp\Desktop\何文华.xlsx"
  4. Excel.Application.DisplayAlerts = True
  5. End Sub

工作簿打开时就提醒过生日的人名

  1. 将这段代码放到工作簿事件中,让工作簿打开时就提醒过生日的人名
  2. Sub a()
  3. Dim i
  4. i = 2: j = 1
  5. Do While Range("A" & i) <> ""
  6. If Month(Range("C" & i)) = Month(Date) And Day(Range("C" & i)) = Day(Date) Then
  7. MsgBox "今天是" & Range("A" & i) & "的生日"
  8. Sheets("生日名单").Range("A" & j) = Range("A" & i)
  9. j = j + 1
  10. End If
  11. i = i + 1
  12. Loop
  13. End Sub

获得当月的最后一天

  1. 131
  2. 228
  3. 331
  4. 430
  5. 531
  6. 630
  7. 731
  8. 831
  9. 930
  10. 1031
  11. 1130
  12. 1231
  13. Sub Serial()
  14. Dim DateStr As Byte
  15. DateStr = Day(DateSerial(Year(Date), Month(Date) + 1, 0))
  16. MsgBox "本月的最后一天是" & Month(Date) & "月" & DateStr & "号"
  17. End Sub

获得在对话框中选中任一的文件的路径

  1. Sub a()
  2. Dim i
  3. i = Excel.Application.GetOpenFilename
  4. If i = False Then
  5. MsgBox "没有选择任何文件!"
  6. Exit Sub
  7. Else
  8. Range("A1") = i
  9. End If
  10. End Sub

获取多层文件夹下文件名并新建超链接

  1. Sub AutoAddLink()
  2. Dim strFldPath As String
  3. With Application.FileDialog(msoFileDialogFolderPicker)
  4. '用户选择指定文件夹
  5. .Title = "请选择指定文件夹。"
  6. If .Show Then strFldPath = .SelectedItems(1) Else Exit Sub
  7. '未选择文件夹则退出程序,否则将地址赋予变量strFldPath
  8. End With
  9. Application.ScreenUpdating = False
  10. '关闭屏幕刷新
  11. Range("a:b").ClearContents
  12. Range("a1:b1") = Array("文件夹", "文件名")
  13. Call SearchFileToHyperlinks(strFldPath)
  14. '调取自定义函数SearchFileToHyperlinks
  15. Range("a:b").EntireColumn.AutoFit
  16. '自动列宽
  17. Application.ScreenUpdating = True
  18. '重开屏幕刷新
  19. End Sub
  20. Function SearchFileToHyperlinks(ByVal strFldPath As String) As String
  21. Dim objFld As Object
  22. Dim objFile As Object
  23. Dim objSubFld As Object
  24. Dim strFilePath As String
  25. Dim lngLastRow As Long
  26. Dim intNum As Integer
  27. Set objFld = CreateObject("Scripting.FileSystemObject").GetFolder(strFldPath)
  28. '创建FileSystemObject对象引用
  29. For Each objFile In objFld.Files
  30. '遍历文件夹内的文件
  31. lngLastRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
  32. strFilePath = objFile.Path
  33. intNum = InStrRev(strFilePath, "\")
  34. '使用instrrev函数获取最后文件夹名截至的位置
  35. Cells(lngLastRow, 1) = Left(strFilePath, intNum - 1)
  36. '文件夹地址
  37. Cells(lngLastRow, 2) = Mid(strFilePath, intNum + 1)
  38. '文件名
  39. ActiveSheet.Hyperlinks.Add Anchor:=Cells(lngLastRow, 2), _
  40. Address:=strFilePath, ScreenTip:=strFilePath
  41. '添加超链接
  42. Next objFile
  43. For Each objSubFld In objFld.SubFolders
  44. '遍历文件夹内的子文件夹
  45. Call SearchFileToHyperlinks(objSubFld.Path)
  46. Next objSubFld
  47. Set objFld = Nothing
  48. Set objFile = Nothing
  49. Set objSubFld = Nothing
  50. End Function

将Word表格批量写入Excel

  1. Sub GetWordTable()
  2. Dim WdApp As Object
  3. Dim objTable As Object
  4. Dim objDoc As Object
  5. Dim strPath As String
  6. Dim shtEach As Worksheet
  7. Dim shtSelect As Worksheet
  8. Dim i As Long
  9. Dim j As Long
  10. Dim x As Long
  11. Dim y As Long
  12. Dim k As Long
  13. Dim brr As Variant
  14. Set WdApp = CreateObject("Word.Application")
  15. With Application.FileDialog(msoFileDialogFilePicker)
  16. .Filters.Add "Word文件", "*.doc*", 1
  17. '只显示word文件
  18. .AllowMultiSelect = False
  19. '禁止多选文件
  20. If .Show Then strPath = .SelectedItems(1) Else Exit Sub
  21. End With
  22. Application.ScreenUpdating = False
  23. Application.DisplayAlerts = False
  24. Set shtSelect = ActiveSheet
  25. '当前表赋值变量shtSelect,方便代码运行完成后叶落归根回到开始的地方
  26. For Each shtEach In Worksheets
  27. '删除当前工作表以外的所有工作表
  28. If shtEach.Name <> shtSelect.Name Then shtEach.Delete
  29. Next
  30. shtSelect.Name = "孙兴华"
  31. '这句代码不是无聊,作用在于……你猜……
  32. '……其实是避免下面的程序工作表名称重复
  33. Set objDoc = WdApp.documents.Open(strPath)
  34. '后台打开用户选定的word文档
  35. For Each objTable In objDoc.tables
  36. '遍历文档中的每个表格
  37. k = k + 1
  38. Worksheets.Add after:=Worksheets(Worksheets.Count)
  39. '新建工作表
  40. ActiveSheet.Name = k & "表"
  41. x = objTable.Rows.Count
  42. 'table的行数
  43. y = objTable.Columns.Count
  44. 'table的列数
  45. ReDim brr(1 To x, 1 To y)
  46. '以下遍历行列,数据写入数组brr
  47. For i = 1 To x
  48. For j = 1 To y
  49. brr(i, j) = "'" & Application.Clean(objTable.cell(i, j).Range.Text)
  50. 'Clean函数清除制表符等
  51. '半角单引号将数据统一转换为文本格式,避免身份证等数值变形
  52. Next
  53. Next
  54. With [a1].Resize(x, y)
  55. .Value = brr
  56. '数据写入Excel工作表
  57. .Borders.LineStyle = 1
  58. '添加边框线
  59. End With
  60. Next
  61. shtSelect.Select
  62. objDoc.Close: WdApp.Quit
  63. Application.ScreenUpdating = True
  64. Application.DisplayAlerts = True
  65. Set objDoc = Nothing
  66. Set WdApp = Nothing
  67. MsgBox "共获取:" & k & "张表格的数据。"
  68. End Sub

结合工作表名在第一列自动生成序列号

  1. Sub shishi()
  2. For Each 工作表 In Worksheets
  3. 'Debug.Print Format(工作表.Name,"O0")
  4. i = 2
  5. Do While Sheets(工作表.Name).Range("B" & i) <> ""
  6. Sheets(工作表.Name).Range("A" & i) = "2021年" & Format(工作表.Name, "00") & Format(i - 1, "00") & "号"
  7. i = i + 1
  8. Loop
  9. Next
  10. End Sub

批量插入复选框

  1. Sub txt()
  2. '指定插入复选框的区域
  3. For Each RG In Range("B2:B15")
  4. '插入复选框CheckBoxes,它的左边距、顶点、宽度、高度都引用RG单元格的
  5. ActiveSheet.CheckBoxes.Add(RG.Left, RG.Top, RG.Width, RG.Height).Select
  6. '复选框的文本为“是”,值为空,链接的单元格是RG的位置
  7. With Selection
  8. .Characters.Text = ""
  9. .Value = xlOff
  10. .LinkedCell = RG.Address
  11. End With
  12. 'RG单元格的字体颜色变成白色,否则打勾会显示TrueFalse
  13. RG.Font.ThemeColor = xlThemeColorDark1
  14. Next RG
  15. End Sub

批量创建文件夹

  1. Sub 创建空文件夹提示成功()
  2. Dim shtActive As Worksheet
  3. Dim i As Long, strShtName As String
  4. Set shtActive = ActiveSheet
  5. For i = 1 To shtActive.Cells(Rows.Count, 1).End(xlUp).Row
  6. '单元格A1是标题,跳过,从第2行开始遍历工作表名称
  7. strShtName = shtActive.Cells(i, 1).Value
  8. '工作表名强制转换为字符串类型
  9. Dim filename As String
  10. filename = strShtName
  11. If filename = "False" Or filename = "" Then Exit Sub
  12. If Len(Dir(filename, vbDirectory)) > 0 Then
  13. MsgBox "空文件夹" & filename & "已存在!"
  14. Else
  15. MkDir "F:\ " & filename '指定路径才好保存
  16. MsgBox "空文件夹" & filename & "创建成功!"
  17. End If
  18. Next
  19. End Sub
  20. Sub 创建空文件夹提示数量()
  21. Dim shtActive As Worksheet
  22. Dim i As Long, strShtName As String
  23. Set shtActive = ActiveSheet
  24. For i = 1 To shtActive.Cells(Rows.Count, 1).End(xlUp).Row
  25. '单元格A1是标题,跳过,从第2行开始遍历工作表名称
  26. strShtName = shtActive.Cells(i, 1).Value
  27. '工作表名强制转换为字符串类型
  28. On Error GoTo 失败
  29. Dim filename As String
  30. filename = strShtName
  31. If filename = "" Then
  32. MsgBox "创建失败,字段为空"
  33. Exit Sub
  34. Else
  35. MkDir "C:\Users\hp\Desktop\" & filename
  36. '删除空文件夹【rm
  37. '创建空文件夹【mk】
  38. k = k + 1
  39. End If
  40. Next
  41. MsgBox "您已经创建了" & k & "个空文件夹"
  42. Exit Sub
  43. 失败: MsgBox "文件夹已存在!请检查!"
  44. End Sub

批量对齐图片

Sub 批量对齐图片()
    Dim sh As Shape
    For Each sh In ActiveSheet.Shapes
        sh.Left = sh.TopLeftCell.Left
    Next
End Sub

批量给所有工作表的表格【加内外边框】

Sub a()
    Dim r1 As Range
       For i = 1 To Sheets.Count
        Set r1 = Sheets(i).Range("A1").CurrentRegion
    With r1.Borders(xlInsideHorizontal) '内部水平
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = 1
    End With
    With r1.Borders(xlInsideVertical) '内部垂直
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = 1
    End With
    r1.BorderAround xlContinuous, xlThin, 1
    Set r1 = Nothing
    Next
End Sub

批量获取指定文件夹下文件名并新建超链接

Sub GetFiles()
    Dim strPath As String, strFileName As String, k As Long
    With Application.FileDialog(msoFileDialogFolderPicker)
        '用户选择文件夹路径
        If .Show Then strPath = .SelectedItems(1) Else Exit Sub
        '如果用户为选择文件夹则退出程序
    End With
    If Right(strPath, 1) <> "\" Then strPath = strPath & "\"
    Application.ScreenUpdating = False '取消屏幕刷新
    strFileName = Dir(strPath & "*.*")
    'dir+通配符获取首个文件名
    '如果一个文件也无,则返回空
    Columns(1).Clear: Cells(1, 1) = "目录": k = 1 '清除当前工作表A列数据
    Do While strFileName <> ""
        k = k + 1 '累加文件个数
        ActiveSheet.Hyperlinks.Add Cells(k, 1), strPath & strFileName
        '创建超链接
        strFileName = Dir
        '第2次调用Dir函数,未使用任何参数,则同目录下的下一个文件名
    Loop
    Application.ScreenUpdating = True
    MsgBox "一共读取了:" & k-1 & "个文件名。"
End Sub

批量将图片插入到表格中

Sub InsertPic()
    Dim arr, i&, k&, n&, b As Boolean
    Dim strPicName$, strPicPath$, strFdPath$, shp As Shape
    Dim rngData As Range, rngEach As Range, rngWhere As Range, strWhere As String
    'On Error Resume Next
    '用户选择图片所在的文件夹
    With Application.FileDialog(msoFileDialogFolderPicker)
       If .Show Then strFdPath = .SelectedItems(1) Else: Exit Sub
    End With
    If Right(strFdPath, 1) <> "\" Then strFdPath = strFdPath & "\"
    Set rngData = Application.InputBox("请选择图片名称所在的单元格区域", Type:=8)
    '用户选择需要插入图片的名称所在单元格范围
    Set rngData = Intersect(rngData.Parent.UsedRange, rngData)
    'intersect语句避免用户选择整列单元格,造成无谓运算的情况
    If rngData Is Nothing Then MsgBox "选择的单元格范围不存在数据!": Exit Sub
    strWhere = InputBox("请输入图片偏移的位置,例如上1、下1、左1、右1", , "右1")
    '用户输入图片相对单元格的偏移位置。
    If Len(strWhere) = 0 Then Exit Sub
    x = Left(strWhere, 1)
    '偏移的方向
    If InStr("上下左右", x) = 0 Then MsgBox "你未输入偏移方位。": Exit Sub
    y = Val(Mid(strWhere, 2))
    '偏移的值
    Select Case x
        Case "上"
        Set rngWhere = rngData.Offset(-y, 0)
        Case "下"
        Set rngWhere = rngData.Offset(y, 0)
        Case "左"
        Set rngWhere = rngData.Offset(0, -y)
        Case "右"
        Set rngWhere = rngData.Offset(0, y)
    End Select
    Application.ScreenUpdating = False
    rngData.Parent.Parent.Activate '用户选定的激活工作簿
    rngData.Parent.Select
    For Each shp In ActiveSheet.Shapes
    '如果旧图片存放在目标图片存放范围则删除
        If Not Intersect(rngWhere, shp.TopLeftCell) Is Nothing Then shp.Delete
    Next
    x = rngWhere.Row - rngData.Row
    y = rngWhere.Column - rngData.Column
    '偏移的坐标
    arr = Array(".jpg", ".jpeg", ".bmp", ".png", ".gif")
    '用数组变量记录五种文件格式
    For Each rngEach In rngData
    '遍历选择区域的每一个单元格
        strPicName = rngEach.Text
        '图片名称
        If Len(strPicName) Then
        '如果单元格存在值
            strPicPath = strFdPath & strPicName
            '图片路径
            b = False
            '变量标记是否找到相关图片
            For i = 0 To UBound(arr)
            '由于不确定用户的图片格式,因此遍历图片格式
                If Len(Dir(strPicPath & arr(i))) Then
                '如果存在相关文件
                    Set shp = ActiveSheet.Shapes.AddPicture( _
                        strPicPath & arr(i), False, True, _
                        rngEach.Offset(x, y).Left + 5, _
                        rngEach.Offset(x, y).Top + 5, _
                        20, 20)
                    shp.Select
                    With Selection
                        .ShapeRange.LockAspectRatio = msoFalse
                        '撤销锁定图片纵横比
                        .Height = rngEach.Offset(x, y).Height - 10 '图片高度
                        .Width = rngEach.Offset(x, y).Width - 10 '图片宽度
                    End With
                    b = True '标记找到结果
                    n = n + 1 '累加找到结果的个数
                    Range("a1").Select: Exit For '找到结果后就可以退出文件格式循环
                End If
            Next
            If b = False Then k = k + 1 '如果没找到图片累加个数
        End If
    Next
    Application.ScreenUpdating = True
    MsgBox "共处理成功" & n & "个图片,另有" & k & "个非空单元格未找到对应的图片。"
End Sub

批量将图片插入到单元格批注中

Sub AddCommentPic()
    Dim arr, i&, k&, n&, b As Boolean
    Dim strPicName$, strPicPath$, strFdPath$
    Dim rngData As Range, rngEach As Range
    'On Error Resume Next
    '用户选择图片所在的文件夹
    With Application.FileDialog(msoFileDialogFolderPicker)
       If .Show Then strFdPath = .SelectedItems(1) Else: Exit Sub
    End With
    If Right(strFdPath, 1) <> "\" Then strFdPath = strFdPath & "\"
    Set rngData = Application.InputBox("请选择需要插入图片到批注中的单元格区域", Type:=8)
    '用户选择需要插入图片到批注中的单元格或区域
    If rngData.Count = 0 Then Exit Sub
    Set rngData = Intersect(rngData.Parent.UsedRange, rngData)
    'intersect语句避免用户选择整列单元格,造成无谓运算的情况
    If rngData Is Nothing Then MsgBox "选择单元格不能全为空。": Exit Sub
    arr = Array(".jpg", ".jpeg", ".bmp", ".png", ".gif")
    '用数组变量记录五种文件格式
    Application.ScreenUpdating = False
    For Each rngEach In rngData
    '遍历选择区域的每一个单元格
        If Not rngEach.Comment Is Nothing Then rngEach.Comment.Delete  '删除旧的批注
        strPicName = rngEach.Text '图片名称
        If Len(strPicName) Then '如果单元格存在值
            strPicPath = strFdPath & strPicName '图片路径
            b = False 'pd变量标记是否找到相关图片
            For i = 0 To UBound(arr)
            '由于不确定用户的图片格式,因此遍历图片格式
                If Len(Dir(strPicPath & arr(i))) Then
                '如果存在相关文件
                    rngEach.AddComment '增加批注
                    With rngEach.Comment
                        .Visible = True '批注可见
                        .Text Text:=""
                        .Shape.Select True '选中批注图形
                        Selection.ShapeRange.Fill.UserPicture strPicPath & arr(i)
                        '插入图片到批注中
                        .Shape.Height = 150 '图形的高度,可以根据需要自己调整
                        .Shape.Width = 150 '图形的宽度,可以根据需要自己调整
                        .Visible = False '取消显示
                    End With
                    b = True '标记找到结果
                    n = n + 1 '累加找到结果的个数
                    Exit For '找到结果后就可以退出文件格式循环
                End If
            Next
            If b = False Then k = k + 1  '如果没找到图片累加个数
        End If
    Next
    MsgBox "共处理成功" & n & "个图片,另有" & k & "个非空单元格未找到对应的图片。"
    Application.ScreenUpdating = True
End Sub

批量取消工作表的隐藏

Sub unShtVisible()
    Dim sht As Worksheet
    For Each sht In Worksheets '遍历工作表,设置可见
        sht.Visible = xlSheetVisible
    Next
End Sub

批量删除宏代码

  Sub DelMacro()
      Dim Wb As Workbook
      Dim FileName As String
      Dim Vbc As VBComponent
      FileName = ThisWorkbook.Path & "\DelMacro.xls"
      Application.EnableEvents = False
      Set Wb = Workbooks.Open(FileName)
      For Each Vbc In Wb.VBProject.VBComponents
          If Vbc.Type <> vbext_ct_Document Then
              If Vbc.Name = "NowModule" Then
                  Vbc.CodeModule.DeleteLines 3, Vbc.CodeModule.CountOfLines - 4
              Else
                  Wb.VBProject.VBComponents.Remove Vbc
              End If
          End If
      Next
      'Wb.Close True
      Application.EnableEvents = True
  End Sub

批量删除所有表格的文字和格式,只留空表

Sub 宏1()
    '删除所有表格的文字和格式,只留空表
Dim WS As Worksheet

    For Each WS In Worksheets
      WS.UsedRange.Clear
    Next
End Sub

批量提取表名

Sub 提取表名()
 Dim i, j
 i = 2
 For Each j In Worksheets
 Range("A" & i) = j.Name
 i = i + 1
 Next
End Sub

批量提取照片属性


Sub 提取照片属性()
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)
    If fd.Show = -1 Then GetDirectory = fd.SelectedItems(1)
    Dim Item As Long, RowCount As Long, i As Long
    Dim FileName As Object, ObjShell As Object, ObiFolder As Object
    Set ObjShell = CreateObject("shell.Application")
    Set ObiFolder = ObjShell.Namespace(GetDirectory)
    On Error Resume Next
    Application.ScreenUpdating = False
        RowCount = 1
       For Each FileName In ObiFolder.Items
        Item = 0
        RowCount = RowCount + 1
        For i = 0 To 33
            If i < 6 Or i = 12 Or (i > 29 And i < 33) Then
                Item = Item + 1
                Cells(RowCount, Item) = ObiFolder.getdetailsof(FileName, i)
                If RowCount = 2 Then Cells(1, Item) = ObiFolder.getdetailsof(ObiFolder.Items, i)
            End If
        Next i
    Next FileName
    Set fd = Nothing
    Application.ScreenUpdating = True
End Sub

批量提取指定路径下带【任意扩展名】的文件名

Sub FileDir()
    Dim p$, f$, k&
    '获取用户选择文件夹的路径
    With Application.FileDialog(msoFileDialogFolderPicker)
   '选择文件夹
        If .Show Then
            p = .SelectedItems(1)
            '选择的文件路径赋值变量P
        Else
            Exit Sub
            '如果没有选择保存路径,则退出程序
        End If
    End With
    If Right(p, 1) <> "\" Then p = p & "\"
    f = Dir(p & "*.*")
    '返回变量P指定路径下带任意扩展名的文件名
    '如果有超过一个文件存在,将返回第一个找到的文件名
    '如果一个文件都没有,则返回空
    [a:a].ClearContents '清空A列数据
    [a1] = "目录"
    k = 1
    Do While f <> ""
    '如果文件名不为空,则……
        k = k + 1
        '累加文件个数
        Cells(k, 1) = f
        f = Dir
        '第二次调用Dir函数,但不带任何参数,则将返回同一目录下的下一个文件。
    Loop
    MsgBox "OK"
End Sub

批量图片自适应

Sub 图片自动适应单元格()
Dim 图片  As Shape
For Each 图片 In ActiveSheet.Shapes
    With 图片
        .LockAspectRatio = True 'LockAspectRatio = False 撑满单元格,会变形,'True '适应单元格大小
        .Left = .TopLeftCell.Left
        .Top = .TopLeftCell.Top
        .Width = .TopLeftCell.Width
        .Height = .TopLeftCell.Height
    End With
Next
End Sub

批量新建工作表

Sub 新建5张工作表()
    Dim i As Byte
    For i = 1 To 5 Step 1 
        Worksheets.Add
    Next
End Sub

取消复杂的合并单元格

Sub UnMergeRange2() '取消合并单元格
Dim MaxRow As Integer '
Dim Rng As Range
Dim x%, y%, m%, n%, i%
Dim Rng2 As Range
    On Error Resume Next
    Set Rng = Application.InputBox("请选择需要取消合并单元格的区域:", _
                "区域选择", , , , , , 8)

    For x = 1 To Rng.Rows.Count
        For y = 1 To Rng.Columns.Count
            Set Rng2 = Rng.Cells(x, y)
            i = Rng2.MergeArea.Count
            If i > 1 Then
                m = Rng2.MergeArea.Rows.Count
                n = Rng2.MergeArea.Columns.Count
                Rng2.UnMerge '取消合并单元格
                Rng2.Resize(m, n).Value = Rng2.Value
            End If
        Next
    Next

End Sub

显示动态当前时间

Sub 动态时间()
ActiveSheet.Range("A1").Value = Format(Now, "hh:mm:ss")
Application.OnTime Now + TimeValue("00:00:01"), "动态时间"
End Sub

新建工作簿命名到桌面

Sub a()
Excel.Application.DisplayAlerts = False
Workbooks.Add
i = InputBox("输入名称")
ActiveWorkbook.SaveAs Filename:="C:\Users\hp\Desktop\ " & i & ".xlsx"
ActiveWorkbook.Close
Excel.Application.DisplayAlerts = True
End Sub

新建一个文件夹


Sub 新建文件夹_()
Dim sfolder  As String
sfolder = Application.InputBox(prompt:="请输入新建文件夹的名称:", _
Title:="输入文件夹名称", Type:=2)
If sfolder = "False" Or sfolder = "" Then Exit Sub
If Len(Dir(sfolder, vbDirectory)) > 0 Then
    MsgBox "文件夹" & sfolder & "已存在!"
Else
    MkDir sfolder
    MsgBox "文件夹" & sfolder & "创建成功!"
End If
End Sub

修改单元格内容会被记录到批注

'在所有过程之前用Dim语句定义的变量r1是模块级变量,应模块中所有的过程都可以使用它
Dim r1 '定义一个模块给变量,用户保存单元格的数据
'第一个事件过程,用于记录被更改前单元格中保存的数据
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count <> 1 Then Exit Sub '选中多个单元格时退出程序
If Target.Formula = "" Then '根据选中单元格中保存的数据,确定给变量r1赋什么值
    r1 = "空"
Else
    r1 = Target.Text
End If
End Sub
'第二个事件过程,用于批注记录单元格修改前后的信息
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count <> 1 Then Exit Sub
'定义变量保存单元格修改后的内容
Dim r2
'判断单元格是否被修改为空单元格
If Target.Formula = "" Then
    r2 = "空"
Else
    r2 = Target.Formula
End If
'如果单元格修改前后的内容一样则退出程序
If r1 = r2 Then Exit Sub
'定义一个批注变量
Dim r3
'定义一个变量保存批注内容
Dim r4
'将被修改单元格的批注赋给变量r3
Set r3 = Target.Comment
'如果单元格中没有批注则新建批注
If r3 Is Nothing Then Target.AddComment
'将批注的内容保存到变量r4中
r4 = Target.Comment.Text
'重新修改批注的内容=原批注内容+当前日期和时间+原内容+修改后的新内容
Target.Comment.Text Text:=r4 & Chr(10) & Format(Now(), "yyyy-mm-dd hh:mm") & "原内容:" & r1 & "修改为:" & r2
'根据批注内容自动调整批注大小
Target.Comment.Shape.TextFrame.AutoSize = True
End Sub

选中行或列会填充颜色

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Application.ScreenUpdating = False
    Cells.Interior.ColorIndex = -4142 '取消单元格原有填充色,但不包含条件格式产生的颜色。
    Rows(Target.Row).Interior.ColorIndex = 33 '活动单元格整行填充颜色
    Columns(Target.Column).Interior.ColorIndex = 33 '活动单元格整列填充颜色
    Application.ScreenUpdating = True
End Sub

一次性按照字母表升序来对工作表进行排序

'述代码是按照字母表升序来对工作表进行排序的,如果要按降序排序,将代码中的小于号改为大于号即可。
Sub 字母升序()
    Excel.Application.ScreenUpdating = False
    Dim 工作表数量,i,j
      On Error Resume Next
    工作表数量 = Sheets.Count
    If 工作表数量 = 1 Then End
    For i = 1 To 工作表数量 - 1
        For j = i + 1 To 工作表数量
            '大小写转换,如果第2个表比第1个小,第2个表移动到第1个表前面
            If UCase(Sheets(j).Name) < UCase(Sheets(i).Name) Then
                Sheets(j).Move Before:=Sheets(i)
            End If
        Next
    Next
    Excel.Application.ScreenUpdating = True
End Sub

Sub SortSheetsTabName()
Application.ScreenUpdating = False
Dim ShCount As Integer, i As Integer, j As Integer
ShCount = Sheets.Count
 For i = 1 To ShCount - 1
 For j = i + 1 To ShCount
 If Sheets(j).Name < Sheets(i).Name Then
 Sheets(j).Move before:=Sheets(i)
 End If
 Next j
 Next i
Application.ScreenUpdating = True
End Sub

一次性保护所有的工作表

如果你保护了你所有的工作表,那么你只需要修改一下代码,就可以取消所有工作表的保护。

Sub ProtectAllSheets()
Dim ws As Worksheet
Dim password As String
'用你想要的密码替换Test123
password = "Test123"
 For Each ws In Worksheets
 ws.Protect password:=password
 Next ws
End Sub

Sub ProtectAllSheets()
 Dim ws As Worksheet
 For Each ws In Worksheets
 ws.Protect
 Next ws
End Sub

一次性电话号码添加分隔符

Sub 电话号码添加分隔符() 
    '用正则表达式替换更简单
arr = ActiveSheet.Range("a1").CurrentRegion
MsgBox "第一列第二行开始修改"
For x = 2 To UBound(arr)
    For y = 1 To UBound(arr, 2)
        If IsNumeric(arr(x, y)) Then
            s = arr(x, y)
            s1 = Mid(s, 1, 3)
            s2 = Mid(s, 4, 4)
            s3 = Mid(s, 8, 4)
            arr(x, y) = s1 & "-" & s2 & "-" & s3
        End If
    Next y
Next x
[a1].Resize(UBound(arr), UBound(arr, 2)) = arr
Cells.EntireColumn.AutoFit
End Sub

一次性高亮显示单元格区域(聚光灯)

突出显示活动单元格的行和列(1)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Cells.Interior.ColorIndex = xlNone
 If Target.Count > 1 Then Set Target = Target.Cells(1)
 Target.EntireColumn.Interior.ColorIndex = 37
 Target.EntireRow.Interior.ColorIndex = 37
End Sub

突出显示活动单元格的行和列(2)
 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim rng As Range
   Cells.Interior.ColorIndex = xlNone
      Set rng = Application.Union(Target.EntireColumn, Target.EntireRow)
     rng.Interior.ColorIndex = 24
 End Sub

一次性隔行插入空行

Sub 插入空行()
Dim i&, t
For i = Sheet1.[a1].End(xlDown).Row To 2 Step -1
Sheet1.Rows(i).Resize(1).Insert
'Resize(?)插入几行就输几个

Next
End Sub

一次性隔行填充颜色

Sub 填充偶数行()
Dim i
Cells.Interior.ColorIndex = xlNone '工作表去色
 For i = 1 To 19  '定义变量i表示总共有多少行要填充颜色

    If i Mod 2 = 0 Then   '只填充偶数行的颜色  mod取余数   'If i Mod 2 = 1 Then,只填充奇数行的颜色  mod取余数

        Range(Cells(i, 1), Cells(i, 3)).Interior.Color = RGB(255, 0, 0)   '从第一行开始隔行填充,颜色是红色
    End If
Next
End Sub



Sub 首行填充间隔几行()
Dim i, j
i = 1   '从第一行开始填充
    'i = 2  '从第2行开始,即不管首行
Cells.Interior.ColorIndex = xlNone '工作表去色
Do While Range("A" & i) <> ""
        Range(Cells(i, 1), Cells(i, 3)).Interior.Color = RGB(255, 0, 0)
        '从第1列到第3列,隔行填充,颜色是红色

    i = i + 2 ' 间隔1行
Loop
End Sub


'Excel隔行变色,快来看看吧。 选中所有单元格,选择“条件格式”中的“新建规则”,在弹出的对话框中选择“使用公式确定要设置格式的单元格”。
'输入公式“=MOD (ROW (),2)=0”,点击“格式”,在“图案”中选择相应的填充色,点击“确定”即可完成设置。

一次性给C列自动评价

Sub 评价()
    Dim i As Byte
    For i = 2 To 7
        If Range("B" & i) >= 90 Then
            Range("C" & i) = "优秀"
        ElseIf Range("B" & i) >= 80 Then
            Range("C" & i) = "良好"
        ElseIf Range("B" & i) >= 60 Then
            Range("C" & i) = "及格"
        Else
            Range("C" & i) = "不及格"
        End If
    Next
End Sub

一次性将工作表另存为一个PDF文件

Sub 宏()
将工作表另存为一个PDF文件
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        "C:\Users\hp\Desktop\工作簿2.pdf", Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
        False
End Sub


在上面的代码中,我指定了要保存pdf的文件夹位置的地址。

请注意,此代码仅适用于工作表。

一次性将所选单元格的字母大小写改为大写

19.将所选单元格的字母大小写改为大写

虽然Excel有更改文本字母大小写的公式,但它使您可以在另一组单元格中进行更改。

使用此代码可以立即更改所选文本中文本的字母大小写。

Sub 字母大小写改为大写()
Dim Rng As Range
For Each Rng In Selection.Cells
 If Rng.HasFormula = False Then
 Rng.Value = UCase(Rng.Value)
 End If
Next Rng
End Sub

Sub 字母大小写改为小写()
Dim Rng As Range
For Each Rng In Selection.Cells
 If Rng.HasFormula = False Then
 Rng.Value = LCase(Rng.Value)
 End If
Next Rng
End Sub

Sub 首字母大写()
Dim Rng As Range
For Each Rng In Selection.Cells
 If Rng.HasFormula = False Then
d = UCase(Left(Rng.Value, 1))
h = Mid(Rng, 2, Len(Rng.Value) - 1)
 Rng.Value = d & h

 End If
Next Rng
End Sub

一次性将所有的图表调整为同样大小

'将所有的图表调整为同样大小
Sub Resize_Charts()
Dim i As Integer
For i = 1 To ActiveSheet.ChartObjects.Count
With ActiveSheet.ChartObjects(i)
.Width = 300
.Height = 200
End With
Next i
End Sub

一次性将所有公式转换为值

11.将所有公式转换为值

如果工作表包含大量公式,并且要将这些公式转换为值,请使用此代码。

Sub ConvertToValues()
 With ActiveSheet.UsedRange
 .Value = .Value
 End With
End Sub

此代码可以自动将使用公式的值转换为值

一次性显示隐藏的工作表

如果你保护了你所有的工作表,那么你只需要修改一下代码,
就可以取消所有工作表的保护。

Sub UnhideAllWoksheets()
Dim ws As Worksheet
 For Each ws In ActiveWorkbook.Worksheets
 ws.Visible = xlSheetVisible
 Next ws
End Sub

Sub 取消隐藏()
For x = 1 To Sheets.Count
If Sheets(x).Name<>VBA与宏应用
Then SheetI(x).Visible= -1
End If
Next x
End Sub


Sub 隐藏()
For x = 1 To Sheets.Count
If Sheets(x).Name<>VBA与宏应用
Then
Sheet(x).Visible = 0
End If
Next x
End Sub

一次性向下填充

Sub 宏5()
    Range("A1:A145").Select
      Selection.SpecialCells(xlCellTypeBlanks).Select
     Application.CutCopyMode = False
    Selection.FormulaR1C1 = "=R[-1]C"
    Range("C7").Select
End Sub

一次性隐藏除了活动工作表外的所有工作表

Sub UnhideAllWoksheets()
Dim ws As Worksheet
 For Each ws In ActiveWorkbook.Worksheets
 ws.Visible = xlSheetVisible
 Next ws
End Sub

一次性有公式的单元格锁定

12.有公式的单元格锁定

当您有大量的计算并且不想意外的删除或更改时,您可能希望使用把有公式的单元格进行锁定。

下面是将锁定所有具有公式的单元格的代码,而所有其它单元格都未锁定。

Sub LockCellsWithFormulas()
 With ActiveSheet
 .Unprotect
 .Cells.Locked = False
 .Cells.SpecialCells(xlCellTypeFormulas).Locked = True
 .Protect AllowDeletingRows:=True
 End With
End Sub

一次性在VBA代码中删除工作簿中全部代码及类模块、窗体。

VBA过程代码201:在VBA代码中删除工作簿中全部代码及类模块、窗体。

Sub mynz ()

Dim Wb As Workbook

Dim FileName As String

Dim vbc As VBComponent, a As Shape, sh As Worksheet

FileName = ThisWorkbook.Path & "\Book25-1.xlsm"

Set Wb = Workbooks.Open(FileName)

Application.EnableEvents = False

For Each sh In Wb.Sheets

For Each a In sh.Shapes

a.Delete

Next

Next

一次性找出所有何文华并标上颜色

Sub a()
Dim 单元格, 第一个找到符合内容的地址
Set 单元格 = Cells.Find("何文华", lookat:=xlWhole, searchorder:=xlRows)
If Not 单元格 Is Nothing Then
    第一个找到符合内容的地址 = 单元格.Address
End If
Do While Not 单元格 Is Nothing
    单元格.Interior.Color = vbGreen
    Set 单元格 = Cells.Find("删除", after:=单元格)
    If 单元格.Address = 第一个找到符合内容的地址 Then Exit Do
Loop
End Sub

一次性自动调整行高与列宽

Sub 遍历所有工作表并自动调整行高与列宽 ()
    Dim r1 As Range
       For i = 1 To Sheets.Count
        Set r1 = Sheets(i).Range("A1").CurrentRegion
    With r1.Columns.AutoFit
    End With
    With r1.Rows.AutoFit
    End With
    Next
End Sub

'第一种应对的是数据表位于A1并且是连续的区域,为了避免出现问题
'第二种,直接对全表进行自动调整
Sub 宏1()
    Cells.Select
    Cells.EntireColumn.AutoFit
    Cells.EntireRow.AutoFit
End Sub

在工作表中上下翻页

  Sub 顺着翻页()
      Dim i As Integer
      i = Worksheets.Count
      If ActiveSheet.Index < i Then
          Worksheets(ActiveSheet.Index + 1).Activate
      Else
          Worksheets(1).Activate
      End If
  End Sub


  Sub 倒着翻页()
      Dim i As Integer
      i = Worksheets.Count
      If ActiveSheet.Index > 1 Then
          Worksheets(ActiveSheet.Index - 1).Activate
      Else
          Worksheets(i).Activate
      End If
  End Sub

在首列插入1-100

用For Each…Next语句编写一个程序,在A1:A100单元格区域中输入1到100的自然数

Sub 数字()
 Dim a As Range, i As Integer
 i = 1
 For Each a In Range("A1:A100")
 a = i
 i = i + 1
 Next
End Sub


Sub 数字()
Dim 开始时间
开始时间 = Time()
Dim i
 For i = 1 To 60000
 Range("a" & i) = 1
 Next
MsgBox "运行时间" & DateDiff("s", 开始时间, Time()) & "秒"

Sub 配合数组使用()
Dim arr(), i
arr = Range("A1:A1048576")
For i = 1 To 1048576
    arr(i, 1) = i
Next
Range("A1:A1048576") = arr
MsgBox "已经完成"
End Sub

在所选内容中每隔一行后插入一行

14.在所选内容中每隔一行后插入一行

如果要在选定区域中的每一行后插入空行,请使用此代码。

Sub InsertAlternateRows()
Dim rng As Range
Dim CountRow As Integer
Dim i As Integer
Set rng = Selection
CountRow = rng.EntireRow.Count
 For i = 1 To CountRow
 ActiveCell.EntireRow.Insert
 ActiveCell.Offset(2, 0).Select
 Next i
End Sub

自动在相邻单元格中插入日期和时间戳

15.自动在相邻单元格中插入日期和时间戳

当您想要跟踪活动时,可以使用时间戳。

使用此代码在创建条目或编辑现有内容时在相邻单元格中插入日期和时间戳。


Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Handler
 If Target.Column = 1 And Target.Value <> "" Then
 Application.EnableEvents = False
 Target.Offset(0, 1) = Format(Now(), "yyyy-dd-mm hh:mm:ss")
 Application.EnableEvents = True
 End If
Handler:
End Sub


请注意,您需要将此代码插入工作表代码窗口(而不是模块内代码窗口)。因为这是一个事件代码

Excel文件每10秒自动保存

Sub otime()
    '10秒后自动运行WbSave过程
    Application.OnTime Now() + TimeValue("00:00:10"), "WbSave"
End Sub

Sub WbSave()
    ThisWorkbook.Save '保存本工作簿
    Call otime  '再次运行otime过程
End Sub

Private Sub Workbook_Open()
Call otime
End Sub

制作工资条

image.png

1.使用快捷键Alt + F8,打开“宏”对话框,

2.选择要设置快捷键的宏名,点击“选项”,

3.在快捷键下面输入想要设置的快捷键

Sub 两步法工资条()
Dim 开始时间
开始时间 = Time()
[a1].Select
Dim i&, t
For i = Sheet1.[a1].End(xlDown).Row To 2 Step -1
Sheet1.Rows(i).Resize(2).Insert  ' 从最大行往第二行倒数 每一行 都 插入两行空行
'Resize(1)插入几行就输几个
Next

最后一行 = Sheets(1).UsedRange.Rows.Count - 1
For i = 3 To 最后一行 Step 3  '从第三行开始每隔三行都把第一行的内容复制并粘贴
Range("A1:G1").Copy Range("a" & i)
Next

[1:2].Delete                  ' 删除多余的两行
MsgBox "运行时间" & DateDiff("s", 开始时间, Time()) & "秒"
End Sub
Sub 循环法制作工资条()
Dim i
[a1].Select
Dim 开始时间
开始时间 = Time()

'MsgBox "点击确定制作工资条"
For i = 2 To Range("a1").CurrentRegion.Rows.Count - 1
    ActiveCell.Offset(2, 0).Rows("1:1").EntireRow.Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    ActiveCell.Offset(-2, 0).Range("A1:G1").Select
    Selection.Copy
    ActiveCell.Offset(3, 0).Range("A1").Select
    ActiveSheet.Paste
    ActiveCell.Select
        Next
    'MsgBox "制作完成了,请查收!"
ActiveSheet.Name = "工资条"
[a1].Select
MsgBox "运行时间" & DateDiff("s", 开始时间, Time()) & "秒"
End Sub

按指定条件批量删除工作簿

Sub GetFiles()
    Dim strPath As String, strFileName As String, k As Long
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show Then strPath = .SelectedItems(1) Else: Exit Sub
        '获取用户选择的文件夹的路径,如果未选取,则退出程序
    End With
    If Right(strPath, 1) <> "\" Then strPath = strPath & "\"
    Application.ScreenUpdating = False
    Range("a:b").Clear: k = 1
    '清除A:B列的所有
    Cells(1, 1) = "旧文件名": Cells(1, 2) = "是否删除"
    strFileName = Dir(strPath & "*.xls*")
    Do While strFileName <> ""
        k = k + 1
        Cells(k, 1) = strPath & strFileName
        strFileName = Dir
    Loop
    Application.DisplayAlerts = True
End Sub


Sub DeleteFile()
    Dim r, i As Long
    r = Range("a1").CurrentRegion '数据装入数组
    For i = 2 To UBound(r)
    '标题行不要,从数组第二行开始遍历
        If r(i, 2) = "删除" Then Kill r(i, 1) 'Kill语句删除指定文件
    Next
    MsgBox "完成。"
End Sub

工作表排序

Sub 遍历工作表名提取目录()
    Dim k As Long, sht As Worksheet
    Application.ScreenUpdating = False
    With Columns(1)
        .ClearContents '清空A列原有数据
        .NumberFormat = "@" '设置单元格格式为文本
    End With
    Cells(1, 1) = "目录"
    k = 1
    For Each sht In ThisWorkbook.Worksheets '遍历工作表
        If sht.Name <> ActiveSheet.Name Then '如果sht不等于当前工作表名称
            k = k + 1 '累加工作表个数
            Cells(k, 1) = sht.Name '工作表名称写入A列
        End If
    Next
    Application.ScreenUpdating = True
End Sub

Sub 指定工作表按顺序排放()
    Dim shtActive As Worksheet, i As Long
    Dim arr, strShtName As String
    On Error Resume Next
    Application.ScreenUpdating = False
    Set shtActive = ActiveSheet '当前表赋值变量shtactive
    arr = Range("a1:a" & Cells(Rows.Count, 1).End(xlUp).Row)
    'A列数据装入数组arr
    For i = 2 To UBound(arr) '遍历数组arr
        strShtName = arr(i, 1)
        Worksheets(strShtName).Move after:=Worksheets(i - 1)
        '指定工作表按顺序排放
    Next
    shtActive.Select '回到操作表
    Application.ScreenUpdating = True
End Sub

合并单元格

'通过设置一个按钮,手工选区域后进行合并
Sub 合并单元格保留内容()
    Dim 单元格, 存放字符的变量
    If TypeName(Selection) = "Range" Then
        For Each 单元格 In Selection
            存放字符的变量 = 存放字符的变量 & 单元格.Value '要想内容分开加上分隔符号 & ","
        Next
        '合并时不显示仅保留左上角值的信息
        Application.DisplayAlerts = False
        Selection.Merge
        Selection.Value = 存放字符的变量
        Application.DisplayAlerts = True
    End If
End Sub


Sub 合并内容相同的连续单元格()
    Dim i, 最大使用行数
     '合并时不显示仅保留左上角值的信息
    Excel.Application.DisplayAlerts = False
    最大使用行数 = Range("A1").End(xlDown).Row
    For i = 最大使用行数 To 2 Step -1
        If Range("A" & i).Value = Range("A" & i - 1).Value Then
            Range(Cells(i - 1, 1), Cells(i, 1)).Merge
        End If
    Next
    Excel.Application.DisplayAlerts = True
End Sub


Sub 取消合并单元格保留内容()
    Dim i, 单元格的值, 合并单元格的数量
    For i = 2 To Range("B1").End(xlDown).Row
        单元格的值 = Range("A" & i).Value
        合并单元格的数量 = Range("A" & i).MergeArea.Count
        Range("A" & i).UnMerge '取消合并
        Range("A" & i).Resize(合并单元格的数量, 1).Value = 单元格的值
        '以本题为例,第1次是第2行,第2次是第5行,第3次是第7行
        i = i + 合并单元格的数量 - 1
    Next
End Sub

批量给工作簿重命名(可以转换后缀名)

.txt,jpg,png,.xlsx,docx,.pptx,.psd,.rar

Sub GetFiles()
    Dim strPath As String, strFileName As String, k As Long
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show Then strPath = .SelectedItems(1) Else: Exit Sub
        '获取用户选择的文件夹的路径,如果未选取,则退出程序
    End With
    If Right(strPath, 1) <> "\" Then strPath = strPath & "\"
    Application.ScreenUpdating = False
    Range("a:b").Clear: k = 1
    '清除A:B列的所有
    Cells(1, 1) = "旧文件名": Cells(1, 2) = "新文件名"
    strFileName = Dir(strPath & "*.xls*")
    Do While strFileName <> ""
        k = k + 1
        Cells(k, 1) = strPath & strFileName
        strFileName = Dir
    Loop
    Application.DisplayAlerts = True
End Sub

Sub ChangeFileName()
    Dim r, i As Long
    r = Range("a1").CurrentRegion '数据装入数组
    For i = 2 To UBound(r)
    '标题行不要,从数组第二行开始遍历
        Name r(i, 1) As r(i, 2) 'Name语句重命名
    Next
    MsgBox "更名完成。"
End Sub

批量工作表加密解密

Sub ProtectSht()
    Dim strAds As String, sht As Worksheet
    Dim strKey As String, strTemp As String
    Dim rng As Range, strMsg As String
    Dim strNoShtName As String, strYesShtName As String
    On Error Resume Next
    strAds = InputBox("请输入单元格保存范围,例如A1:B10." & vbCr _
                                & "可以设置不连续单元格,中间请以逗号分隔。比如A1:B10,D2:D8" & vbCr _
                                & "如果需要全表保护,可以直接确定。", Default:="全表保护")
    If StrPtr(strAds) = False Then Exit Sub
    If strAds = "全表保护" Then strAds = Cells.Address
    Set rng = Range(strAds) '测试输入的单元格区域是否有效
    If Err Then MsgBox "你输入的单元格区域地址不是正确的格式,请重新操作。": Exit Sub
    strKey = InputBox("请输入保护密码。") '第一次输入密码
    If StrPtr(strKey) = False Then Exit Sub
    strTemp = InputBox("请再次输入保护密码。") '第二次输入密码
    If StrPtr(strKey) = False Then Exit Sub
    If strKey <> strTemp Then MsgBox "你两次输入的密码不一致,系统退出,请重新操作。": Exit Sub
    For Each sht In Worksheets '遍历工作表加密保护
        With sht
            If .ProtectContents = False Then '如果工作表未保护
                .Cells.Locked = False '全部单元格区域取消锁定
                .Range(strAds).Locked = True '需要保护的区域锁定
                .Protect strKey, True, True, True '保护工作表,只允许编辑非锁定区域
                strYesShtName = strYesShtName & "," & .Name '保护成功的工作表名称
            Else
                strNoShtName = strNoShtName & "," & .Name '自身已有保护功能的工作表
            End If
        End With
    Next
    If strYesShtName <> "" Then strMsg = "工作表:" & Mid(strYesShtName, 2) & "的" & strAds & "区域保护完成"
    If strNoShtName <> "" Then strMsg = strMsg & vbCrLf & "以下工作表自身已有保护,无法再次保护:" & Mid(strNoShtName, 2)
    MsgBox (strMsg)
End Sub


Sub UnProtct()
    MsgBox "破解提示:当要求输入密码时请点击取消!”"
    Application.DisplayAlerts = False
    On Error Resume Next
    Dim sht As Worksheet
    For Each sht In Worksheets
        With sht
            .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
            .Protect DrawingObjects:=False, Contents:=True, Scenarios:=False, AllowFiltering:=True, AllowUsingPivotTables:=True
            .Protect DrawingObjects:=True, Contents:=True, Scenarios:=False, AllowFiltering:=True, AllowUsingPivotTables:=True
            .Protect DrawingObjects:=False, Contents:=True, Scenarios:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
            .Unprotect
        End With
    Next
    MsgBox "ok"
End Sub

批量修改工作表的名字

Sub GetShtName()
    Dim sht As Worksheet, i As Long
    i = 1 'i初始值为1
    With Columns(1)
        .ClearContents '清除A列内容
        .NumberFormat = "@" '设置单元格格式为文本
    End With
    Cells(1, 1) = "工作表名称目录"
    For Each sht In Worksheets '遍历工作表
        i = i + 1
        Cells(i, 1) = sht.Name '在A列记录工作表名称
    Next
End Sub

Sub ReNameSht()
    Dim strShtName$, sht As Worksheet, i&
    On Error Resume Next '当程序运行中出现错误时,继续运行
    For i = 2 To Cells(Rows.Count, 1).End(xlup).Row '遍历当前表格A列的数据
        strShtName = Cells(i, 1).Value '将表格A列的值,赋予变量strShtName
        Worksheets(strShtName).Name = Cells(i, 2).Value '工作表重命名
    Next
End Sub

批量修改文件名(不包括文件夹)

Sub shishi()
Set FSO对象 = CreateObject("Scripting.FileSystemObject")
Set 文件夹 = FSO对象.GetFolder("C:\Users\hp\Pictures")
Range("A1").CurrentRegion.Clear
Range("A1") = "原文件名 """
Range("B1") = "新文件名 """
j = 2
For Each i In 文件夹.Files
Range("A" & j) = "'" & FSO对象.GetBaseName(i)
j = j + 1
Next
End Sub

Sub 修改文件名()
Set 字典 = CreateObject("Scripting.Dictionary")
arr = Range("A1").CurrentRegion
For i = 1 To UBound(arr, 1)
字典(arr(i, 1)) = arr(i, 2)
Next
Set FSO对象 = CreateObject("Scripting.FileSystemObject")
Set 文件夹 = FSO对象.GetFolder("C:\Users\hp\Pictures")
For Each i In 文件夹.Files
文件名 = FSO对象.GetBaseName(i)
后缀名 = FSO对象.GetExtensionName(i)
i.Name = 字典(文件名) & "." & 后缀名
Next
End Sub

1.生成带超链接的工作表目录

Sub ml()
    Dim sht As Worksheet, i&, strShtName$
    Columns(1).ClearContents '清空A列数据
    Cells(1, 1) = "目录" '第一个单元格写入标题"目录"
    i = 1  '将i的初值设置为1.
    For Each sht In Worksheets  '循环当前工作簿的每个工作表
        strShtName = sht.Name
        If strShtName <> ActiveSheet.Name Then
       '如果sht的名称不是当前工作表的名称则开始在当前工作表建立超链接
            i = i + 1 '累加工作表数量
           ActiveSheet.Hyperlinks.Add anchor:=Cells(i, 1), Address:="", _
            SubAddress:="'" & strShtName & "'!a1", TextToDisplay:=strShtName
           '建超链接
        End If
    Next
End Sub

2.在各个分表新建【返回总表】的命令按钮

Dim strShtName As String
Sub Mybutton()
    Dim sht As Worksheet, btn As Button
    On Error Resume Next
    For Each sht In Worksheets
        With sht
            If .Name <> strShtName Then
                .Shapes(strShtName).Delete
                '删除原有的名称为shtn的按钮,避免重复创建
                Set btn = .Buttons.Add(0, 0, 60, 30)'使用add方法在工作表中添加一个按钮控件,add方法语法如下:表达式.Add(left,right,width,height)
                '新建按钮,释义见小贴士
                With btn
                    .Name = strShtName
                    '命令按钮命名
                    .Characters.Text = "返回总表"
                    '按钮的文本内容
                    .OnAction = "LinkTable"
                    '指定按钮控件所执行的宏命令
                End With
            End If
        End With
    Next
    Set btn = Nothing
End Sub

Sub LinkTable()
    strShtName = "总表"'指定了返回总表的名字,可以根据实际需要修改为目标表的名称,比如“目录”。
    '设置变量strShtName为总表的名称,可以根据实际总表的名称做修改
    Worksheets(strShtName).Activate
    [a1].Select
End Sub

1.删除指定工作表

Sub 遍历工作表取表名()
    Dim sht As Worksheet, k As Long
    Application.ScreenUpdating = False
    k = 1
    Range("a:b").Clear '清空数据
    Range("a:a").NumberFormat = "@" '设置文本格式
    For Each sht In Worksheets '遍历工作表取表名
        k = k + 1
        Cells(k, 1) = sht.Name
    Next
    Range("a1:b1") = Array("工作表名", "是否删除")
    Application.ScreenUpdating = True
End Sub

Sub 遍历并删除工作表()
    Dim sht As Worksheet, i As Long, r
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    On Error Resume Next
    r = Range("a1").CurrentRegion '数据装入数组r
    For i = 2 To UBound(r) '遍历并删除工作表
        If r(i, 2) = "删除" Then Worksheets(CStr(r(i, 1))).Delete
    Next
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

2.删除所有工作表

Sub DelShet() '删除所有工作表
    Dim sht As Worksheet
    Application.ScreenUpdating = False '关屏幕刷新
    Application.DisplayAlerts = False '关警告信息
    On Error Resume Next
    For Each sht In Worksheets
        sht.Delete '遍历工作表删除
    Next
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

3.保留指定工作表,其它删除

Sub 删除工作表()

    Dim j as integer
    Excel.Application.DisplayAlerts = False

    For Each j In Worksheets
        If j.Name <> "汇总" Then
            j.Delete
        End If
    Next
    Excel.Application.DisplayAlerts = True
End Sub

一次性替换标点符号

可以自行选择一次性查找替换的内容,
Sub ReplaceEngChn()
    Selection.Replace What:=" ", Replacement:=""     '去除空格
    Selection.Replace What:=" )", Replacement:=")"  '英文括号替换成中文空号
    Selection.Replace What:="(", Replacement:="("
    Selection.Replace What:=":", Replacement:=":"
    Selection.Replace What:=";", Replacement:=";"
    Selection.Replace What:="[", Replacement:="【"
    Selection.Replace What:="]", Replacement:="】"    
End Sub