Excel VBA入门(即可)
之前就有了解过WPS Office的宏功能,并且mark了一下,昨天偶然百度到了门路,这里把一些过程简单总结一下,分享给大家。
1.vba简介
Visual Basic for Applications(VBA)是Visual Basic的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件。也可说是一种应用程式视觉化的Basic脚本。该语言于1993年由微软公司开发的的应用程序共享一种通用的自动化语言——–Visual Basic For Application(VBA),实际上VBA是寄生于VB应用程序的版本。
2.所需软件:
进阶技能:VB语言
VBA中有对象、方法、属性。理解这些是学习VBA的基础。
1、对象:工作簿、工作表、单元格、行、列等
2、属性:相应对象的属性。如工作表名称、单元格的行高等属性一般理解为对象拥有的静态特性。
3、方法:对相应对象所执行的动作称为对象的方法。如单元格移动、单元格删除内容等。
3.安装配置
- 安装vba,双击vba6chs傻瓜安装即可
4.收藏资料
链接:https://pan.baidu.com/s/1lxn5OKdBzkJwQ9ptmURFLg 密码:bdug
链接:https://pan.baidu.com/s/1dIVRJ0w0IOmQjYMx3b5-Ew 密码:tjra
链接:https://pan.baidu.com/s/1_Mb2WdzetVNAnZfgf4KuyA 密码:bcbp
5.简单入门操作
- 简单使用
- 创建一个宏
- MsgBox
- 工作簿和工作表对象
- Range对象
- 变量
- IF Then语句
- 循环
- 宏错误
- 字符串操作
- 日期和时间
- 事件
- 数组
- 函数和子函数
- 应用对象
- ActiveX控件
- 用户窗体
1. 创建宏
首先注意:保存的文件格式是Microsoft Office Excel 2007 启用宏的工作簿 (.xlsm),否则将出现以下提示
点击否,再选择正确的xlsm格式保存即可(下图中选中的格式)
然后是创建的过程(举个栗子)
新建一个Macro_test_01.xlsm
点击宏快捷键(Alt+F8)创建一个宏,赋个名字,点击“创建”按钮
工程界面,初始头已经给出
我们加了一句
Range("A1").Value = "Hello,Macro!"
意思是给单元格A1赋值为”Hello,Macro!”
点击上面的运行快捷键(F5),返回excel工作簿界面看效果,这样就完成了我们第一个macro的创建,之后知道怎么开始了,针对问题到网上搜代码案例理解修改就好了;实际上,直接搜索VB语言相关的代码就可以得到更多信息
2. Msgbox
MsgBox是Visual Basic和VBS中的一个函数,功能是弹出一个对话框,等待用户单击按钮,并返回一个Integer值表示用户单击了哪一个按钮。
“MsgBox”即为“Message Box”的缩写,在英语中意为“信箱”。
『例1』单击按钮弹出对话框删除所有内容
step1:创建命令按钮,开发工具->命令按钮,在工作表合适位置拉出按钮
step2:双击按钮出现工程界面,输入代码如下:
Dim answer As Integer
answer = MsgBox("要清空工作表么?", vbYesNo + vbQuestion, "清空工作表")
If answer = vbYes Then
Cells.ClearContents
Else
'do nothing
End If
运行即可看到效果,在工作表中随便输入随机数据,单击按钮即可实现清除工作表的效果
step3:拓展
看到下拉框里面的内容否?可以将动作设置成这些,根据命名就可以看出作用;另外,需要做其他效果搜一下Msgbox,看看相关函数就能模仿出其他效果。
『例2』单击弹出输入框向A1输入一个数据
Dim myValue As Variant
myValue = InputBox("输个啥?", "InputBox函数", 1)
Range("A1").Value = myValue
step1:创建按钮,输入代码,运行调试
step2:退出设计模式,单击命令按钮2实现效果
step3:拓展
第一句,声明Variant类型的变量myValue,在这里使用Variant类型的变量,因为Variant变量可以保存任何类型的值。这样用户可以输入文字,数字等。
第二句,InputBox函数具有更多可选参数。提示+标题+具有默认值的输入框。如果没有提供其他输入,将使用默认值。
3.工作簿和工作表对象
4. Range对象
5. 变量
6. IF Then语句
7. 循环
Dim i As Integer
i = 1
Do Until i > 6
Cells(i, 1).Value = 20
i = i + 1
Loop
Dim i As Long
Columns(1).Font.Color = vbBlack
For i = 1 To Rows.Count
If Cells(i, 1).Value < Range("D2").Value And Not IsEmpty(Cells(i, 1).Value) Then
Cells(i, 1).Font.Color = vbRed
End If
Next i
注意:Excel 2003中的工作表最多可包含65,536行,Excel 2007或更高版本中最多可包含1,048,576行。无论您使用的是什么版本,上面的代码行都会遍历所有行
实际上是把A列中下一个在B中不存在的数据不断添加到B列中,遇到空数据直接跳出,不复制。(功能放到一个命令按钮里面)
Dim toAdd As Boolean, uniqueNumbers As Integer, i As Integer, j As Integer
Cells(1, 2).Value = Cells(1, 1).Value
uniqueNumbers = 1
toAdd = True
'第一个数字总是'唯一的',直接拷贝过去
For i = 2 To Sheet1.Range("a65536").End(xlUp).Row
'Sheet1.Range("A65536").End(xlUp).Row意思是从A65536向上找到最后一个非空单元格,返回其行号
If Cells(i, 1).Value <> "" Then
'如果单元格非空,则继续
For j = 1 To uniqueNumbers
'遍历新的一列数据,判断是否重复,重复则false to add,不重复跳出
If Cells(i, 1).Value = Cells(j, 2).Value Then
toAdd = False
End If
Next j
'跳出的都是true to add的,拷贝过去即可,拷完一个新列行号增一
If toAdd = True Then
Cells(uniqueNumbers + 1, 2).Value = Cells(i, 1).Value
uniqueNumbers = uniqueNumbers + 1
End If
toAdd = True
End If
Next i
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
拓展这个案例只是删除一个单独列的重复数据,如果我们根据这一个key(主键)列删除其所带着的一行数据也可以修改出来
Dim i As Integer, j As Integer, temp As Integer, rng As Range
Set rng = Range("A1").CurrentRegion
For i = 1 To rng.Count
For j = i + 1 To rng.Count
If rng.Cells(j) < rng.Cells(i) Then
'swap numbers
temp = rng.Cells(i)
rng.Cells(i) = rng.Cells(j)
rng.Cells(j) = temp
End If
Next j
Next i
Dim tempString As String, tempInteger As Integer, i As Integer, j As Integer
For i = 1 To 5
Cells(i, 2).Value = WorksheetFunction.RandBetween(0, 1000)
Next i
For i = 1 To 5
For j = i + 1 To 5
If Cells(j, 2).Value < Cells(i, 2).Value Then
tempString = Cells(i, 1).Value
Cells(i, 1).Value = Cells(j, 1).Value
Cells(j, 1).Value = tempString
tempInteger = Cells(i, 2).Value
Cells(i, 2).Value = Cells(j, 2).Value
Cells(j, 2).Value = tempInteger
End If
Next j
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
例如:5个项目的权重,数值和限制已给定。
Dim limit As Double, weight As Double, value As Double, totalWeight As Double, maximumValue As Double
Dim i, j, k, l, m As Integer
Dim weighti, weightj, weightk, weightl, weightm As Double
Dim valuei, valuej, valuek, valuel, valuem As Double
limit = Range("D6").value
maximumValue = 0
weighti = Range("B2").value
weightj = Range("C2").value
weightk = Range("D2").value
weightl = Range("E2").value
weightm = Range("F2").value
valuei = Range("B3").value
valuej = Range("C3").value
valuek = Range("D3").value
valuel = Range("E3").value
valuem = Range("F3").value
For i = 0 To 1
For j = 0 To 1
For k = 0 To 1
For l = 0 To 1
For m = 0 To 1
weight = weighti * i + weightj * j + weightk * k + weightl * l + weightm * m
value = valuei * i + valuej * j + valuek * k + valuel * l + valuem * m
If value > maximumValue And weight <= limit Then
Range("B4").value = i
Range("C4").value = j
Range("D4").value = k
Range("E4").value = l
Range("F4").value = m
totalWeight = weight
maximumValue = value
End If
Next m
Next l
Next k
Next j
Next i
Range("B6").value = totalWeight
Range("B8").value = maximumValue
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
8. 宏错误
9. 字符串操作
分离字符串
Dim fullname As String, commaposition As Integer, i As Integer
For i = 2 To 7
fullname = Cells(i, 1).Value
commaposition = InStr(fullname, “,”)
Cells(i, 2).Value = Mid(fullname, commaposition + 2)
Cells(i, 3).Value = Left(fullname, commaposition - 1)
Next i
10. 日期和时间
MsgBox Now
'新建一个宏,写这样一句就得出当前时间弹出框
11. 事件
12. 数组
13. 函数和子函数
14. 用户窗体
15. ActiveX控件
If CheckBox1.Value = True Then Range("B4").Value = 1
If CheckBox1.Value = False Then Range("B6").Value = 0
TextBox1.Text = "数据录入成功!"
一个清除文本框信息
TextBox1.Value = ""
- 列表框
将列表框链接到单元格A5,设计模式右键单击列表框->属性->LinkedCell填A5
设计模式->右键单击列表框->查看代码->Project->ThisWorkbook->左下拉Workbook右Open,填写下列代码对列表框进行添加
With Sheet1.ListBox1
.AddItem "Turkey"
.AddItem "Tokyo"
.AddItem "Paris"
End With
清除(我把清除都放在了cls按钮里,方便)
ListBox1.Clear
效果
- 组合框
操作和列表框基本相同
- 选项按钮
实验到这里,已经很简单了,不过多解释
If OptionButton1.Value = True Then Range("A3").Value = 233
If OptionButton2.Value = True Then Range("A6").Value = 666
Range("A5").Value = SpinButton1.Value
属性设置
效果
16.应用对象
Dim myFile As String, rng As Range, cellValue As Variant, i As Integer, j As Integer
myFile = Application.DefaultFilePath & "\sales.csv"
Set rng = Selection
Open myFile For Output As #1
For i = 1 To rng.Rows.Count
For j = 1 To rng.Columns.Count
cellValue = rng.Cells(i, j).Value
If j = rng.Columns.Count Then
Write #1, cellValue
Else
Write #1, cellValue,
End If
Next j
Next i
Close #1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
Dim myFile As String, text As String, textline As String, posLat As Integer, posLong As Integer
myFile = "C:\Users\Randolph\Desktop\testWriteIn.txt"
'myFile = Application.GetOpenFilename()
Open myFile For Input As #1
Do Until EOF(1)
Line Input #1, textline
text = text & textline
Loop
Close #1
posLat = InStr(text, "ID")
posLong = InStr(text, "密码")
Range("A1").Value = Mid(text, posLat + 4, 4)
'后一个数是找到数据的长度,数据可以包括空格;前一个数是拷贝数据的起始字符位置,即从这行的第第个字符开始复制
'当然,每行第一个是0
Range("A2").Value = Mid(text, posLong + 4, 13)
'这里实验发现一个汉字算一个字母,若第二个数长于我们所需要的数据,将把下次出现的其他数据录入进来
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
用到的测试txt文件信息:
Some information here..
ID: aPig
密码: isAkindOfHAHA
Some more information here..
|