分享

OFFICE Excel表格中常用的vba代码集锦

 拾叁亿人 2023-03-29 发布于云南

1.用于批量删除图片的VBA代码

  1. sub del_pic()
  2. For Each a In ActiveSheet.Shapes
  3. If a.Type <> 8 Then
  4. a.Delete
  5. End If
  6. Next a
  7. end sub()

2.批量插入图片的VBA代码

假设要插入的列为B列,A列是对应的图片名称,图片路径和工作表路径需要一致,插入的图片从B2开始

无边距:

  1. '无边距
  2. Sub aaimg()
  3. Dim a As Shape
  4. Dim rg As Range
  5. r_num = [a65536].End(xlUp).Row
  6. '先删除已经存在的
  7. For Each a In ActiveSheet.Shapes
  8. If a.Type <> 8 Then
  9. a.Delete
  10. End If
  11. Next a
  12. '宽度
  13. Columns('B:B').ColumnWidth = 11
  14. '高度
  15. Rows('2:' & r_num).RowHeight = 92
  16. '设置范围
  17. For Each rg In Range('b2:b' & r_num)
  18. ActiveSheet.Shapes.AddShape(msoShapeRectangle, rg.Left, rg.Top, rg.Width, rg.Height).Select
  19. '报错就继续
  20. On Error Resume Next
  21. '无边框
  22. Selection.ShapeRange.Line.Visible = msoFalse
  23. Rem 设置偏移
  24. Selection.ShapeRange.Fill.UserPicture ThisWorkbook.Path & '\' & rg.Offset(0, -1) & '.png'
  25. Next rg
  26. End Sub

有边距:

  1. '有边距
  2. Sub aaimg()
  3. Dim a As Shape
  4. Dim rg As Range
  5. r_num = [a65536].End(xlUp).Row
  6. '先删除已经存在的
  7. For Each a In ActiveSheet.Shapes
  8. If a.Type <> 8 Then
  9. a.Delete
  10. End If
  11. Next a
  12. '宽度
  13. Columns('B:B').ColumnWidth = 11
  14. '高度
  15. Rows('2:' & r_num).RowHeight = 92
  16. '设置范围
  17. For Each rg In Range('b2:b' & r_num)
  18. ActiveSheet.Shapes.AddShape(msoShapeRectangle, rg.Left + 4, rg.Top + 4, rg.Width - 8, rg.Height - 8).Select
  19. '报错就继续
  20. On Error Resume Next
  21. '无边框
  22. Selection.ShapeRange.Line.Visible = msoFalse
  23. Rem 设置偏移
  24. Selection.ShapeRange.Fill.UserPicture ThisWorkbook.Path & '\' & rg.Offset(0, -1) & '.png'
  25. Next rg
  26. End Sub

3.批量下载文件或图片的VBA代码

假设下载文件的url在A列,文件名称在B列,要保存的文件类型在C列

  1. Sub downloadimg()
  2. '给定网址下载图片或视频
  3. Dim H, S, f_type, name, filename
  4. 'f_type 文件类型 name 文件名称 filename 路径名称
  5. r_num = [a65536].End(xlUp).Row
  6. filename = ThisWorkbook.Path & '\' & 'img'
  7. If Dir(filename, vbDirectory) = '' Then '如果文件不存在
  8. MkDir filename
  9. GoTo main
  10. End If
  11. main:
  12. Set H = CreateObject('Microsoft.XMLHTTP')
  13. For i = 1 To r_num
  14. name = Range('b' & i).Value
  15. If name = '' Then name = i '为空则默认为数字
  16. f_type = Range('c' & i).Value
  17. On Error Resume Next
  18. H.Open 'GET', Range('A' & i), False '网络中的文件URL
  19. H.send
  20. Set S = CreateObject('ADODB.Stream')
  21. S.Type = 1
  22. S.Open
  23. S.write H.Responsebody
  24. S.savetofile filename & '\' & name & '.' & f_type, 2 '本地保存文件名
  25. S.Close
  26. Next i
  27. End Sub

4.查找本周的周一以及周日

  1. Sub ff()
  2. d = '2019/8/12'
  3. MsgBox DateAdd('d', -(Weekday(d, 0) - 1), d) '周一
  4. MsgBox DateAdd('d', (7 - Weekday(d, 0)), d) '周日
  5. 'MsgBox Weekday(d, 0)
  6. End Sub

5.获取最后一列的行号的VBA代码

  1. Function get_col(col_num)
  2. '输出字母形式的列名称
  3. If col_num <= 26 Then
  4. col_str = Chr(64 + col_num)
  5. Else
  6. b_num = col_num \ 26
  7. e_num = col_num Mod 26
  8. If e_num = 0 Then
  9. col_str = Chr(64 + b_num - 1) + Chr(64 + 26)
  10. Else
  11. col_str = Chr(64 + b_num) + Chr(64 + e_num)
  12. End If
  13. End If
  14. get_col = col_str
  15. End Function

6.二维数组与一维数组,获取某行与某列,并转为一维数组

  1. Sub ar()
  2. Dim arr1(1 To 6, 1 To 3), arr2()
  3. Dim i, j As Integer
  4. For i = 1 To 6
  5. For j = 1 To 3
  6. arr1(i, j) = i * j
  7. Next j
  8. Next i
  9. '获取第三列
  10. arr2 = Application.Transpose(Application.Index(arr1, 0, 3))
  11. '获取第三行
  12. arr2 = Application.Index(arr1, 3, 0)
  13. For i = 1 To UBound(arr2)
  14. Debug.Print arr2(i)
  15. Next i
  16. End Sub

7.打开工作簿,并将该工作表的某个工作表放入数组的VBA代码

  1. Function get_arr(file, sh_name)
  2. '打开一个工作簿,并返回一个数组,第一个为路径,第二个参数为工作表的序号(工作表名称)
  3. Dim wb As Workbook
  4. Set wb = Workbooks.Open(file)
  5. wb.Sheets(sh_name).Select
  6. row_num = [b65536].End(xlUp).Row
  7. col_num = ActiveSheet.UsedRange.Columns.Count
  8. col_str = get_col(col_num) '获取行名称
  9. arr = Sheets(sh_name).Range('a1:' & col_str & row_num)
  10. wb.Close False
  11. Set wb = Nothing
  12. get_arr = arr
  13. End Function

8.循环当前工作簿,对每个工作表进行操作的VBA代码

  1. Sub type_sum()
  2. For Each sht In Sheets
  3. sh_name = sht.Name
  4. Sheets(sh_name).Select
  5. 'Call tianchong '执行某个操作
  6. Next sht
  7. End Sub

9.在当前工作簿增加工作表,如果名字相同会删除

  1. Function add_sheet(sh_name)
  2. '添加工作表
  3. '删除旧数据
  4. Application.DisplayAlerts = False
  5. For Each sht In Sheets
  6. If sht.Name = sh_name Then sht.Delete
  7. Next sht
  8. Application.DisplayAlerts = True
  9. '添加新工作表
  10. Sheets.add After:=Sheets(Sheets.Count)
  11. Sheets(Sheets.Count).Name = sh_name
  12. End Function

10.打开word并对其中内容进行替换

  1. Sub open_wd2(arr)
  2. '循环体
  3. Application.EnableCancelKey = xlDisabled
  4. Dim wd, w_doc As Object
  5. Dim common_path
  6. common_path = 'D:\new\' '输出的文档位置
  7. doc_path='D:\analyse\20191118\计算\模板.docx' 'word模板路径
  8. Set wd = CreateObject('Word.application')
  9. 'wd.Visible = True '设置窗体可见
  10. Set w_doc = wd.Documents.Open(doc_path)
  11. Set myRange = w_doc.Content
  12. '替换内容
  13. For i = UBound(arr) To 2 Step -1
  14. myRange.Find.Execute FindText:=arr(i, 2), _
  15. ReplaceWith:=arr(i, 3), Replace:=wdReplaceAll
  16. Next i
  17. w_doc.SaveAs2 common_path & arr(2, 3) & '结果.docx'
  18. w_doc.Close
  19. '退出word程序
  20. wd.Quit
  21. Set wd = Nothing
  22. Set w_doc = Nothing
  23. End Sub
  24. Sub main_func()
  25. Application.EnableCancelKey = xlDisabled
  26. With CreateObject('Wscript.Shell')
  27. Call .RegWrite('HKEY_CURRENT_USER\Control Panel\International\iLZero', '1')
  28. '设置小数点前导0显示即 [0.7]格式
  29. End With
  30. ex_path='D:\analyse\模板.xlsx' 'excel模板位置
  31. arr1 = get_arr(ex_path, 1) '替换的格式,get_arr为上方的函数
  32. arr2 = get_arr(ex_path, 2) '替换的数据
  33. For j = 2 To UBound(arr2)
  34. For k = 2 To UBound(arr1)
  35. arr1(k, 3) = CStr(arr2(j, k))
  36. Next k
  37. open_wd2 (arr1)
  38. Next j
  39. 'With CreateObject('Wscript.Shell')
  40. 'Call .RegWrite('HKEY_CURRENT_USER\Control Panel\International\iLZero', '0')
  41. '恢复到默认 小数点前导0不显示 [.7]状态
  42. 'End With
  43. End Sub

运行时,需要复制本文中的5、7函数,同时设置好word模板路径、excel模板路径和输出位置。

11.将当前工作表中的公式转换成数值

  1. Sub shuzhi()
  2. '公式转为数值
  3. row_num = [a65536].End(xlUp).Row
  4. col_num = ActiveSheet.UsedRange.Columns.Count
  5. col_str = get_col(col_num)
  6. Range('A1:' & col_str & row_num).Copy
  7. Range('A1').Select
  8. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  9. :=False, Transpose:=False
  10. End Sub

12.删除特定行

在原有数据上直接修改

  1. Sub ffa()
  2. '删除对应行
  3. row_num = [a65536].End(xlUp).Row
  4. For i = row_num To 1 Step -1
  5. If Cells(1, i) = '同比' Or Cells(1, i) = '' Then '此处填写条件
  6. Columns(i).Delete
  7. End If
  8. Next i
  9. End Sub

先备份再进行删除

  1. Function add_sheet(sh_name)
  2. '添加工作表
  3. '删除旧数据
  4. Application.DisplayAlerts = False
  5. For Each sht In Sheets
  6. If sht.Name = sh_name Then sht.Delete
  7. Next sht
  8. Application.DisplayAlerts = True
  9. '添加新工作表
  10. Sheets.add After:=Sheets(Sheets.Count)
  11. Sheets(Sheets.Count).Name = sh_name
  12. End Function
  13. Sub ffa()
  14. '删除对应行
  15. row_num = [a65536].End(xlUp).Row
  16. col_num = ActiveSheet.UsedRange.Columns.Count
  17. col_str = get_col(col_num)
  18. arr=Range('A1:' & col_str & row_num)
  19. add_sheet('删除后')
  20. Sheets('删除后').Range('a1').Resize(row_num, UBound(arr, 2)) = arr
  21. For i = row_num To 1 Step -1
  22. If Cells(1, i) = '同比' Or Cells(1, i) = '' Then '此处填写条件
  23. Columns(i).Delete
  24. End If
  25. Next i
  26. End Sub

13.判断文件夹和文件是否存在的VBA代码

  1. Sub fe()
  2. testfile = 'D:\analyse\20191118\计算\new\'
  3. If Dir(testfile, vbDirectory) = '' Then
  4. MsgBox '不存在'
  5. Else
  6. MsgBox '存在'
  7. End If
  8. End Sub

14.添加引用

  1. 'Name: Excel Major: 1 Minor: 7 GUID: {00020813-0000-0000-C000-000000000046}
  2. 'Name: DAO Major: 5 Minor: 0 GUID: {00025E01-0000-0000-C000-000000000046}
  3. 'Name: WMPLib Major: 1 Minor: 0 GUID: {6BF52A50-394A-11D3-B153-00C04F79FAA6}
  4. 'Name: VBIDE Major: 5 Minor: 3 GUID: {0002E157-0000-0000-C000-000000000046}
  5. 'Name: Office Major: 2 Minor: 5 GUID: {2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}
  6. 'Name: stdole Major: 2 Minor: 0 GUID: {00020430-0000-0000-C000-000000000046}
  7. 'Name: Word Major: 8 Minor: 5 GUID: {00020905-0000-0000-C000-000000000046}
  8. 'Name: VBA Major: 4 Minor: 1 GUID: {000204EF-0000-0000-C000-000000000046}
  9. Sub AutoAddRef()
  10. Dim strGUID As String
  11. strGUID = '{00020905-0000-0000-C000-000000000046}' 'Microsoft Windows Media Player Marjor=1 Minor=0
  12. ThisDocument.VBProject.References.AddFromGuid GUID:=strGUID, Major:=8, Minor:=5
  13. End Sub

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约