最近更新:'2019-04-14'
1.用户窗体编程简单介绍
2.常见控件的基本属性及用法
3.文本框常见属性
4.下拉列表框常见属性
5.全局变量以及模块\控件的运用
6.AcitiveX控件
7.workSheet.ChartObjects对象(用VBA控制图表)
1. 用户窗体编程简单介绍
设计 Windows风格的窗口界面,可以容纳文本框、按钮等各种控件,实现图形化用户交互功能.什么叫窗体,如下截图:
窗体相当于一个个对象,直接修改对象的属性即可.
用代码以及窗体设计窗口即可以修改.
窗体设计窗口的修改方式如下:
修改窗体的名称:
修改窗体的背景颜色:
2.常见控件的基本属性及用法
2.1如何让文本框的内容显示在EXCEL里面的单元格?
Private Sub CommandButton1_Click()
Cells(3, 2) = TextName.Text
Cells(3, 3) = TextAge.Text
End Sub
代码运行的结果如下:
2.2如何让文本框的内容逐行输入到excel表格中?
通过usedrange找到当前最大的范围.
Private Sub CommandButton1_Click()
Dim r As Range, i As Long
Set r = Worksheets(1).UsedRange
i = r.Row + r.Rows.Count
Cells(i, 2) = TextName.Text
Cells(i, 3) = TextAge.Text
End Sub
代码显示的结果如下:
2.2如何让窗体消失以及销毁呢?
如何让输入完数据之后,让窗体马上消失,需要增加一行代码
UserForm1.Hide
完整的代码如下:
Private Sub CommandButton1_Click()
Dim r As Range, i As Long
Set r = Worksheets(1).UsedRange
i = r.Row + r.Rows.Count
Cells(i, 2) = TextName.Text
Cells(i, 3) = TextAge.Text
UserForm1.Hide
End Sub
代码显示的结果如下:
Hide属性有个特征,窗体马上消失后,再调用的时候,窗体的内容并没有进行清除.具体显示如下:
那么窗体马上消失后,再调用的时候,窗体的内容如何进行清除?
这里需要用到unload属性,具体如下:
需要增加一行代码,具体如下:
UserForm1.Unload
完整的代码如下:
Private Sub CommandButton1_Click()
Dim r As Range, i As Long
Set r = Worksheets(1).UsedRange
i = r.Row + r.Rows.Count
Cells(i, 2) = TextName.Text
Cells(i, 3) = TextAge.Text
UserForm1.Unload
End Sub
代码显示的结果如下:
hide和unload属性的知识汇总如下:
2.3当在工作表中双击单元格时,自动弹出窗体,又要怎么弄呢?
具体要求如下截图:
1)在worksheet中选择beforedoubleclick
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
UserForm1.TextName.Text = Cells(Target.Row, 2)
UserForm1.TextName.Text = Cells(Target.Row, 3)
UserForm1.Show
End Sub
3.文本框常见属性
4.列表框常见属性
把内容写在列表框常见的方法
4.1方法1
4.2方法2
Private Sub UserForm_Initialize()
Dim a(4) As String
a(0) = "光"
a(1) = "空气"
a(2) = "土地"
a(3) = "水"
a(4) = "日月星辰"
ListBox1.List = a
End Sub
代码显示最终的结果如下:
需要注意如下:
如果有冲突,按以下两个方法进行,如下:
4.3方法3
Option Explicit
Private Sub CommandButton1_Click()
Dim i As Long
If ListBox1.ListIndex > -1 Then
i = ListBox1.ListIndex + 2
txtScore1.Text = Cells(i, 3)
txtScore2.Text = Cells(i, 4)
txtScore3.Text = Cells(i, 5)
txtScore4.Text = Cells(i, 6)
txtScore5.Text = Cells(i, 7)
End If
End Sub
代码显示的结果如下:
如果直接点击列表框里面的内容,就显示对应文本框的成绩,那么又如何操作呢?具体要求如动态图:
选择listbox1中的change
完整的代码如下:
Option Explicit
Private Sub ListBox1_Change()
Dim i As Long
If ListBox1.ListIndex > -1 Then
i = ListBox1.ListIndex + 2
txtScore1.Text = Cells(i, 3)
txtScore2.Text = Cells(i, 4)
txtScore3.Text = Cells(i, 5)
txtScore4.Text = Cells(i, 6)
txtScore5.Text = Cells(i, 7)
End If
End Sub
代码显示的结果如下:
4.下拉列表框常见属性
与列表框的用法是一致的.
5.单选按钮和复选框的属性
5.1单选按钮和复选框的常见属性
5.2单选按钮和复选框的Value属性
使用效果如下:
6.image控件
Dim X As Integer
Private Sub CommandButton1_Click()
X = (X + 1) Mod 10
k = "D:\桌面背景\" & Trim(Str(X + 1)) & ".jpg"
Me.Image1.Picture = LoadPicture(k)
Me.Repaint
End Sub
代码显示效果如下:
7.Enable属性和visible属性
5.. 全局变量以及模块\控件的运用
案例1
点击学生的信息那一行,会有窗体显示,并且可以修改.
worksheet相关的代码
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim i As Long
i = Target.Row
模块1.rowNum = Target.Row
fmInput.txtName.Text = Cells(i, 2)
fmInput.txtAge.Text = Cells(i, 3)
fmInput.txtLength.Text = Cells(i, 4)
fmInput.Show
End Sub
VBA界面展示的结果:
窗体commandbutton相关的代码,如下:
Private Sub CommandButton1_Click()
Dim i As Long
i = 模块1.rowNum
Cells(i, 2) = txtName.Text
Cells(i, 3) = txtAge.Text
Cells(i, 4) = txtLength.Text
Unload fmInput
End Sub
VBA界面展示的结果:
模块1相关的代码,如下:
Option Explicit
Public rowNum As Long
VBA界面展示的结果:
以上代码最终显示的结果如下:
案例
点击修改学生记录按钮后,如何将入学年龄以及学制加在一起,并将结果返回在毕业年龄?要求如下动态图:
在之前案例的代码基础下,在如下:
Cells(i, 5) = CInt(txtAge.Text) + CInt(txtLength.Text)
VBA界面展示的结果:
需要注意的事项如下:
6. AcitiveX控件
使用在表单直接使用AcitiveX控件的方法,如下截图:
设置AcitiveX控件的属性
编写AcitiveX控件的程序,需要双击控件.不过代码是直接显示在工作表中,而不是窗体模块中.
案例1
用一个AcitiveX控件,控制表格中对应美元与人民币的转换,并且控件对应的名称有相应的改变.具体要求如下:
模块1相关的代码:
Option Explicit
Sub toUSD()
Dim rate, i
rate = Cells(8, 6)
For i = 11 To 20
Cells(i, 6) = Cells(i, 6) / rate
Next i
Cells(7, 6) = "USD"
End Sub
Sub toRMB()
Dim rate, i
rate = Cells(8, 6)
For i = 11 To 20
Cells(i, 6) = Cells(i, 6) * rate
Next i
Cells(7, 6) = "RMB"
End Sub
sheet相关的代码
Private Sub btnExchange_Click()
If Cells(7, 6) = "RMB" Then
模块1.toUSD
btnExchange.Caption = "美元到人民币"
ElseIf Cells(7, 6) = "USD" Then
模块1.toRMB
btnExchange.Caption = "人民币到美元"
End If
End Sub
案例2
在案例1的基础上增加一个币种相对应的图片.具体要求如下:
将sheet相关代码更改为如下:
Private Sub btnExchange_Click()
If Cells(7, 6) = "RMB" Then
模块1.toUSD
btnExchange.Caption = "美元到人民币"
Image1.Picture = LoadPicture("D:\rmb.JPG")
ElseIf Cells(7, 6) = "USD" Then
模块1.toRMB
btnExchange.Caption = "人民币到美元"
Image1.Picture = LoadPicture("D:\usd.JPG")
End If
End Sub
7. workSheet.ChartObjects对象(用VBA控制图表)
案例1
在excel表格中点击每一行的时候,显示该行的线性图表,具体要求如下:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim mychartobject As ChartObject, ws As Worksheet, row As Long
Set ws = Worksheets("sheet1")
row = Target.row
If row < 13 Or row > 2 Then
If ws.ChartObjects.Count = 0 Then
Set mychartobject = ws.ChartObjects.Add(80, 240, 300, 200)
Else
Set mychartobject = ws.ChartObjects(1)
End If
With mychartobject.Chart
.ChartType = xlLine
.SetSourceData Source:=Range(ws.Cells(row, 4), ws.Cells(row, 15))
.HasTitle = True
.ChartTitle.Text = ws.Cells(row, 3)
End With
End If
End Sub
代码最终显示的结果如下:
代码相关知识点,如下:
案例2
用循环语句自动扫每一行的数据,并将每一行的数据用图表显示在屏幕上,具体要求如下:
Sub trendCharts()
Dim i As Long, j As Long, myChart As ChartObject, ws As Worksheet
Set ws = Worksheets("sheet1")
If ws.ChartObjects.Count > 0 Then
ws.ChartObjects.Delete
End If
For i = 3 To 12
Set myChart = ws.ChartObjects.Add(((i - 3) Mod 3) * 350 + 50, (Int((i - 3) / 3) + 1) * 250, 300, 200)
With myChart.Chart
.ChartType = xlLine
.SetSourceData Source:=Range(ws.Cells(i, 4), ws.Cells(i, 15))
.HasTitle = True
.ChartTitle.Text = Cells(i, 3)
End With
Next i
End Sub
代码显示最终的结果如下:
案例3
把图表保存在D盘
Sub saveCharts()
Dim myChart As ChartObject
For Each myChart In Worksheets("sheet1").ChartObjects
If myChart.Chart.HasTitle = True Then
myChart.Chart.Export "d:\" & myChart.Chart.ChartTitle.Text & ".gif"
End If
Next myChart
End Sub
代码显示的结果如下: