开始
- Application 对象,表示 Excel 应用程序。
- Workbook 对象,表示工作簿对象。
- Worksheet 对象,表示工作表对象
- Range 对象,表示单元格区域对象。
- Visual Basic:打开 VBA 编辑器,快捷键是 Alt + F11
指导
注释内容:以英文单引号 (') 开头,后面接注释的内容
'我是一行注释,不会被执行
把开发工具调用出来
包含宏的代码的文件后缀是xlsm
宏安全
Excel 提供 4 种宏安全性选项,在开发工具选项卡,点击「宏安全性」按钮,打开信任中心。4 种选项具体如下
禁用所有宏,并发出通知:
默认状态下,无法运行 VBA 代码。但是 Excel 在打开包含 VBA 代码的工作簿时,在编辑栏上方,显示安全警告,并且可以选择启用代码运行或不启用。如果选择启用,下次打开相同的工作簿,不会出现警告。
添加受信任位置
把一个文件夹添加到 Excel 受信任的位置后,该文件夹下的包含 VBA 代码的工作簿打开时,不会提示安全警告,也无需每次手动开启代码。
设置方法:在开发工具选项卡,点击「宏安全性」按钮,弹出信任中心窗口,在左侧列表中,选择「受信任位置」。点击下方的「添加新位置」按钮,添加自己信任的一个文件夹。
操作
1.变量定义
语法 dim 变量名 as 数据类型(如 dim a as string) 或者 dim 变量名 标志符(如a$)
2.常见的数据类型
-1.字符串型(string 或 $)
语法:dim a as string (定义变量a作为字符串型) 或者 dim a$
-2.整数型(integer 或 %)
语法:dim a as integer (定义变量a作为整数型) 或者 dim a%
-3.长整数型(long 或 &)
语法:dim a as long (定义变量a作为长整数型) 或者 dim a&
注意:如果整数数据超过32767就用long
-4.单精度型(single 或 !)
语法:dim a as single (定义变量a作为单精度型) 或者 dim a!
注意:single 精确到小数点后6位
-5.双精度型(double 或#)
语法:dim a as double (定义变量a作为双精度型) 或者 dim a#
注意:double 精确到小数点后14位
###在 Sheet1 工作表 A1 单元格,写入 “Hello World” 内容
Sub MyCode()
Sheet1.Range("A1") = "Hello World"
'图形化显示hello world
MsgBox "Hello World"
End Sub
变量
####定义变量的时候可以不指定数据类型 Dim AAA
Dim [变量名] As [数据类型]
Dim name As String
Dim age As Integer
[变量名] = [数据] ###变量赋值
Dim name As String
name = "张三"
Range("A1") = name
######声明常量
Const [常量名] As [数据类型] = [值]
'声明 π 常量
Const Pi As Double = 3.14159
- 赋值运算符 =
- 算术运算符 + - * / 、\(取除数) 、Mod(取余) ^ -(取负)
- 比较运算符 = (等于)、> (大于)、>= (大于等于)、< (小于)、<=(小于等于)、 <>(不等于)
- 逻辑运算符 And Or Not Xor
- 连接操作符 &-连接两个文本
声明一个文本类型变量,String是类型标识符;文本需使用英文双引号表示。name = "Zhang San"
声明一个逻辑变量 : Dim isPass As Boolean
给逻辑变量赋值时,可以直接使用逻辑值,也可以使用返回逻辑值的表达式 isPass = False ; isPass = 70 >= 60
Sub ProcessRange(ByVal Target As Range) ByVal Target As Range
:当你调用这个函数或子程序时,你需要提供一个已经存在的范围对象,如选定的单元格、特定地址或一个已定义的工作表区域,作为参数传入;也就是用鼠标选择操作范围
ByVal Target As Range 是 Visual Basic for Applications (VBA) 中的一条声明语句,用于指定一个名为 Target 的变量类型为 Range。
循环
exit do '只能写在do循环里面
exit for '只能写在for循环里面
exit sub '只能写在sub循环里面
- 1. For 循
For [变量] = [初始值] To [结束值] Step [步长]
'这里是循环执行的语句
Next
#####For 至 Next i 之间的代码就是一个循环代码
#######在 A2:A10 单元格区域,依次判断每一个单元格是否为空,如果是空,则用上一个单元格的值填充
Sub MyCode()
Dim i As Integer
Dim isBlank As Boolean
For i = 2 To 10
isBlank = Cells(i, 1).Value = ""
If isBlank Then
Cells(i, 1) = Cells(i - 1, 1)
End If
Next i
End Sub
Sub Test111()
Dim i
For i = 1 To 10
Cells(i, 2) = "11" & i & "DDDDD"
Cells(i, 3).Value = "11" & i & "DD" ##这两种写法都可以
Next i
End Sub
for each 循环一般用于循环一个集合,比如一个工作表,一个工作簿,或者是一个文件夹
###显示当前工作簿的所有工作表的名称
Sub testdemo1()
Dim ws As Worksheet #定义变量类型
For Each ws In Worksheets #遍历工作表
MsgBox ws.Name '显示当前的工作表名称
Next ws
End Sub
遍历工作簿
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 Then
a.Interior.ColorIndex = 3
End If
Next a
End Sub
- 2. Do While 循环
Do While [条件表达式]
'循环执行的代码
Loop
- Do Until 循环
Do Until [条件表达式]
'循环执行的代码
Loop
Exit For 跳出 For 循环
Exit Do 跳出 Do While/Until 循环
选择语句
- If … Then 结构
If 条件表达式 Then
'表达式为真时,执行的代码
End If
- If … Else 结构
If 条件表达式 Then
'真时执行的代码
Else
'假时执行的代码
End If
- If ElseIf Else 结构
If 条件表达式1 Then
'表达式1真时,执行的代码
ElseIf 条件表达式2 Then
'表达式2真时,执行的代码
ElseIf 条件表达式3 Then
'表达式3真时,执行的代码
...
ElseIf 条件表达式n Then
'表达式n真时,执行的代码
Else
'以上表达式都不为真时,执行的代码
End If
- Select Case 结构
Select Case 变量
Case 判断条件 1
'条件 1 真时,执行的代码
Case 判断条件 2
'条件 2 真时,执行的代码
Case 判断条件 3
'条件 3 真时,执行的代码
Case Else
'之前的所有条件都不为真时,执行的代码
End Select
with语句
With 结构用于组合同一个对象的多个属性和方法,避免重复写同一个对象名,提高编程和运行效率
With [对象]
.[属性] = [数据]
.[方法]
'其他属性和方法
End With
'设置单元格字体、字号和颜色
With Range("A1").Font
.Bold = True
.Name = "微软雅黑"
.Size = 15
.Color = vbRed
End With
go to语句
使用 GoTo 结构,跳转到指定标签处运行,从而不执行 GoTo 语句和指定标签之间的代码
Sub MyCode()
Dim num1 As Double
Dim num2 As Double
Dim result As Double
num1 = 100
num2 = 0
If num2 = 0 Then GoTo error
result = num1 / num2
Exit Sub
error:
MsgBox "除数不能为零"
End Sub
常用
1. 获取各个sheet名字
#####获取Excel工作簿中所有sheet的名称,并写到当前sheet中
Sheets.Count
###统计sheet个数
Sub PrintSheetNamesToSheet()
Cells(1, 1).Value = "Name"
'print the number of sheet
MsgBox Sheets.Count
For i = 1 To Sheets.Count
Cells(i + 1, 1).Value = Sheets(i).Name
Next i
End Sub
2. sheet操作
可以声明个对象,然后用变量去操作sheet表。
Set [变量名] = [对象类型数据]
###声明工作表类型的对象
Dim sheet As Worksheet ###把变量声明成Worksheet 对象,表示工作表对象
###名称为“绩效表”的工作表,赋到 sheet 变量
Set sheet = Worksheets("绩效表") ### sheet就表示“绩效表”这个sheet表,然后用sheet就可以操作了
Dim sheet As Worksheet
Set sheet = Worksheets("绩效表")
With sheet
.Name = "旧绩效"
.Visible = False
End With
2.1 sheet显示和隐藏
Sheet5.Visible = xlSheetVeryHidden ### 第五个sheet隐藏起来
Sheet5.Visible = xlSheetVisible ### 第五个sheet显示起来
2.2 获取当前sheet的名称和位置
sheetIndex = ActiveSheet.index
sheetName = ActiveSheet.Name
MsgBox ActiveSheet.Index & " " & ActiveSheet.Name ### 打印出索引和当前在看的(上次保存退出)的sheet 名字
2.3 添加一个sheet
常用 Excel 对象
- Application 对象,表示 Excel 应用程序。
- Workbook 对象,表示工作簿对象。
- Worksheet 对象,表示工作表对象
- Range 对象,表示单元格区域对象。
'语法;;声明对象
'前期绑定声明语法
Dim [变量名] As [对象类型]
'后期绑定声明语法
Dim [变量名] As Object
'实例
Dim sh As Worksheet
Dim car As Object
#####创建新sheet并重命名
Sub PrintSheetNamesToSheet()
Dim w2 As Worksheet
Set w2 = Worksheets.Add
w2.Name = "jisuanji22"
w2.Cells(1, 1) = "new"
End Sub
2.4 修改某个sheet内容
Sub PrintSheetNamesToSheet()
Dim w2 As Worksheet
Set w2 = Worksheets("Sheet2")
w2.Cells(1, 1) = "s2"
End Sub
或者
Sheets("jisuan").Cells(1, 2) = "hello" ##指定sheet名字,进行赋值
2.2 获取当前sheet的名称和位置
2.2 获取当前sheet的名称和位置
3. 获取最后一行行号
#####获取当前打开的sheet 一共多少行内容
Dim sheetIndex As Integer
lastRow = Sheets(ActiveSheet.Name).UsedRange.Rows.Count
MsgBox lastRow
4. 指定行插入一行空行
Sheets(ActiveSheet.Name).Rows(3).Insert
###当前sheet 第三行插入一个空行
5. 删除多行
Sheets(ActiveSheet.Name).Rows("3:4").Delete
###删除当前sheet 第三至第四行
Sheets(ActiveSheet.Name).Rows("3").Delete
###删除当前sheet 第三行;下一行会上移
Sheets(ActiveSheet.Name).Range("A2:B3").Clear
###清空当前sheet A2:B3的内容;单元格还在
Sheets(ActiveSheet.Name).Range("A2:B3").ClearContents
###清空当前sheet A2:B3的内容;单元格还在
6. 单元格操作
6.1 当前sheet单元格操作
Sub PrintSheetNamesToSheet()
Cells(1, 1).Value = "Name" ##方式一,第一行第一列单元格值是Name
Dim s As String
s = "Hello World"
Range("A2").Value = s ##方式二,第一行第二列单元格值是Hello World
Range("A2").Interior.Color = 49407 ##单元格填充橙色
Cells(1, 1).Interior.Pattern = xlNone ##清空单元格颜色
Cells(1, 3).Interior.Color = vbGreen ##设置单元格填充颜色 vbRed vbBlack
Rows(1).HorizontalAlignment = xlRight ##整行设置成右对齐
End Sub
###########设置单元格字体、字号和颜色
With Range("A1").Font
.Bold = True
.Name = "Times New Roman"
.Size = 15
.Color = vbRed
End With
######写数字表示行;写字母表示列
Rows("2:3") 第二行至第三行
Range("4:5,7:8") 第4行至第5行,第7至第8
Columns(1) 第1列
Columns("b:c") 第b-c列
Range("d:e,g:h") 第d列至第e列,第g至第h
6.2 不同sheet单元格
Sheet2.Cells(1, 1) = "hello" ##第二个sheet表中第一行第一列插入数值
Sheets("jisuan").Cells(1, 2) = "hello" ##指定sheet名字,进行赋值
Sheets("jisuan").Sheets(1).Cells(row01, 1).RowHeight = 40 ##'设置单元格行高
Sheets("jisuan").Sheets(1).Cells(row01, 1).ColumnWidth = 40 ##'设置单元格列宽
Sheets("jisuan").Sheets(1).Cells(row01, 1).Font.Size = 24 ##'设置字体大小
Sheets("jisuan").Sheets(1).Cells(row01, 1).Font.Name = "Times New Roman" ##'设置字体类型
Sheets("jisuan").Sheets(1).Cells(row01, 3).Font.Color = vbRed ##'设置字体颜色
Sheets("jisuan").Sheets(1).Cells(row01, 3).Font.Bold = True ##'设置字体加粗
Sheets("jisuan").Sheets(1).Cells(row01, 3).Font.Italic = True ##'设置字体倾斜
Sheets("jisuan").Sheets(1).Cells(row01, 1).HorizontalAlignment = xlCenter ##'设置水平对齐方式,类型有xlLeft,xlRight,xlLeft
Sheets("jisuan").Sheets(1).Cells(row01, 1).VerticalAlignment = xlCenter ##'设置垂直对齐方式
Sheets("jisuan").Sheets(1).Cells(row01, 1).Borders.LineStyle = xlContinuous ##'设置边框类型为实线,全框
Sheets("jisuan").Sheets(1).Cells(row01, 1).Borders.Color = RGB(0, 0, 0) ###'设置边框颜色
6.3 判断单元格是否为空
1. Cells(1, 1) = "" 或 Range("A1")= ""
2. Len(Cells(1, 1)) = 0 或Len(Range("A1"))= 0
3. Cells(i, 1) = vbNullString 或Range("A1")= vbNullString
4. Application.WorksheetFunction.CountBlank(Cells(1,1))
5. 为了防止单元格中有空格,可以使用:
Len(Trim(Cells(i, 1))) = 0
Len函数是返回字符个数,结果是自然数,所以所有的都满足<>""。就改为,以下几种:
If Len(Sheets("sheet1").Cells(i, 10)) <> 0 Then
If Sheets("sheet1").Cells(i, 10) <> "" Then
If not istmpty(Sheets("sheet1").Cells(i, 10)) Then
7. 图形化输入
Length = InputBox("please input", "dddd")
ddd 是输入框头
please 是提示
Sub PrintSheetNamesToSheet()
Add = InputBox("please add Overtime hours(h)", "Overtime hours")
b = Split(Add, ",")
Cells(7, 3) = b(0)
Cells(8, 3) = b(1)
End Sub
Sub PrintSheetNamesToSheet()
Dim note01 As String
Dim num01 As String
note01 = "please input data"
name01 = Application.InputBox(prompt:=note01, Title:=note01)
End Sub
8. 函数/Sub调用
8.1 函数调用
Sub AAA()
Dim x, y, z
x = Cells(1, 1)
y = Cells(1, 2)
z = Summary(x, y)
Cells(1, 3) = z
End Sub
Function Summary(a, b)
Summary= a + b
End Function
8.2 Sub调用
用Call
Sub BBBB()
Dim x, y, z
x = Cells(1, 1)
y = Cells(1, 2)
Call SummaryA(x, y)
End Sub
Sub SummaryA(a, b)
Cells(1, 3) = a + b
End Sub
内置函数
Format:格式化数据,并以文本类型返回
InStr:返回指定字符的位置
InStrRev:反方向返回指定字符位置
Left:返回左侧指定长度文本
Len:返回文本长度
LCase:大写字母转换成小写字母
LTrim:清除开头的空格
Mid:返回指定的开始和结束位置之间的文本
Replace:替换文本中的指定字符
Right:返回右侧指定长度文本
RTrim:清除末尾处的空格
Space:返回指定重复数的空格文本
StrComp:返回比较两个文本的结果
StrConv:将文本转换成指定格式
String:返回指定重复数的文本
StrReverse:逆转提供的字符串
Trim:清除开头和结尾处的空格
UCase:将小写字母转换成大写字母
=COUNTIF(A:A,"Y") ###统计a列中有多少个Y
- contains字符串是否包含
Sub PrintSheetNamesToSheet()
If InStr(Range("A2").Value, "zhangsan") <> 0 Then
MsgBox "11111"
Else
MsgBox "2222"
End If
End Sub
######方式二
str = "Hello World"
substring = "llo"
result = InStr(str, substring)
If result > 0 Then
MsgBox "字符串包含指定的子字符串"
Else
MsgBox "字符串不包含指定的子字符串"
End If
######方式三
str = "Hello World"
substring = "*llo*"
result = str Like substring
If result Then
MsgBox "字符串包含指定的子字符串"
Else
MsgBox "字符串不包含指定的子字符串"
End If
- 字符串截取
####'提取第二个字符开始之后的3个字符
Sub PrintSheetNamesToSheet()
MsgBox Mid(Cells(2, 1).Value, 2, 4)
End Sub
MsgBox Left(Cells(2, 1).Value, 1)
###//获取第二行第一列字符串的首字符
功能
检索工具
sheet1中存放原始数据,在sheet2 写入要搜索的内容,结果写到sheet3
Dim sht1 As Worksheet, sht2 As Worksheet, sht3 As Worksheet
Dim maxRow1 As Integer, maxRow2 As Integer, maxRow3 As Integer
Set sht1 = ThisWorkbook.Sheets("sheet1_name") ###下面调用就可以用sht1代替
Set sht2 = ThisWorkbook.Sheets("sheet2_name")
Set sht3 = ThisWorkbook.Sheets("sheet3_name")
####第一个sheet的第一行行数
maxRow1 = sht1.Cells(Rows.Count, 1).End(xlUp).Row
####第一个sheet的第2行行数
max1Row2 = sht1.Cells(Rows.Count, 1).End(xlUp).Row
####第2个sheet的第一行行数
maxRow2 = sht2.Cells(Rows.Count, 1).End(xlUp).Row
####第3个sheet的第一行行数
maxRow3 = sht3.Cells(Rows.Count, 1).End(xlUp).Row
sht3.Rows("2:" & maxRow3).ClearContents '清空【结果表】上次留存结果,保留抬头行
################正式代码
Sub SearchContentToSheet()
Dim sht1 As Worksheet, sht2 As Worksheet, sht3 As Worksheet
Dim maxRow1 As Integer, maxRow2 As Integer, maxRow3 As Integer
Set sht1 = ThisWorkbook.Sheets("Sheet1")
Set sht2 = ThisWorkbook.Sheets("Sheet2")
Set sht3 = ThisWorkbook.Sheets("Sheet3")
maxRow1 = sht1.Cells(Rows.Count, 2).End(xlUp).Row
maxRow2 = sht2.Cells(Rows.Count, 1).End(xlUp).Row
maxRow3 = sht3.Cells(Rows.Count, 1).End(xlUp).Row
sht3.Rows("2:" & maxRow1).ClearContents
For k = 1 To maxRow2
Search_Key = sht2.Cells(k, 1).Value
For i = 2 To maxRow1
Orgi_Key = sht1.Cells(i, 1).Value
result = InStr(Orgi_Key, Search_Key)
If result > 0 Then
sht3.Rows(k) = sht1.Rows(i).Value
End If
Next
Next
End Sub
选择的数据颜色标记
1. 鼠标选择的地方,字体都会标记绿色
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Target.Font.Color = vbGreen
End Sub
If Target.Count > 1 Then Exit Sub ##当选中的单元格超过1个,就是退出这个函数,即Exit Sub
Dim rng As Range ##定义rng为一个Range,Range可表示一个单元格、一行、一列或者包含一个或多个连续单元格块的选择
If Target.Count = 1 And Target <> "" Then ##当选中的单元格为1个,且(AND代表条件“与”)选中单元格值不为空(“<>”表示不等于)
2. 鼠标选择的地方,单元格都会标记红色
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Target.Font.Color = vbGreen
Target.Interior.ColorIndex = 3
End Sub
Target.Value ## 单元格内容
3. 鼠标选择的单元格对应的行和列进行高亮
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Cells.Interior.Pattern = xlNone ##清除颜色
Selection.EntireRow.Interior.ColorIndex = 3 ##行颜色是红色
Selection.EntireColumn.Interior.ColorIndex = 4 ##列颜色是绿色
End Sub
4. 鼠标点哪,哪一行高亮成红色,5s后再恢复成原先的颜色
Dim TarGett_AA As Integer
Sub Worksheet_SelectionChange(ByVal Target As Range)
TarGett_AA = Target.Interior.ColorIndex ##获取单元格颜色
Selection.EntireRow.Interior.Pattern = xlNone
Selection.EntireRow.Interior.ColorIndex = 3
Application.Wait Now + TimeValue("00:00:5")
If TarGett_AA >= 0 Then
Selection.EntireRow.Interior.ColorIndex = TarGett_AA
End If
End Sub
5. 鼠标点哪,哪个区域高亮,5s后再恢复成原先的颜色
Dim TarGett_AA As Integer, Col_Num As Integer
Sub Worksheet_SelectionChange(ByVal Target As Range)
TarGett_AA = Target.Interior.ColorIndex
Target_Index = Target.Address(0, 0) ##获取单元格的名称C4或者A1:C6
Target_Row_Index = ActiveCell.Cells.Row ##获取选中单元格的行编号 数值
Target_Col_Index = Target.Column ##获取选中单元格的列编号 数值;也可也这么写ActiveCell.Cells.Column
Range(Target_Index).Interior.ColorIndex = 3 ##选中范围,背景改为红色
Application.Wait Now + TimeValue("00:00:5") ##停5s
If TarGett_AA >= 0 Then
Range(Target_Index).Interior.ColorIndex = TarGett_AA
Else
Range(Target_Index).Interior.Pattern = xlNone
End If
End Sub
#Cells.EntireRow.Interior.Pattern = xlNone
#Selection.EntireRow.Interior.Pattern = xlNone
#Selection.EntireRow.Interior.ColorIndex = 3
#Selection.EntireRow.Interior.ColorIndex = TarGett_AA
#Selection.EntireRow.Interior.Pattern = xlNone
Range("B2:E6")(3).Select
: 选取B2:E6区域中的第三个单元格,即D2; 单元格的区域的读取一般是从左到右,然后再从上到下进行读取的,故该区域的前3个单元格分别是B2、C2、D2,而第3个单元格就是为D2。
常见问题
编写代码出现"请注意 文档的部分内容可能包含文档检查器无法删除的个人信息"
解决方案:禁止显示 Application.DisplayAlerts = False
恢复显示Application.DisplayAlerts = True
word处理
关闭屏幕刷新 Application.ScreenUpdating = False
禁止显示请注意 Application.DisplayAlerts = False
Dim WordApp As Object
Set WordApp =CreateObject("Word.Application") '新建Word对象
Wordapp.Visible = True '可见
'Wordapp.ScreenUpdating =False '屏幕刷新
Dim WordD As Word.Document '定义word类
Set WordD = Wordapp.Documents.Add '新建文档
'Set WordD = Wordapp.Documents.open(filename) '打开文档
'……
WordD.Close '关闭文档
Set WordD = Nothing
WordApp.Quit '退出Word对象
Dim MyDialog As FileDialog, vrtSelectedItem As Variant, Doc As Document
Dim NewName As String, thisPath As String
'定义一个文件夹选取对话框
Set MyDialog = Application.FileDialog(msoFileDialogFilePicker)
With MyDialog
.Filters.Clear '清除所有文件筛选器中的项目
.Filters.Add "所有 WORD 文件", "*.doc", 1 '增加筛选器的项目为所有WORD文件
.AllowMultiSelect = True '允许多项选择
If .Show = -1 Then '确定
myPas = InputBox("请输入替换成的编号:")
Application.ScreenUpdating = False
Set Doc = Nothing '释放变量