- 1.特殊的三类对象
- 2.单元格对象
- 2.1 单元格对象的引用方式
- 2.2 单元格对象的常用属性
- Range.Offset
- Range.CurrentRegion
- Range.Text和Range.Value
- 2.2.6 Range.HorizontalAlignment和Range.VerticalAlignment
- 2.2.7 Range.RowHeight和Range.ColumnWidth
- 2.2.8 Range.Validation
- 2.2.8 Range.Formula及Range.HasFormula
- 2.2.8 Range.Address
- 2.2.9 Range.Comment
- 2.2.10 Range.Font
- 2.2.11 Range.Interior
- 2.2.12 Range.Borders()和Range.BorderAround方法
- 2.2.13 Range.Locked
- 2.2.14 Range.Row/Column & Range.EntireRow/EntireColumn
- 2.2.15 Range.MergeCells
- 2.3 单元格对象的常用方法
- 3.工作表对象
- 6.常用的函数
1.特殊的三类对象
Name对象
Worksheet
、Workbook
和Application
对象都有Name对象;- Worksheet级的Name对象通过Worksheet、Workbook和Application都可以访问;
Workbook级的Name对象通过Workbook和Application可以访问,通过Worksheet不可访问;
Activesheet对象
Range对象
Application.Range
:有且只有一个,即为活动工作表下的活动单元格;Worksheets.Range
:为工作表下的所有单元格;
2.单元格对象
2.1 单元格对象的引用方式
Range方式
- Range方式可以以一个字符串的方式引用一个单元格或区域。如:
Range("A1")
、Range("A1:B6")
- Range方式也可以添加变量,但一般添加行变量,列变量不太容易添加,如:
Range("A" & i)
Range可以联合Cells方式获得一个区域,如:
Range(Cells(1, 1), Cells(6, 6))
。此时,cells中可以引入参数,从而实现Range方式行列都可引入参数 :::info 特别注意:Range中,隔开的不是非连续区域,而是一个最大的连续区域 :::Public Sub test()
Range("A1:C9", "E1") = 1
End Sub
Range若要选择不连续区域,应在一个字符串内用,隔开。如:
Range("A1:B5,C1:F5,G1")
-
Cells方式
引用方式为Cells(行号,列号),其中行号和列号都为数字。如:
Cells(3,2)
;- 可以引入行、列两个变量,
Cells(i,j)
-
[ ]方式
[ ]方式可以直接引用单元格、区域和不连续区域,如:
[A1]
、[A1:B5]
、[A1:B5,D9]
-
2.2 单元格对象的常用属性
Range.Offset
Range.Offset(a,b)
为Range区域偏移a行(向下偏移a行),同时偏移b列(向右偏移b列)后的新区域 偏移后的区域大小和range本身大小一致;
- 参数a、b可以为负数。a、b为负数时分别代表向上和向左偏移; :::info 这里的a,b为偏移数,不包含本身单元格。1代表移动一个单元格。 ::: ```vbnet Public Sub Offset_演示()
Range(“A1:B5”).Select Stop Range(“A1:B5”).Offset(3, 2).Select
End Sub

<a name="sS7vM"></a>
### Range.Resize
`Range.Resize(a,b)`为重新获取新的Range区域。获得的新区域为以原来Range左上角为顶点,向下包含a行,向右包含b列所组成的区域
1. 参数a、b可以为负数。a、b为负数时分别代表向上延伸和向左延伸;
:::info
这里的a,b为最终Range的行列数,即都为1时就是原Range区域的左上角单元格
:::
```vbnet
Public Sub resize_演示()
Range("A1:B5").Select
Stop
Range("A1:B5").Resize(8, 4).Select
End Sub
Range.CurrentRegion
Range.CurrentRegion
属性没有参数。结果返回包含原range区域或range区域内,已经被使用的连续区域
- 若range区域附近没有连续区域则,返回range区域本身;
- 若range区域内包含了已使用区域和未使用区域,则只返回已经被使用的区域 ```vbnet ‘若本案例中A1:B2被使用,其他单元格均未被使用
Public Sub CurrentRegion_演示()
Debug.Print Range(“A1:C4”).CurrentRegion.Address
End Sub
结果返回值为:$A$1:$B$2
<a name="CtXmd"></a>
### Range.End
`Range.End(Direction)`函数返回一个range对象。即**已经被使用的第一个**或**连续被使用的最后一个**单元格
1. 范围的区域仅有两种状态,即已经被使用的单元格与未被使用的单元格;
2. 界定已经被使用的第一个或连续被使用的最后一个单元格方式为看源Range属于哪一类。若Range为已经被使用得单元格,就从range按照Direction方向找到连续被使用的最后一个单元格。如果Range为未被使用得单元格,则在该方向找到第一个被使用的单元格。若果以上条件都无法满足,返回Direction方向的边界单元格。
3. 若range本身就在边界时结果较为混乱
4. 本质与`CTRL+方向键`效果一致

```vbnet
'代码中单元格内容如上图,A16以下单元格全未使用
Public Sub end_演示()
Debug.Print Range("A1").End(xlDown).Address '结果为:$A$3
Debug.Print Range("A2").End(xlDown).Address '结果为:$A$3
Debug.Print Range("A3").End(xlDown).Address '结果为:$A$6
Debug.Print Range("A4").End(xlDown).Address '结果为:$A$6
Debug.Print Range("A5").End(xlDown).Address '结果为:$A$6
Debug.Print Range("A6").End(xlDown).Address '结果为:$A$16
Debug.Print Range("A65536").End(xlUp).Address '结果为:$A$16
End Sub
Public Sub test()
'直接给定该列最后一个单元格地址Range("A65536")
'这样做的缺点是通用性不好,在07版中最大列数为1048576,可能A65536列是一个被使用的单元格
'如果直接使用Range("A1048576"),代码在03版本中运行会出现兼容错误
Debug.Print ActiveSheet.Range("A65536").End(xlUp).Address '结果为:$A$16
End Sub
Public Sub test()
'通过计算最大行数来确定Range单元格地址,解决代码兼容性
Debug.Print ActiveSheet.Rows.Count '07及以后版本中结果为:1048576 03版本中结果为:65536
Debug.Print ActiveSheet.Range("A" & ActiveSheet.Rows.Count).End(xlUp).Address '结果为:$A$16
End Sub
Range.Text和Range.Value
Range.Text
和Range.Value
的内容大部分情况下是一致的,但也有以下不同:
Range.Text
是单元格内的显示样式,看到什么样子就显示什么样子;Range.Value
是输入栏中的内容;- 当Range是一个单元格区域时,
**Range.Text**
的数据类型变为Null,不可用;而**Range.Value**
的数据类型变为Variant(),是一个变体数组; - 如果省略默认为
Range.Value
Public Sub test()
[B1].text '结果为:########
[B1].value '结果为:2022/5/4
End Sub
2.2.6 Range.HorizontalAlignment和Range.VerticalAlignment
Range.HorizontalAlignment
为单元格内容的水平对其方式Range.VerticalAlignment
为单元格内容的垂直对其方式-
2.2.7 Range.RowHeight和Range.ColumnWidth
Range.RowHeight
为单元格行高Range.ColumnWidth
为单元格列宽- 由于excel计算行高和列标准不一致,所以即便设置了相同行高和列宽最终单元格也不是正方形 ```vbnet Sub 行高列宽()
‘行高列宽设置一致结果为长方形 Range(“A1”).RowHeight = 20 Range(“A1”).ColumnWidth = 20
End Sub
Sub 行高列宽正方形()
‘以下参数结果为正方形 Range(“A13”).RowHeight = 28.2 Range(“A13”).ColumnWidth = 4.33
End Sub

4. VBA中有专门的属性确定使用英寸单位还是厘米单位
1. `Application.CentimetersToPoints(x)`
2. `Application.InchesToPoints(x)`
```vbnet
Sub RngToPoints()
'用cm作为单位
With Range("A1")
.RowHeight = Application.CentimetersToPoints(2)
.ColumnWidth = Application.CentimetersToPoints(1.5)
End With
'用英寸作为单位
With Range("A2")
.RowHeight = Application.InchesToPoints(1.2)
.ColumnWidth = Application.InchesToPoints(0.3)
End With
End Sub
2.2.8 Range.Validation
Range.Validation
是设置区域数据有效性的属性,不用记忆代码过程,可以通过录制宏产生
- 判断一个单元格是否有数据有效性的方法
Range.Validation.Type
。Range.Validation.Type
返回一个数字就代表该单元格有数字有效性,并且可以通过返回的数字类型判断出是哪种数据有效性。如果无数据有效性报错
如果担心
Range.Validation.Type
出现报错,可以是用on error resume next
语句将错误代码跳过。因为错误是一个对象 ```vbnet Sub 判断数据有效性() On Error Resume Nexts = [A2].Validation.Type ‘这里一定要注意,必须要将 [A2].Validation.Type赋值给一个变量.并用这个变量判断是否为空.因为报错不等 空,但赋值给变量时,变量为空 If s <> “” Then
Debug.Print "有数据有效性"
Else
Debug.Print "没有数据有效性"
End If
End Sub
3. `Range.Validation.delete`和`Range.Validation.add`
1. **如果原来单元格的数据有效性不删除,添加新数据有效性时报错。所以,一般添加数据有效性时,先删除原有的数据有效性**
2. 可以发送alt+方向下按键指令展开下拉菜单`Application.SendKeys "%{down}"`
```vbnet
Sub 添加数据有效性()
' 添加数据有效性
With [A1:A10].Validation
.Delete '删除原来的有效性
.Add Type:=xlValidateList, Formula1:="1,2,3,4" '添加新的有效性,添加时尽量使用:=方式给参数赋值
End With
End Sub
:::info
特别注意:
在添加数据有效性的代码中,Range.Validation.Add中的参数使用参数赋值x:=a形式不容易报错
:::
2.2.8 Range.Formula及Range.HasFormula
Range.Formula
是在单元格中直接录入公式的属性
- 这个属性也可以通过录制宏得到。但一般不用,因为通过录制宏方式得到的代码为R1C1引用样式结果,不便于公式理解;
可以直接写公式样式。在这里可以实现公式字符串拼接
Sub 写入公式()
Dim r As Range
Set r = Range("XFD1").End(xlToLeft)
r.Select
s = r.Address()
Range("C2").Formula = "=sum(A" & s & ")" 'sum(A)
End Sub
Range.HasFormula
是用于判断单元格内是否有公式。有公式返回True,否则返回False2.2.8 Range.Address
Range.Address
可以显示出单元格地址的属性。Range.address(RowAbsolute,ColumnAbsolute)
其中RowAbsolute,ColumnAbsolute
参数为1或默认时,返回结果为绝对引用。为0时为相对引用2.2.9 Range.Comment
Range.Comment
是单元格的批注,是一个可读可写属性。如果range中没有批注,则返回
Nothing
其他的相关属性和方法
Range.ClearComments
清除批注Range.Comment.Visible
批注可见性。False为不可见,True为可见Range.Comment.Text(Text)
文字批注内容Range.Comment.Shape
批注中的形状(包含图片)Range.Comment.Shape.Fill.UserPicture(图片路径)
利用图片路径填充图片Range.Comment.Shape.Height
图片高度Range.Comment.Shape.Width
图片宽度2.2.10 Range.Font
Range.Font
是单元格的字体对象。其内部有较多有关字体的属性,其中包含.Name
、.Size
、.Underline
、.Color
、.Bold
等属性。不用记忆,可通过录制宏的到2.2.11 Range.Interior
Range.Interior
是单元格的背景对象。其中属性主要包含.Pattern
、.PatternThemeColor
、.Color
、.PatternTintAndShade
等,不用记忆,可通过录制宏的到2.2.12 Range.Borders()和Range.BorderAround方法
Range.Borders()
为单元格边框对象。其中包含属性主要有.LineStyle
、.Weight
、.Color
Range.Borders()
的括号需要加上,当括号内没有没内容时,是指代所有边框(外部+内部);也可以在
Range.Borders()
的括号中指定特殊位置的边框对象Range.Locked=True
相当于选择了锁定
2.2.14 Range.Row/Column & Range.EntireRow/EntireColumn
Range.Row/Column
属性返回range的行号/列号
Rows(Range.Row)
返回Range所在行的一整行,但仅能引用一个整行。Range.EntireRow
返回Range区域包含的所有行,可以是多行。2.2.15 Range.MergeCells
Range.MergeCells
用于判断Range中是否包含合并单元格的属性。为一个可读属性结果为False:Range区域中无任何合并单元格区域
- 结果为True:Range区域中都是合并单元格区域
结果为null:Range区域中既有合并单元格区域也有未合并区域
2.3 单元格对象的常用方法
2.3.1 Range.Select
Range.Select
为选中range的区域使用select方法选择单元格区域后,其中的ActiveCell为Range区域的左上角单元格
- 使用select方法选择区域的时候必须保证被选择的表为活动工作表,若用select方法选择一个非活动工作表的区域将报错 ```vbnet ‘若工作簿中有”最终汇总”工作表、”Sheet1”工作表和”Sheet2”工作表
Public Sub activate演示()
Worksheets(“最终汇总”).Range(“A1:C4”).Select
End Sub
:::info
若"最终汇总"工作表为活动工作表时,运行以上代码正常A1:C4区域被选择<br />若"Sheet1"工作表为活动工作表时,运行以上代码后报错
:::
<a name="UIG7t"></a>
### 2.3.2 Range.SpecialCells
`Range.SpecialCells(Type,Value)`方法为定位符合条件的单元格
1. 一般不用记参数,所有参数可以通过录制宏录制
2. Range如果为一个单元格就是对整个表进行定位操作 , 如果为一个区域就是在这个区域内定位;
<a name="gSUZh"></a>
### 2.3.3 Range.Find
`Range.Find (What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)`方法用于寻找符合条件的单元格
1. 返回值为符合条件的第一个单元格,如果未发现匹配项,此方法返回 **Nothing**并报错。一般判断语句为:`If rng Is Nothing`、`If NOT rng Is Nothing`
2. 使用`Range.[FindNext](https://learn.microsoft.com/zh-cn/office/vba/api/excel.range.findnext) `和 `Range.[FindPrevious](https://learn.microsoft.com/zh-cn/office/vba/api/excel.range.findprevious) `**方法**可重复搜索。当搜索到达指定的搜索区域末尾时,它会绕到该区域开头位置。
> 若要在发生此绕回时停止搜索,需保存第一个找到的单元格的地址,然后将此后搜索到地址和保存的第一个地址对比,若相同停止搜索。
```vbnet
Sub 宏3()
Dim i, j, rng As Range
Set rng = Selection.Find(What:="孙*", After:=Selection(1)) '此处需要使用Selection(1)作为区域的第一个单元格
'如果没有符合条件的直接弹框
If rng Is Nothing Then
MsgBox "没有符合条件的结果!"
End
End If
'激活被找到的单元格,作为下一次查找的After参数
Selection.Find(What:="孙*", After:=[F1]).Activate
'更改单元格颜色
With ActiveCell.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
'由于循环查找会无休止循环,所以需要记录第一次没找到的单元格地址,做为循环终止条件
j = Selection.Find(What:="孙*", After:=[F1]).Address
'开始循环查找
For i = 1 To Cells.Rows.Count
'循环终止条件
If Selection.FindNext(After:=ActiveCell).Address = j Then '注意Range.FindNext方法的使用
Exit For
End If
Selection.FindNext(After:=ActiveCell).Activate
With ActiveCell.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Next
End Sub
- 此方法不用记忆参数,所有功能可以通过录制宏得到;
- 若
Range.Find
中的Range为Cells为搜索整个工作表; -
2.3.4 关于Range的清除方法
Range.Clear
清空Range区域内的所有内容,包括格式;Range.ClearFormats
仅清空Range区域内的格式。其中包括单元格颜色边框等格式,也包括内容的显示格式。如日期格式会变成数字;Range.ClearContents
仅清空Range区域的单元格内容,但保留所有格式;2.3.5 Range.Copy
Range.Copy (Destination)
为复制单元格或区域,并粘贴至Destination的方法,相当于CTRL+C、CTRL+V若
Destination
参数省略,仅复制至剪切板;- 可以直接通过
**Destination**
参数粘贴至非活动工作簿或工作表中,不用像用**WorkSheet.Paste**
方法一样需要激活工作表并选择被粘贴的单元格 ```vbnet ‘复制C1:E5的内容,粘贴至Sheet2工作表的A1
Sub Copy方法演示()
Range(“C1:E5”).Copy Destination:=Worksheets(“Sheet2”).Range(“A1”) ‘不用激活工作表,直接路径指定即可
End Sub
```vbnet
'WorkSheet.Paste方法粘贴至其他工作表
Sub copy_paste演示()
Range("C10:E14").Copy
Worksheets("7777").Activate '激活工作表
Range("C1").Select '选择粘贴的单元格
ActiveSheet.Paste '执行粘贴
End Sub
2.3.6 Range.PasteSpecial
Range.PasteSpecial(Paste, Operation, SkipBlanks, Transpose)
为选择性粘贴,不用记参数,可以通过录制宏得到
Range.PasteSpecial
方法仅用于选择性粘贴,需要在其之前搭配Range.Copy
方法使用- 四个参数对应下表的四个区域
2.3.7 Range.Merge/ Range.UnMerge
Range.Merge
为单元格合并的方法。Range.UnMerge
为解除单元格合并的方法
一般情况下,单元格合并时容易弹出对话框。所以一般用
Application.DisplayAlerts
属性先关闭弹框 ```vbnet Sub 合并相同单元格()Application.DisplayAlerts = False
Dim i, rng As Range
Set rng = Range(“A3:A16”)
i = 3 For Each r In rng.Resize(rng.Rows.Count + 1) ‘此处务必须要在原来区域基础上向下延伸一个单元格,否则最后的相同区域无法合并
If r.Value <> Cells(i, 1).Value Then
Range(Cells(r.Row - 1, 1), Cells(i, 1)).Merge
i = r.Row
End If
Next
Application.DisplayAlerts = True
End Sub
```vbnet
Sub 合并单元格的打散()
Application.DisplayAlerts = False
Dim i, rng As Range
Set rng = Range("A3:A16")
rng.UnMerge
For Each r In rng
If r.Value = "" Then
r.Value = Cells(i, 1).Value
Else
i = r.Row
End If
Next
Application.DisplayAlerts = True
End Sub
3.工作表对象
3.1 工作表对象的引用方式
使用系统自定的名称(大名)引用,如:
Workbooks("汇总").Worksheets(Sheet1)
此方式常用,因为系统自定的工作表名称不会随着name属性更改,也不会随着位置属性更改
使用对象名称(小名)引用:如:
Workbooks("汇总")
使用对象的索引号引用,如:
Worksheets(2)
索引号同样为系统自动生成,但是和工作表的位置相关 索引号为可见工作表的排列顺序
父对象的引用方式,如:
ActiveCell.Parent
3.2 工作表对象的常用属性
3.2.1 Sheet.UsedRange
Sheet.UsedRange
返回工作表对象中已经被使用的区域。已经被使用的区域定义为能够包含所有被使用单元格的最小矩形连续区域
- 即便的当前激活的工作表,Sheet也不能省略 ```vbnet Public Sub function_UsedRange()
ActiveSheet.UsedRange.Select
End Sub

<a name="UZ7JP"></a>
## 3.3 工作表对象的常用方法
<a name="jGBCk"></a>
### 3.3.1 WorkSheet.Activate
`WorkSheet.Activate`为激活工作表,也可以用Activate方法激活单元格或工作簿
```vbnet
Public Sub activate演示()
Worksheets("最终汇总").Activate
Worksheets("最终汇总").Range("A1:C4").Select
End Sub
3.3.2 WorkSheet.Select
WorkSheet.Select
为选择工作表,也可以用select方法选择单元格
.Select
方法和.Activate
方法区别仅能粘贴在活动工作簿的活动工作表下的被选择单元格;
- 工作簿工作表需要分别先激活,激活后用
select
方法选择单元格 ```vbnet ‘粘贴至其他工作表
Sub 宏6()
Range("C10:E14").Copy
Worksheets("7777").Activate '激活工作表
Range("C1").Select '选择粘贴的单元格
ActiveSheet.Paste '执行粘贴
End Sub
<a name="T6fPF"></a>
### 3.3.4 WorkSheet.Protect/Unprotect
`WorkSheet.Protect(Password)`给worksheet加锁<br />`WorkSheet.Unprotect(Password)`给worksheet解锁
1. 特别注意,加锁之前需要先运行`Range.Locked = True`
<a name="pFp4e"></a>
# 4.工作簿对象
<a name="Yr7MB"></a>
# 5.应用程序对象
应用程序对象为在VBA中输入Application.后出现方法或属性
<a name="iyKr8"></a>
## 5.1 应用程序对象的属性
1. 由于属性是应用程序级别,若确实需要更改,在代码中一般成对存在(即先关闭,再打开),否则影响程序功能;
2. 或者放入条件中,条件满足时关闭,不满足时打开
<a name="qPoGV"></a>
### 5.1.1 控制对话框弹出的属性
`Application.DisplayAlerts`为控制对话框弹出的属性,保证代码运行不因对话框弹出而中断
1. `Application.DisplayAlerts`值为False时,任何对话框都不弹出,反之正常弹出;
2. `Application.DisplayAlerts = False`和`Application.DisplayAlerts = True`一般成对存在;
```vbnet
Application.DisplayAlerts = False
pass
Application.DisplayAlerts = True
5.1.2 复制粘贴后复制区域的虚线框
Application.CutCopyMode = False
可以取消复制粘贴后复制区域的虚线框
5.1.3 控制单元格拖放及下拉的属性
Application.CellDragAndDrop
可控制单元格拖放及下拉
Application.CellDragAndDrop=False
禁用下拉,Application.CellDragAndDrop= True
启用下拉 ```vbnet ‘指定名称的工作表禁用单元格拖放及下拉
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.Name = "xxx" Or Sh.Name = "1111" Or Sh.Name = "Sheet1" Then '用于判断工作表名称
Application.CellDragAndDrop = False '符合条件禁止下拉
Else
Application.CellDragAndDrop = True '不符合条件允许下拉,此处必须要做判断,否则整个工作簿都不下拉
End If
End Sub
```vbnet
'以上代码中对于工资表名称的判断写法较为复杂,可简化
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim s As String
s = ",xxx,1111,Sheet1," '设定不能修改表的名称集合,且用逗号作为占位符,原因是为了未来匹配",XXXX,",这样不会出现名称包含错误
If Not VBA.InStr(s, "," & Sh.Name & ",") Is Nothing Then '将工作表名称构建成",XXXX,"的样式,用instr函数查找
Application.CellDragAndDrop = False
Else
Application.CellDragAndDrop = True
End If
End Sub
5.1.4 调用工作表函数的属性
Application.WorksheetFunction.函数名(参数)
5.1.5 获得交叉区域的属性
Intersect(Range1, Range2,...)
获得Range1, Range2区域的交叉区域。
- 如果没有交叉区域返回
Nothing
- 代码中
me
表示当前对象 ```vbnet ‘在工作表的使用区域内开启高亮灯
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Me.UsedRange) Is Nothing Then Cells.Interior.Color = xlNone Intersect(Rows(Target.Row), Range(“A1:G13”)).Interior.Color = 666 ‘Rows(Target.Row)可以换成Target.EntireRow Intersect(Columns(Target.Column), Range(“A1:G13”)).Interior.Color = 666 End If
End Sub
<a name="JXg9G"></a>
### 5.1.6 自动计算的属性
`Application.Calculation`返回当前计算模式的属性。对于超大计算量的更改来说一般先关闭自动计算,所有代码运行完毕后开启。
1. 返回值情况
1. `xlCalculationAutomatic`或 `-4105`:自动计算
2. `xlCalculationManual` 或`-4135`:手动计算
<a name="GZcuN"></a>
### 5.1.7 单元格自身对象
`Application.ThisCell`
<a name="AOSMx"></a>
### 5.1.7 单元格自身对象
`Application.Volatile` 自动计算
加载宏<br />split函数
<a name="JAsfn"></a>
## 5.2 应用程序对象的方法
所有应用程序对象方法都能通过`Appllication.`引用出。如果不显示,按ctrl+j
<a name="H0sPQ"></a>
### 5.2.1 InputBox
`InputBox`方法为接收用户录入的信息
1. 用户录入的信息必须用一个变量承接;
2. inputbox的参数除了下表列出的以外,还有一个比较重要的可选参数[type],指定返回的数据类型。 如果省略此参数,则返回文本。

3. 对于能够接收多个类型值的,type参数可以为对应类型只和。如type参数为3,则为数字和文本

<a name="XAgss"></a>
### 5.2.2 SendKeys
`SendKeys(Keys)`方法可通过代码模拟按下键盘按键的功能
1. `Keys`参数是一个字符串需要加引号
2. 功能按键需要用`{}`包裹,如:`"{F1}"`。不用`{}`包裹的默认输出这个字母的按键
3. `Keys`参数也可以为`{key number}`的形式确定按键点击次数,如:`{h 10} `则是指 10 次按下 H 键
```vbnet
'如果鼠标选择在第一列的一个非空单元格,那么自动进入这个单元格的编辑状态
Private Sub Worksheet_SelectionChange(ByVal Target As Range) '利用Worksheet_SelectionChange事件处理
'这里必须要先判断Target区域的单元格数量及列号,确定只有一个单元格后再判断值是否为空,不能一并用两个and判断
'原因为若选择区域为多个区域Target.Value为一个可变数组,会报数据类型错误
If Target.Count = 1 And Target.Column = 1 Then '先判断单元格个数和所在列号
If Target.Value <> "" Then '在判断单元格是否为空
Application.SendKeys "{F2}"
End If
End If
End Sub
5.2.3 GOTO
GOTO(reference,[scroll])
方法可以直接选中将未激活工作表的区域,从而代替先Activate再select的方法
- reference参数为一个Range,也可以是workbook.worksheet.range形式 ```vbnet ‘常规方式为先激活工作簿,再激活工作表,最后选择单元格。但goto函数可以一步做到
‘有两个工作簿为:123.xlsm和工作簿1.xlsm ‘123.xlsm包含工作表为:Sheet1,Sheet2 ‘工作簿1.xlsm包含的工作表为:汇总,Sheet1,Sheet2,Sheet3 ‘目前活动单元格为:Workbooks(“工作簿1.xlsm”).Sheets(“汇总”)
Sub function_goto()
Application.Goto reference:=Workbooks(“123.xlsm”).Sheets(“Sheet2”).[A1:B5]
End Sub
<a name="bvaxZ"></a>
### 5.2.4 Union
`Union(range1,range2,...)`方法为连接不同的range,最终形成新的range
```vbnet
Public Sub function_Union()
Union(Range("A1:B5"), Range("A11:B15")).Select
End Sub
5.2.5 Application.worksheetfunction
6.常用的函数
所有vba函数都能通过vba.
引用出。如果不显示,按ctrl+j
5.1 Replace函数
Replace (expression,find,replace,[start],[count],[compare])
函数用于将expression字符串中find字符串替换为replace字符串
5.2 InStr函数
InStr([start],string1,string2,[compare])
函数返回一个数字。该数字为string2首次在string1中出现的位置
- 特殊的string1和string2时的返回值如下表
- 未找到匹配位置时返回
Nothing
```vbnet ‘以上代码中对于工资表名称的判断写法较为复杂,可简化
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim s As String
s = ",xxx,1111,Sheet1," '设定不能修改表的名称集合,且用逗号作为占位符,原因是为了未来匹配",XXXX,",这样不会出现名称包含错误
If Not VBA.InStr(s, "," & Sh.Name & ",") Is Nothing Then '将工作表名称构建成",XXXX,"的样式,用instr函数查找
Application.CellDragAndDrop = False
Else
Application.CellDragAndDrop = True
End If
End Sub
<a name="DAwrK"></a>
### 5.3 Dir函数
`Dir()`函数返回一个文件名字符串,其中包含问看类型后缀。若果在路径下能够找到该文件,返回文件名+后缀名,如果不能则返回空,其内部可以使用通配符
1. 函数参数为一个文件名称的完整路径,其中可以包含通配符
2. 如果路径中有符合条件的文件
```vbnet
'ThisWorkbook.Path路径为:
Sub 插入批注图片()
Dim rng As Range
图片路径 = Dir(ThisWorkbook.Path & "\图片\" & [A3].Value & ".*")
Debug.Print 图片路径
图片路径 = ThisWorkbook.Path & "\图片\" & 图片路径
Debug.Print 图片路径
Next
End Sub