VBA-TG第6节|图形界面设计

最近更新:'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

代码显示的结果如下:


你可能感兴趣的:(VBA-TG第6节|图形界面设计)