百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

常用VBA代码(一)

wptr33 2024-12-09 18:00 28 浏览

VBA,神一般的办公利器,在Excel可以随意操控全公司的打印机、Word、Powerpoint等等,自动完成各种任务以及数据更新和抓取,甚至可以实现报表或者报告的更新、汇总、发送一条龙,简直是居家旅游必备神器!

此合集工具旨在提供常用代码块,让日常使用像调用函数一般容易,前人做过了无数的工作,我们只需要理解代码内容可以修改套用在自己的工作中即可,毕竟,效率第一嘛~

基本操作科普:
(1)打开宏编辑页面 Alt+F12;
(2)运行宏 F5 #复制完代码,按下F5就等结果好了
(3)逐行运行宏代码 F8 #调试代码很好用
(4)中断宏代码 Ctrl+Break #出现无脑无限循环时候很好用
(5)在宏编辑页面下,选中需要操作的工作薄,插入模块后粘贴代码
(6)录制宏是个极好的入门神奇


一、工作表处理:

  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
           '累加i
           ActiveSheet.Hyperlinks.Add anchor:=Cells(i, 1), Address:="", SubAddress:="'" & strShtName & "'!a1", TextToDisplay:=strShtName
           '建超链接
        End If
    Next
End Sub

2. 一键批量取消工作表隐藏

Sub qxyc()
    Dim sht As Worksheet
    '定义变量
    For Each sht In Worksheets
    '循环工作簿里的每一个工作表
        sht.Visible = xlSheetVisible
        '将工作表的状态设置为非隐藏
    Next
End Sub

3. 一键汇总各分表数据到总表

Sub collect()

    'VBA编程学习与实践,一键多表数据汇总~看见星光

    Dim sht As Worksheet, rng As Range, k&, trow&

    Application.ScreenUpdating = False

    '取消屏幕更新,加快代码运行速度

    trow = Val(InputBox("请输入标题的行数", "提醒"))

    If trow < 0 Then MsgBox "标题行数不能为负数。", 64, "警告": Exit Sub

    '取得用户输入的标题行数,如果为负数,退出程序

    Cells.ClearContents

    '清空当前表数据

    Cells.NumberFormat = "@"

    '设置文本格式

    For Each sht In Worksheets

    '遍历表格

        If sht.Name <> ActiveSheet.Name Then

        '如果表格名称不等于当前表名则进行复制数据……

            Set rng = sht.UsedRange

            '定义rng为表格已用区域

            k = k + 1

            '累计K值

            If k = 1 Then

            '如果是首个表格,则K为1,则把标题行一起复制到汇总表

                rng.Copy

                [a1].PasteSpecial Paste:=xlPasteValues

            Else

                '否则,扣除标题行后再复制黏贴到总表,只黏贴数值

                rng.Offset(trow).Copy

                Cells(ActiveSheet.UsedRange.Rows.Count + 1, 1).PasteSpecial Paste:=xlPasteValues

            End If

        End If

    Next

    [a1].Activate

    '激活A1单元格

    Application.ScreenUpdating = True

    '恢复屏幕刷新

End Sub

4. 按指定名称批量建立工作表

'VBA根据A列数据批量建立工作表的代码如下:



Sub NewSht()
    'ExcelHome VBA编程实践与学习
    Dim Sht As Worksheet, Rng As Range
    Dim Sn, t$
    Set Rng = Range("a2:a" & Cells(Rows.Count, 1).End(xlUp).Row)
    '将工作表名称所在的单元格区域赋值给变量Rng,单元格A1是标题,不读入
    On Error Resume Next
    '当代码出错时继续运行
    For Each Sn In Rng
    '遍历Rng(工作表名称集合)
        t = Sn
        '还记得这里我们为什么用这句代码吗?
        Set Sht = Sheets(t)
        '当工作簿不存在工作表Sheets(t)时,这句代码会出错,然后……
        If Err Then
        '如果代码出错,说明不存在工作表Sheets(t),则新建工作表
            Worksheets.Add , Sheets(Sheets.Count)
            '新建一个工作表,位置放在所有已存在工作表的后面
            ActiveSheet.Name = t
            '新建的工作表必然是活动工作表,为之命名
            Err.Clear
            '清除错误状态
        End If
    Next
    Rng.Parent.Activate
    '重新激活名称数据所在的工作表
End Sub

5. 一键将总表数据拆分为多个分表

Sub SplitShts()
    Dim d As Object, sht As Worksheet
    Dim aData, aResult, aTemp, aKeys, i&, j&, k&, x&
    Dim rngData As Range, rngGist As Range
    Dim lngTitleCount&, lngGistCol&, lngColCount&
    Dim rngFormat As Range
    Dim strKey As String
    Set d = CreateObject("scripting.dictionary")
    Set rngGist = Application.InputBox("请框选拆分依据列!只能选择单列单元格区域!", Title:="提示", Type:=8)
    '========用户选择的拆分依据列
    lngGistCol = rngGist.Column
    '========拆分依据列的列标
    lngTitleCount = Val(Application.InputBox("请输入总表标题行的行数?"))
    '========用户设置总表的标题行数
    If lngTitleCount < 0 Then MsgBox "标题行数不能为负数,程序退出。": Exit Sub
    Set rngData = ActiveSheet.UsedRange
    '========总表的数据区域
    Set rngFormat = ActiveSheet.Cells
    '========总表的单元格集用于粘贴总表格式
    aData = rngData.Value
    lngGistCol = lngGistCol - rngData.Column + 1
    '========计算依据列在数组中的位置
    lngColCount = UBound(aData, 2)
    '========数据源的列数
    For i = lngTitleCount + 1 To UBound(aData)
        If aData(i, lngGistCol) = "" Then aData(i, lngGistCol) = "单元格空白"
        strKey = aData(i, lngGistCol)
    '========统一转换为字符串格式
        If Not d.exists(strKey) Then
    '========字典中不存在关键字时将行号装入字典
            d(strKey) = i
        Else
            d(strKey) = d(strKey) & "," & i
    '========如果字段存在关键字则合并行号
        End If
    Next
    Application.DisplayAlerts = False
    For Each sht In ActiveWorkbook.Worksheets
    '========删除字典中存在的表名
        If d.exists(sht.Name) Then sht.Delete
    Next
    Application.DisplayAlerts = True
    aKeys = d.keys
    '========字典的key集
    Application.ScreenUpdating = False
    For i = 0 To UBound(aKeys)
        If aKeys(i) <> "" Then
            aTemp = Split(d(aKeys(i)), ",")
    '========取出item里储存的行号
            ReDim aResult(1 To UBound(aTemp) + 1, 1 To lngColCount)
    '========声明放置结果的数组aResult
            k = 0
            For x = 0 To UBound(aTemp)
                k = k + 1
                For j = 1 To lngColCount
                    aResult(k, j) = aData(aTemp(x), j)
                Next
            Next
            With Worksheets.Add(, Sheets(Sheets.Count))
    '========新建一个工作表
                .Name = aKeys(i)
                .[a1].Resize(UBound(aData), lngColCount).NumberFormat = "@"
    '========设置单元格为文本格式
                If lngTitleCount > 0 Then .[a1].Resize(lngTitleCount, lngColCount) = aData
    '========标题行
                .[a1].Offset(lngTitleCount, 0).Resize(k, lngColCount) = aResult
    '========数据
                rngFormat.Copy
                .[a1].PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    '========复制粘贴总表的格式
                .[a1].Offset(lngTitleCount + k, 0).Resize(UBound(aData) - k - lngTitleCount, 1).EntireRow.Delete
    '========删除多余的格式单元格
                .[a1].Select
            End With
        End If
    Next
    rngData.Parent.Activate
    '========激活总表
    Application.ScreenUpdating = True
    Set d = Nothing
    Set rngData = Nothing
    Set rngGist = Nothing
    Set rngFormat = Nothing
    Erase aData: Erase aResult
    MsgBox "数据拆分完成!"
End Sub

6. 批量将工作表转为独立工作簿

Sub Newbooks()

    'EH技术论坛。VBA编程学习与实践。看见星光

    Dim sht As Worksheet, mypath$

    With Application.FileDialog(msoFileDialogFolderPicker)

   '选择保存工作薄的文件路径

        .AllowMultiSelect = False

        '不允许多选

        If .Show Then

            mypath = .SelectedItems(1)

            '读取选择的文件路径

        Else

            Exit Sub

            '如果没有选择保存路径,则退出程序

        End If

    End With

    If Right(mypath, 1) <> "\" Then mypath = mypath & "\"

    Application.DisplayAlerts = False

    '取消显示系统警告和消息,避免重名工作簿无法保存。当有重名工作簿时,会直接覆盖保存。

    Application.ScreenUpdating = False

    '取消屏幕刷新

    For Each sht In Worksheets

    '遍历工作表

        sht.Copy

        '复制工作表,工作表单纯复制后,会成为活动工作薄

        With ActiveWorkbook

            .SaveAs mypath & sht.Name, xlWorkbookDefault

            '保存活动工作薄到指定路径下,以默认文件格式

            .Close True '关闭工作薄并保存

        End With

    Next

    MsgBox "处理完成。", , "提醒"

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

    Application.DisplayAlerts = True '恢复显示系统警告和消息

End Sub

7. 按指定条件汇总各分表数据到总表

Sub CollectSheets()
    'ExcelHome VBA编程学习与实践
    Dim sht As Worksheet, rng As Range, k&, trow&,temp
    Application.ScreenUpdating = False
    '取消屏幕更新,加快代码运行速度
    temp = InputBox("请输入需要合并的工作表所包含的关键词:", "提醒")
    If StrPtr(temp) = 0 Then Exit Sub
    '如果点击了inputbox的取消或者关闭按钮,则退出程序
    trow = Val(InputBox("请输入标题的行数", "提醒"))
    If trow < 0 Then MsgBox "标题行数不能为负数。", 64, "警告": Exit Sub
    '取得用户输入的标题行数,如果为负数,退出程序
    Cells.ClearContents
    '清空当前表数据
    For Each sht In Worksheets
    '循环读取表格
        If sht.Name <> ActiveSheet.Name Then
        '如果表格名称不等于当前表名则……
            If InStr(1, sht.Name, temp, vbTextCompare) Then
           '如果表中包含关键词则进行汇总动作(不区分关键词字母大小写)
                Set rng = sht.UsedRange
                '定义rng为表格已用区域
                k = k + 1
                '累计K值
                If k = 1 Then
                '如果是首个表格,则K为1,则把标题行一起复制到汇总表
                    rng.Copy
                    [a1].PasteSpecial Paste:=xlPasteValues
                Else
                    '否则,扣除标题行后再复制黏贴到总表,只黏贴数值
                    rng.Offset(trow).Copy
                    Cells(ActiveSheet.UsedRange.Rows.Count + 1, 1).PasteSpecial Paste:=xlPasteValues
                End If
            End If
        End If
    Next
    [a1].Activate
    '激活A1单元格
    Application.ScreenUpdating = True
    '恢复屏幕刷新
End Sub

相关推荐

F103C8T6移植FATFS文件系统 版本R0.15

STM32F103C8T6芯片在W25Q64上移植FATFS(版本R0.15)实现过程:1、首先完成USART初始化和调试,用于传输信息到串口调试软件。2、完成SPI相关参数配置及调试,用于单片机和存...

stm32使用MPU6050或ADXL345控制的车辆减速灯

本实验例程采用MPU6050六轴运动处理组件...

STM32F103串口输出prtinf覆盖(stm32printf函数的串口输出)

采用正点原子的板子,有如下坑,记录如下:(1)main中应用头文件#include"stdio.h"(2)采用hal进行fputc和fgetc覆盖,如下intfputc(intc...

STM32 学习8 USART串口通讯与printf重定向

一、串口通信介绍STM32F103ZET6包含多个UART、USART串口。...

教你如何使用SEGGER RTT优雅的实现日志系统

今天开始了BMS系统的软件代码部分的搭建,计划是分成三层:硬件驱动,AFE层和系统应用层。第一步肯定是先把底层的IIC通信调通,CG861xx的IIC通信和TI的BQ769X0...

终极调试利器,各种Link通吃(link4a调制方式)

今天继续更新一期KEIL调试方法。事实上,关于调试方法,鱼鹰写了一个系列,汇总文为《佛祖保佑,永无BUG,永不修改|KEIL调试系列总结篇》,对于KEIL方法感兴趣的可以看看。这个调试...

在 STM32 中使用 printf() 函数,别漏掉这几行代码!

问:在STM32上轻松使用printf函数除了点亮LED外,向串行控制台发送打印信息可能是调试嵌入式项目时最简单、最直接且最常用的技术。虽然大多数平台都拥有可以在UART总线上传输数据的API,但它们...

高性能异步io机制:io_uring(异步io select)

io_uring是linux内核5.10引入的异步io接口。相比起用户态的DPDK、SPDK,io_uring作为内核的一部分,通过mmap的方式实现用户和内核共享内存,并基于m...

精品博文ARM中打印函数print 的几种实现方法

1利用C库函数printf步骤:1)首先需要包含头文件stdio.h。2)然后定义文件句柄。实际上就是一个int型变量封装在结构体中。struct__FILE{inthandle;};3)定...

C语言char的详解(c语言(char))

在C语言中,char是一种基础数据类型,用于表示字符或小整数值。对char的理解和处理非常重要,尤其是在字符串操作、文件读写或其他需要直接控制内存的应用场景中。下面从基本定义、存储方式、常见用法...

C语言之文件操作(c语言文件操作实验总结)

文件操作是C语言中非常重要的功能,用于读取和写入文件中的数据。C语言提供了一组标准库函数(如fopen、fclose、fread、fwrite等)来实现文件操作。以下是针对C语言初学者的详细讲解。...

STM32-ADC如何把采集的数据转换为小数

编辑一、代码原理解析这段代码围绕“STM32中ADC数据采集、整数与小数计算及串口输出”展开,核心是数据类型的使用(unsignedint/signedint/float)、ADC数...

循环队列原理及在单片机串口通讯中的应用(二)

前言书接上回,前文主要介绍了环形队列的实现原理以及C语言实现及测试过程,本文将回归到嵌入式平台的应用中,话不多说,淦,上干货!...

STM32编程中printf函数重定向背后的原理

  在C语言中,printf是一个非常好用的函数,尤其是在程序调试阶段,我们可以通printf打印变量的值来帮助查错。在学习C语言的时候我们的开发环境和运行环境都是PC机,printf函数打印到PC机...

MySQL 避坑指南之隐式数据类型转换

...