VBA自学日志

文章目录

  • 前言
  • 一、For each 循环
  • 二、offset 偏移
  • 三、Resize 属性
  • 四、Exit 语句
  • 五、DO...LOOP语句
  • 六、一些错误代码总结
  • 七、GOTO语句
  • 八、do while 和 do until
  • 九、如何在VBA内使用Excel工作表函数
  • 十、VBA使用随机数
  • 十一、排序
  • 总结


前言

VBA自学成柴的第三周


一、For each 循环

for each 循环一般用于循环一个集合,比如一个工作表,一个工作簿,或者是一个文件夹。

  • 格式
for each a in 集合content
next

遍历工作簿

Sub test()
Dim a as WorkBook
For Each a in WorkBooks内容
Next
End Sub

遍历工作表

Sub test()
Dim a as WorkSheet
For Each a in WorkSheets内容
Next
End Sub

遍历单元格(CurrentRegion)

Sub test()
Dim a as Range
for Each a in Range("a1").CurrentRegion内容
Next
End Sub

遍历单元格(UsedRange)

Sub test()
Dim a as Range
for Each a in ActiveSheet.UsedRange内容
Next
End Sub

案例:将下列分数85分以上的分数变成红色
在这里插入图片描述

Sub test()
Dim a As Range
Dim lastrow As Long
'找到数据的边界
lastrow = Cells(Rows.Count, "b").End(xlUp).Row
'通过&将列和行列连接
For Each a In Range("b2:b" & lastrow)If a.Value >= 85 Thena.Interior.ColorIndex = 3End If
Next a
End Sub

二、offset 偏移

以单元格为基准,进行偏移,返回单元格offset一共有两种偏移方式,我就只记了一种。

  • 格式
    单元格.offset(行,列) 从0开始
  • 符号
    上负,下正,左负,右正

实用案例:给95分及以上的同学建一个新的工作表,以他们的名字命名。
在这里插入图片描述

Sub test()
Dim a As Range
Dim lastrow As Byte
'找到数据边界最后一行
lastrow = Cells(Rows.Count, "b").End(xlUp).Row
'循环整个列,用&将列和行连接起来
For Each a In Range(Sheet3.[b35], "b" & lastrow)If a.Value >= 95 Then'这里使用偏移,将b列左边的a列(姓名列)作为新表的名字newSheetName = a.Offset(0, -1).Value' 创建新的工作表Set NewSheet = Sheets.Add(After:=Sheets(Sheets.Count))'将刚才定义的名字赋值给新表NewSheet.Name = newSheetName'将符合条件的单元格内容复制到新工作表,这里因为是希望将'整个表内容复制到新表中,所以这里使用偏移定位到第一列,然'后使用resize重构这个数据集,得到后面的数据。resize是后面'的内容,我直接提前用了。a.Offset(0, -1).Resize(1, 2).Copy NewSheet.Range("A1")End If
Next a
End Sub

虽然代码有注释,但是我还想总结一下:
1.定位边界
2.循环数据集
3.利用offset偏移得到第一列的值并赋值
4.赋值给新列名称
5.利用offset+resize+copy将完整数据复制到新表中

三、Resize 属性

用于调整区域大小,返回一个range对象,该对象表示重新定义的区域。

  • 格式
单元格.resize(新区域行数,新区域列数) 从1开始

案例:将分数大于95分的同学全部标成红色
在这里插入图片描述

Sub test()
Dim a As Range
Dim lastrow As Byte
lastrow = Cells(Rows.Count, "b").End(xlUp).Row
For Each a In Range("b35:b" & lastrow)If a.Value >= 85 Then'用offset偏移定位到第一列,然后resize重构到1行2列,返回所有数据'然后将所有数据变成红色a.Offset(0, -1).Resize(1, 2).Interior.ColorIndex = 3End If
Next a
End Sub

四、Exit 语句

exit用于提前结束代码,但是不能取代end,end永远是老大哥在后面。

  • 格式
exit do   '只能写在do循环里面
exit for  '只能写在for循环里面
exit sub  '只能写在sub循环里面

案例,抽取前三个姓李的同学
在这里插入图片描述

Sub test()
Dim a, b, lastrow As Byte
lastrow = Cells(Rows.Count, "a").End(xlUp).Row
For a = 35 To lastrowIf Left(Cells(a, "A"), 1) = "李" ThenCells(a, "B").Offset(0, -1).Resize(1, 2).Copy _Cells(Rows.Count, "f").End(xlUp).Offset(1, 0)b = b + 1If b = 3 ThenExit SubEnd IfEnd If
Next a
End Sub

总结:
1.用left找到左边第一位是“李”的同学
2.offset+resize+copy 提取所有数据并赋值给f列
3.定位f列边界,并且用offset向下偏移一行,因为第一行是表头

五、DO…LOOP语句

DO LOOP无限循环语句,DO LOOP语句需要结合exit提前结束语句,不然就会陷入无限循环当中,直到机器死机。

  • 格式
DO循环的内容
LOOP

在循环到5的时候结束语句

Sub test()
Dim a as Byte
Do 
n=n+1
If n = 5 Then Exit Do
LOOP
End Sub

六、一些错误代码总结

如果想忽略错误,继续运行在代码前面加

On Error Resume Next

一些常见的错误代码:

代码含义
9数组下标超出范围
13类型不匹配
91对象变量未设置
428对象不支持此属性或方法
445对象不支持此操作
53文件未找到
76路径未找到
91溢出
0代码无错误,当然这肯定不会弹出来

七、GOTO语句

跳转语句

  • 格式
GOTO 66
其他内容
66:

在代码中加入GOTO,会在你类型出错的时候提醒你:

Sub test()
...
'因为这里运行两句话所以要在中间打上冒号。
If Err.Number <> 0 Then MsgBox "不好意思,您输入的格式有误"  : GoTo 66 
... `如果出现错就不会执行中间的代码,直接跳转到66后
66:
Err.Clear '记得清除报错信息
End Sub

八、do while 和 do until

Do While loop 和 Do until loop 是有前提条件结束的Do循环语句。

  • 格式
Do While 条件 (条件成立才开始循环)
循环内容
LOOP
-------------------------------
Do Until 条件(条件成立才退出循环)
循环内容
LOOP

案例,抽取前三个姓李的同学
在这里插入图片描述
Do While:

Sub test()
Dim a As Integer
Dim b, c As Byte
a = 35
Do While b <> 3
If Left(Cells(a, "A"), 1) = "李" ThenCells(a, "b").Offset(0, -1).Resize(1, 2).Copy _Cells(Rows.Count, "f").End(xlUp).Offset(1, 0)b = b + 1
End If
a = a + 1
Loop
End Sub

Do Until:

Sub test()
Dim a As Integer
Dim b, c As Byte
a = 35
Do Until b = 3
If Left(Cells(a, "A"), 1) = "李" ThenCells(a, "b").Offset(0, -1).Resize(1, 2).Copy _Cells(Rows.Count, "f").End(xlUp).Offset(1, 0)b = b + 1
End If
a = a + 1
Loop
End Sub

九、如何在VBA内使用Excel工作表函数

  • 格式
application.WorksheetFunction.函数名

例如求所有一年级同学的平均成绩

Sub test()
单元格 = application.WorksheetFunction.averageif(年级列,"一年级",成绩列)
End Sub

十、VBA使用随机数

Rnd 返回一个小于1但大于或等于0的值

  • 格式
Int((最大值 - 最小值 + 1) * Rnd + 最小值)

十一、排序

格式:

Sort(key1,order1,key2,type,order2,key3,order3.header,ordercustom,
matchcase,orientation,sortmethod,dataoption1,dataoption2,dataoption3)

参数意义:

  • key1,key2,key3,排序关键列,至少使用一个key,最多使用三重排序

  • order1,order2,order3排序模式,默认升序

    • order1:=xlAscending 代表key1升序,简写 order 1:=1
    • order2:=xlDescending 代表key2降序,简写order2:=2
  • type指定要排序的元素,排序数据透视表的时候使用

  • header排序区域是否有表头

    • header:=xlGuess,你猜,让软件辨认,简写 header:=0
    • header:xlYes 有表头,简写 header:=1(第一行不参与排序)
    • header:xlNo 没有表头,简写 header:=2(第一行参与排序)
      案例:对班级进行升序,对成绩进行降序
      在这里插入图片描述
Sub test()
Dim a As Range
Set a = Range("a58").CurrentRegion
'注意如果type没有使用的话要把type空出来
a.Sort Range("a58"), 1, Range("c58"), , 2, Header:=1
End Sub

总结

  • 目前所学的VBA 循环类型
循环类型使用方法适用场景
For                  for 变量 = x to y
                      需要的操作
next
在已知循环次数的情况下,适用于明确指定开始、结束和步长的循环
For Each                     for each a in 集合
                 content
next
用于遍历集合(如数组、集合、范围等),适用于不知道循环次数但需要遍历集合的情况
Do LoopDo
                      循环的内容
     Loop
适用于不知道循环次数的情况
Do While                               Do While 条件 (条件成立才开始循环)
                循环内容
Loop
在循环开始之前检查条件,只有在条件为 True 时才执行循环
Do Until                              Do Until 条件(条件成立才退出循环)
                  循环内容
Loop
在循环开始之前检查条件,只有在条件为 False 时才执行循环

就这样。结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1、中级机器学习课程简介

文章目录 1、课程简介2、先决条件 本课程所需数据集夸克网盘下载链接&#xff1a;https://pan.quark.cn/s/9b4e9a1246b2 提取码&#xff1a;uDzP 1、课程简介 欢迎来到机器学习中级课程&#xff01; 如果你对机器学习有一些基础&#xff0c;并且希望学习如何快速提高模型质量…

基于Yolov5+Deepsort+SlowFast算法实现视频目标识别、追踪与行为实时检测

前言 前段时间打算做一个目标行为检测的项目&#xff0c;翻阅了大量资料&#xff0c;也借鉴了不少项目&#xff0c;最终感觉Yolov5DeepsortSlowfast实现实时动作检测这个项目不错&#xff0c;因此进行了实现。 一、核心功能设计 总的来说&#xff0c;我们需要能够实现实时检测视…

ELK 日志分析系统

目录 一、日志管理方案 二、完整日志系统基本特征 三、ELK 简介 ELK组件&#xff1a; 1、ElasticSearch 2、Logstash 3、Kibana 可以添加的其它组件&#xff1a; 1、Filebeat 2、缓存/消息队列&#xff08;redis、kafka、RabbitMQ等&#xff09; 3、Fluentd 三、ELK …

github经常登不上去怎么办?

问题 想少些代码&#xff0c;多学习&#xff0c;少不了使用github&#xff0c;但是在国内经常上不去&#xff0c;很耽误事&#xff0c;这里提供一个简单方法&#xff0c;供参考。 github GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;可以让开发者共同协作开发软…

C++总结笔记

1. 简介 1、面向对象程序设计 面向对象的四大特性 1&#xff09;封装 2&#xff09;继承 3&#xff09;多态 4&#xff09;抽象 2、标准库 标准C由三个部分组成 1&#xff09;核心语言&#xff1a;提供了所有的构件块 2&#xff09;C标准库&#xff1a;提供了大量的函…

大寒---每年的最后一个节气

# 大寒节气 # 大寒&#xff0c;是二十四节气中的最后一个节气。斗指丑&#xff1b;太阳黄经达300&#xff1b;于每年公历1月20日左右交节。大寒同小寒一样&#xff0c;都是表示天气寒冷程度的节气&#xff0c;大寒是天气寒冷到极致的意思。大寒节气处在三九、四九时段&#xf…

书生·浦语大模型实战营第四次课堂笔记

先来看看参考作业 哈哈到这才想起来写笔记 倒回去看发现要求将不要葱姜蒜换成自己的名字和昵称&#xff01; 好好好我就是不配玩&#xff08;换成管理员也不行&#xff01;&#xff09; 诶怎么能进这个环境&#xff1f;要进双系统ubuntu&#xff1f; 现在看视频发现原来是…

009 Linux_文件系统 | 软硬链接

前言 本文将会向你介绍文件系统与软硬链接 文章重点 本文将会先向你介绍文件是如何在磁盘上进行管理的&#xff0c;关于文件的管理将会从管理属性和管理内容两方面来谈&#xff0c;最后会向你介绍软硬链接的概念 文件在磁盘中的管理 首先&#xff0c;假设一个磁盘200GB&#…

Linux中的共享内存

定义&#xff1a; 共享内存允许两个或者多个进程共享物理内存的同一块区域&#xff08;通常被称为段&#xff09;。由于一个共享内存段会称为一个进程用户空间的一部分&#xff0c;因此这种 IPC 机制无需内核介入。所有需要做的就是让一个进程将数 据复制进共享内存中&#xff…

acwing讲解篇之94. 递归实现排列型枚举

文章目录 题目描述题解思路题解代码 题目描述 题解思路 定义递归深度deep&#xff0c;数字使用情况used&#xff0c;选择的数字顺序path 进行递归 终止条件为递归深度达到n层时&#xff0c;打印path&#xff0c;然后返回 深度加一 遍历未使用的数字&#xff0c;选择数字&am…

【rust/bevy】使用points构造ConvexMesh

目录 说在前面问题提出Rapier具体实现参考 说在前面 操作系统&#xff1a;win11rust版本&#xff1a;rustc 1.77.0-nightlybevy版本&#xff1a;0.12 问题提出 在three.js中&#xff0c;可以通过使用ConvexGeometry从给定的三维点集合生成凸包(Convex Hull) import { ConvexGeo…

【51单片机Keil+Proteus8.9】温室盆栽灌溉系统

实验五 实验名称 温室盆栽灌溉系统 软件设计&#xff1a; 1. 定义对应的引脚和端口的别名。 2. 编写延时函数&#xff0c;用于控制程序的执行速度。 3. 编写LCD控制函数&#xff0c;包括发送命令和发送数据两种操作。 4. 编写显示函数&#xff0c;用于在LCD上显示字符串…

无人机打击激光器

激光器的应用非常广泛&#xff0c;涵盖了多个领域。以下是一些主要的激光器应用&#xff1a; 医疗领域&#xff1a;激光器在医疗行业中有着重要应用&#xff0c;比如用于激光手术&#xff08;如眼科手术&#xff09;、皮肤治疗、牙科治疗、肿瘤治疗等。 工业制造&#xff1a;在…

无忧秘书智脑:轻松驾驭“看图说话”功能,职场沟通更高效

在现代职场中&#xff0c;有效的沟通是提升工作效率的关键。然而&#xff0c;有时候我们面对一张图片或图表&#xff0c;却难以用言语准确表达其中的信息。这时&#xff0c;无忧秘书智脑的“看图说话”功能就派上了用场。这篇文章将手把手教你如何使用这一功能&#xff0c;以及…

【MATLAB源码-第119期】基于matlab的GMSK系统1bit差分解调误码率曲线仿真,输出各个节点的波形以及功率谱。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 GMSK&#xff08;高斯最小频移键控&#xff09;是一种数字调制技术&#xff0c;广泛应用于移动通信&#xff0c;例如GSM网络。它是一种连续相位调频制式&#xff0c;通过改变载波的相位来传输数据。GMSK的关键特点是其频谱的…

使用 Zabbix + Grafana 搭建服务器监控系统

搭建 Linux 服务器监控的目的是自己有一台阿里云服务器内存是 2g 的 , 多开一些软件就会把内存和 CPU 使用率弄的很高&#xff0c;最终导致服务器卡死。 所以基于这个痛点&#xff0c;想知道当前的 CPU 和内存是多少。阿里云 ECS 控制台中也提供对服务器的监控 , 但是为了学习…

文字的baseLine算法

使用canvas的drawText方法时候&#xff0c;除了要传入画笔和text还需要传入一个x坐标和y坐标。这边的x和y坐标是Baseline的坐标。 public void drawText(NonNull String text, float x, float y, NonNull Paint paint) {super.drawText(text, x, y, paint);} top:是 baseLine到…

mysql B+树索引

数据库索引用于提高查询性能和数据访问效率。索引可以加速数据的查找和筛选&#xff0c;减少查询的时间复杂度。数据库索引有很多类型&#xff0c;这里不展开也不比较&#xff0c;只介绍最常见一种索引结构B树索引。mysql中InnoDB引擎默认使用的就是BTREE索引。 B树数据结构 …

ubuntu设置每天定时关机

ubuntu设置每天定时关机 终端输入命令&#xff1a; sudo crontab -e输入密码&#xff0c;回车。 我这里使用nano作为编辑器&#xff0c;你可以选择vim。 在末尾输入以下命令&#xff1a; 59 23 * * * sudo -u root shutdown now设置&#xff1a;每天23:59分&#xff0c;电脑…

GitHub图床TyporaPicGo相关配置

本文作者&#xff1a; slience_me 文章目录 GitHub图床&Typora&PicGo相关配置1. Github配置2. picGo配置3. Typora配置 GitHub图床&Typora&PicGo相关配置 关于Typora旧版的百度网盘下载路径 链接&#xff1a;https://pan.baidu.com/s/12mq-dMqWnRRoreGo4MTbKg?…