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.hqwc.cn/news/418292.html

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

相关文章

leetcode 454 四数之和

题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;nums1 …

Arduino开发实例-INA219 电流传感器驱动

INA219 电流传感器驱动 文章目录 INA219 电流传感器驱动1、INA219 电流传感器介绍2、硬件准备及接线3、代码实现1、INA219 电流传感器介绍 INA219 模块用于同时测量电流和电压。 该模块使用 I2C 通信传输电压和电流数据。 其他特性: 测量精度:1%最大测量电压:26V最大测量电…

【高等数学之牛莱公式】

一、深入挖掘定积分 二、变限积分 三、变限积分的"天然"连续性 四、微积分基本定理 五、定积分基本方法 5.1、换元法 5.2、分部积分法 六、定积分经典结论 七、区间再现公式 八、三角函数积分变换公式 九、周期函数积分变换公式 十、分段函数求定积分

【C语言编程之旅 6】刷题篇-for循环

第1题 解析 思路&#xff1a; 两个循环进行控制 外层循环控制打印多少行 内部循环控制每行打印多少个表达式以及表达式内容&#xff0c; 比较简单&#xff0c;具体参考代码 #include <stdio.h> int main() {int i 0;//控制行数for(i1; i<9; i){//打印每一行内容&am…

mac 中vscode设置root启动

1. 找到你的vscode app&#xff0c;点击鼠标右键------->选项----->在访达中显示 2. 终端中输入以下命令&#xff0c;不要点回车&#xff0c;不要点回车&#xff0c;输入一个空格 sudo chflags uchg 3. 然后将你的程序拖到终端&#xff0c;会自动…

编译openjdk 调试java

背景 一直很想深入了解java运行机制&#xff0c;想编译debug版本openjdk 实践 安装环境 安装vmware软件&#xff0c;第一步就遇到很多麻烦&#xff0c;找不到免费的vmware。 后来下载了官网的&#xff0c;在github和百度一直搜如何破解&#xff0c;幸亏有大佬传了比较全的…

Peter算法小课堂—拓扑排序与最小生成树

拓扑排序 讲拓扑排序前&#xff0c;我们要先了解什么是DAG树。所谓DAG树&#xff0c;就是指“有向无环图”。请判断下列图是否是DAG图 第一幅图&#xff0c;它不是DAG图&#xff0c;因为它形成了一个环。第二幅图&#xff0c;它也不是DAG图&#xff0c;因为它没有方向。第三幅…

Docker Consul详解与部署示例

目录 Consul构成 Docker Consul 概述 Raft算法 服务注册与发现 健康检查 Key/Value存储 多数据中心 部署模式 consul-template守护进程 registrator容器 consul服务部署&#xff08;192.168.41.31&#xff09; 环境准备 搭建Consul服务 查看集群信息 registrato…

触摸屏监控双速电动机-确定地址分配

I/O地址分配 当选择了PLC之后&#xff0c;首先需要确定的是系统中各I/O点的绝对地址。在某些PLC 中1/O绝对地址的分配方式共有固定地址型、自动分配型、用户定义型3种。实际所使用的方式取决于所采用的PLC的CPU型号、编程软件、软件版本、编程人员的选择等因素。 本任务输入信…

vulnhub-dc2靶场

DC2 配置环境vmware17 nat网络配置 下载地址:DC and Five86 Series Challenges - DC-1 &#xff08;似乎从2024/1/18左右找不到这个资源了&#xff09; 攻击机kali与其在同一网段下 ip:192.168.52.130 信息收集 arp-scan -l #内网探测&#xff0c;扫描目标ip发现目标ip1…

vtk9.3 配置 visual studio 2019 运行环境 和运行实例详解

&#xff08;1&#xff09;包含文件配置&#xff1a; 项目--属性--VC目录&#xff0c;在包含目录中把include文件夹的地址加进去&#xff0c;一直要到下一级 vtk-9.3目录下&#xff0c; 小知识&#xff1a; 在Visual Studio 2019中运行项目时&#xff0c;如果项目中使用了第三…

Maven 基础安装配置及使用

大家好我是苏麟 , 今天聊聊Maven . Maven Maven , 是Apache公司下基于Java开发的开源项目 . 我们构建一个项目需要用到很多第三方的类库&#xff0c;需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌&#xff0c;并且Jar包之间的关系错综复杂&#xff0c;一…