常用VBA代码(一)
wptr33 2024-12-09 18:00 31 浏览
VBA,神一般的办公利器,在Excel可以随意操控全公司的打印机、Word、Powerpoint等等,自动完成各种任务以及数据更新和抓取,甚至可以实现报表或者报告的更新、汇总、发送一条龙,简直是居家旅游必备神器!
此合集工具旨在提供常用代码块,让日常使用像调用函数一般容易,前人做过了无数的工作,我们只需要理解代码内容可以修改套用在自己的工作中即可,毕竟,效率第一嘛~
基本操作科普:
(1)打开宏编辑页面 Alt+F12;
(2)运行宏 F5 #复制完代码,按下F5就等结果好了
(3)逐行运行宏代码 F8 #调试代码很好用
(4)中断宏代码 Ctrl+Break #出现无脑无限循环时候很好用
(5)在宏编辑页面下,选中需要操作的工作薄,插入模块后粘贴代码
(6)录制宏是个极好的入门神奇
一、工作表处理:
- 一键生成带超链接的工作表目录
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
相关推荐
- redis的八种使用场景
-
前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...
- 基于Redis的3种分布式ID生成策略
-
在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...
- 基于OpenWrt系统路由器的模式切换与网页设计
-
摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...
- 这篇文章教你看明白 nginx-ingress 控制器
-
主机nginx一般nginx做主机反向代理(网关)有以下配置...
- 如何用redis实现注册中心
-
一句话总结使用Redis实现注册中心:服务注册...
- 爱可可老师24小时热门分享(2020.5.10)
-
No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...
- Apportable:拯救程序员,IOS一秒变安卓
-
摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...
- JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透
-
以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...
- 3月26日更新 快速施法自动施法可独立设置
-
2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...
- Redis 是如何提供服务的
-
在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...
- lua _G、_VERSION使用
-
到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...
- China's top diplomat to chair third China-Pacific Island countries foreign ministers' meeting
-
BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...
- 移动工作交流工具Lua推出Insights数据分析产品
-
Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...
- Redis 7新武器:用Redis Stack实现向量搜索的极限压测
-
当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...
- Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求
-
重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)