为您推荐:
精华内容
最热下载
问答
  • 5星
    49KB weixin_58444518 2021-05-21 11:46:39
  • 5星
    1.45MB zhangjin7422 2021-04-07 09:24:30
  • 窗体控件2.BackStyle = fmBackStyleTransparent '背景显示为透明 窗体控件1路径显示.BackStyle = fmBackStyleOpaque '背景显示白色 窗体控件2路径显示.BackStyle = fmBackStyleTransparent '背景显示为透明 窗体控件...
    											目   录
    
    编号名称编号名称编号名称编号名称编号名称
    1错误类2全局变量3开关4弹窗5换行
    6调试打印7引用8延时9日志窗口显示(全局文本)10调用外部软件
    11按钮状态改变12调用参数13路径选择14日志导出15excle文件格式转换
    16VBA隐藏表格17改变窗体外观18更改Sheet名19对文件夹中多个文件进行操作20合并单元格
    21插入一行单元格22在指定单元格内输入字符23调整行高和列宽24跳转到该列最后一个数值25获取当前单元格所在的行号和列号
    26格式刷(公式复用)27筛选28查找替换29单元格颜色30字符居中
    31添加公式32复制某个单元格33单元格引用34单元格边框35复选框执行
    36取消(退出软件)37If Else38For Next39While wend40Do Loop
    41附 录:42434445
    											 代   码
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    1、错误类
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    错误类:
    On Error Resume Next '忽略运行过程中可能出现的错误(添加在函数的前面)
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    2、设置全局变量
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    设置全局变量:
    public i '将i设置成全局变量
    sub 全局变量()
    end sub
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳、
    3、开关
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    开关:
    	public i '将i设置成全局变量
    	sub 点击一下开再点击一下关()
    	if i = 0 then
    		'编写需要的代码满足何种条件后将i置为1
    		i = 1
    	else
    		'编写需要的代码满足何种条件后将i置为0
    		i = 0
    	end if
    	end sub
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    4、弹窗
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    弹窗:
    sub 弹窗()
    	MsgBox("这里编写弹出的提示框显示内容")
    end sub
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    5、换行
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    换行显示:
    & chr(10)
    长代码连写:
     _
    If i = 1 _
    Then
    i = 0
    End If
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    6、调试打印
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    打印参数值:
    Debug.print *'*为变量、引用值、固定字符等
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    7、引用
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    引用:
    x = 1
    msgbox("这是要引用值x显示的地方") & x’文本后引用
    MsgBox ("文件执行" & x & "日志已导出到")'这是中间引用
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    8、延时
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    延时:
    Application.Wait Now + TimeValue("00:00:1")'最低延时为1秒
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    9、日志窗口显示(全局文本)
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    日志:
    public x '将x设置成全局日志内容
    sub 日志()
    日志.text = "这是日志类容"'固定日志(方法1)
    全局日志.text = x + "这是新日志类容"'x为之前日志类容(方法2)
    x = 全局日志.text
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    10、调用外部软件
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    调用外部软件:
    sub 调用外部软件()
    On Error Resume Next '忽略运行过程中可能出现的错误
    Set oShell = CreateObject("WSCript.shell")
    ret = oShell.Run(Application.ActiveWorkbook.Path & "\调用软件名称.exe " & " 传入的参数", 0, True) 
    Set oShell = Nothing
    end sub
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    11、按钮状态改变
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    按钮控件状态改变:
    '总窗口名称为该用户窗体最外层的背景窗口
    总窗口名称.Controls("按钮控件名称").Value = False'False为关
    总窗口名称.Controls("按钮控件名称").Value = True'True为开
    判断复选框是否被选中:
    if 总窗口名称.Controls("按钮控件名称").Value = True Then'True为选中
    '这里写被选中后要执行的代码
    else
    '这里写没被选中时要执行的代码
    End if
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    12、调用参数
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    调用参数:
    调用.text = "在对应窗口显示这一段字符"'在文本窗口显示文字(调用为控件名称)
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    13、路径选择
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    路径选择:
    public x '将x设置成全局路径变量
    Private Sub 路径选择_Click()
    Set objFD = Application.FileDialog(msoFileDialogFolderPicker)
    With objFD
    If .Show = -1 Then
    ' 如果单击了确定按钮,则问将选取的路径保存在变量中
    x = .SelectedItems(1)
    End If
    End With
    Debug.Print x
    文件路径.Text = x'输出文件路径日志
    End Sub
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    14、日志导出
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    导出日志txt:
    public x '将x设置成全局路径变量
    public i '将i设置成全局日志变量
    Private Sub 日志导出_Click()
    Dim Fso, Fil
    日志导出.Caption = "日志已导出"'将按钮文字变成日志已导出
    日志导出.Enabled = False'日志导出按钮不可编辑
    Application.Wait Now + TimeValue("00:00:5")'按钮文字改变延时
    myPath1 = "" & x  '导出的日志所在的文件夹路径
    Set Fso = CreateObject("Scripting.FileSystemObject") '访问系统文件
    Set Fil = Fso.OpenTextFile(myPath2, 8, 1) '打开文本文件
        Fil.Write i '将i中所含所有字符写入文本
        Fil.WriteBlankLines (5) '换5行
    Fil.Close '关闭文本文档
    日志导出.Caption = "导出日志"'将日志导出按钮文字变成导出日志
    日志导出.Enabled = True'日志导出按钮不可编辑
    End Sub
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    15、excle文件格式转换
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    Private Sub CSV转xlsx_Click() 'CSV转Xlsx
         Dim sDir As String
         Dim curdir As String
         curdir = "设置文件路径" '找到需要转换的文件路径
         sDir = Dir(curdir & "\*.csv")'显示文件列表
         While Len(sDir)'循环当前文件夹中文件个数
         Workbooks.Open FileName:=curdir & "\" & sDir'打开当前文件夹中符合条件的文件
         Dim temp As String'(这个定义需要在循环内部)
         temp = Left(sDir, Len(sDir) - 4)
         'Left函数从给定输入字符串的左侧返回指定数量的字符
         '语法:Left(String, Length)
         'String - 必需的参数。 输入从左侧返回指定数量的字符的字符串
         'Length - 必需的参数。 一个整数,指定要返回的字符数
         ActiveWorkbook.SaveAs FileName:=curdir & "\" & temp & ".xlsx", _
            FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False'另存为 & temp & .xlsx类型的文件
            ActiveWorkbook.Save'保存当前显示文件
            ActiveWindow.Close'关闭当前显示文件
         sDir = Dir
         Wend
    End If
    End Sub
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    16、自动打开excle中用户窗体和隐藏VBA中excle表格(只显示用户窗体)
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻
    样例

    自动打开excle中用户窗体和隐藏VBA中excle表格(只显示用户窗体)
    在Microsoft excle 对象中的ThisWorkbook中
    Private Sub WORKBOOK_OPEN()
    用户主窗体名称.Show'自动打开用户窗体
    Application.Visible = False '隐藏EXCEL主窗口
    End Sub
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    17、改变窗体外观(背景色,是否隐藏等)
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    改变窗体外观(背景色,是否隐藏等)
    Private Sub 改变外观_Click() 
        窗体控件1.BackStyle = fmBackStyleOpaque '背景显示白色
        窗体控件2.BackStyle = fmBackStyleTransparent '背景显示为透明
        窗体控件1路径显示.BackStyle = fmBackStyleOpaque '背景显示白色
        窗体控件2路径显示.BackStyle = fmBackStyleTransparent '背景显示为透明
        窗体控件1路径显示.SpecialEffect = fmSpecialEffectSunken '路径显示背景框
        窗体控件2路径显示.SpecialEffect = fmSpecialEffectFlat '路径不显示背景框
        窗体控件1.Enabled = True '可以点击操作
        窗体控件2.Enabled = False '不可点击操作
    End Sub
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    18、更改Sheet名
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    更改Sheet名
    Private Sub 更改Sheet名_Click() 
    Dim sDir As String
    Dim curdir As String
    curdir = "" & sPath1 '找到需要转换的文件路径
    If Dir(curdir & "\*.csv") = "" Then'判断文件后缀
    sDir = Dir(curdir & "\*.xlsx")
    Else
    sDir = Dir(curdir & "\*.csv")
    End If
    While Len(sDir)'遍历文件后依次操作
    Workbooks.Open FileName:=curdir & "\" & sDir
    Dim temp As String
    temp = Left(sDir, Len(sDir) - 4)
    ActiveWorkbook.SaveAs FileName:=curdir & "\" & temp & ".xlsx", _
        FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        Sheets(1).Name = "Sheet1" '修改文件表的Sheet名称为Sheet1
        ActiveWorkbook.Save
        ActiveWindow.Close
    sDir = Dir
    Wend
    End If
    End Sub
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    19、对文件夹中多个文件进行操作
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    Dim sPath1 As String'定义的sPath1为全局变量
    Private Sub 多文件操作_Click()
            Dim aList() As String
                curdir1 = "" & sPath1 '文件夹目录
                sDir1 = Dir(curdir1 & "\*.xlsx") '不同后缀记得替换:(csv、xlsx、xlsm)
                '可以将sDir1增加判断对不同类型的文件进行操作。
            Do While sDir1 <> 'sDir1不等于空
            If sDir1 = "" Then '用来判断文件夹中是否还存在文件,如果没有文件则跳出循环
            MsgBox ("当前文件夹中没有符合筛选条件的文件,请确认路径是否正确")
            Exit Sub'退出当前函数
            End If
                    ReDim Preserve aList(0 To i) As String  '重定义数组大小
                    aList(i) = sDir1 '列表a
                    Workbooks.Open FileName:=curdir1 & "\" & aList(i) '打开文件
                    Application.WindowState = xlMaximized '窗口最大化
                    '在这里添加操作代码,例如增、删、改、查等
    				ActiveWorkbook.Save
                    ActiveWindow.Close
    		i = i + 1
    		sDir = Dir()'查找下一个目录
    		Loop
    	end Sub
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    20、单元格格式设置(合并单元格)
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

     Range("A1:B1").Select'单元格A1到B1
            With Selection
                .HorizontalAlignment = xlCenter '水平对齐
                .VerticalAlignment = xlCenter '垂直对齐
                .WrapText = False '文字换行(居中为True)
                .Orientation = 0 '方向(文本方向)
                .AddIndent = False '添加缩进
                .IndentLevel = 0 '缩进量(范围0-15)
                .ShrinkToFit = False '收缩到合适(自动调整)
                .ReadingOrder = xlContext '读写次序(从左往右写还是从右往左写)
                .MergeCells = False '合并单元格
            End With
            Selection.Merge'选择并合并
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    21、插入一行单元格
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

     Rows("1:1").Select'插入首行
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    22、在指定单元格内输入字符
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    Range("A1").Select
    ActiveCell.FormulaR1C1 = "这是需要输入的字符"
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    23、调整行高和列宽
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    Rows("1:1").Select'调整第一行行高
    Selection.RowHeight = 90'行高90
    Columns("Z:Z").ColumnWidth = 7 '设置Z列单元格列宽为7
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    24、跳转到该列最后一个数值
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    Range("A1").Select'从A1开始
    Selection.End(xlDown).Select '到有字符的最后一行,相当于按住ctlr+shift+↓
    x = Selection.Row() '获取当前选择框所在的行号
    y = Selection.Column() '获取当前选择框所在的列号
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    25、获取当前单元格所在的行号和列号
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    x = Selection.Row() '获取当前选择框所在的行号
    y = Selection.Column() '获取当前选择框所在的列号
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    26、格式刷(公式快速复用)
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    该方法一般需要配合获取当前单元格所在的行号和列号使用
    先找有数据的单元格,使用Selection.End(xlDown).Select '到有字符的最后一行,相当于按住ctlr+shift+↓方法跳转到最后一行,然后使用x = Selection.Row() '获取当前选择框所在的行号, y = Selection.Column() '获取当前选择框所在的列号。然后让单元格在需要写入公式的最后一行中写入1(1没有任何意义,只是为了让该单元格有字符)其他需要同样操作的单元格类似,然后使用下面的代码,将该列所需要复用的公式进行复用。
    公式复用演示

    Range("I2").Select
    ActiveCell.FormulaR1C1 = "=RC[-6]-RC[-4]" '以当前单元格(I2)为坐标,用负轴(-6)单元格减去(-4)单元格(从后往前数6个格子和4个格子)
    Range("J2").Select
    ActiveCell.FormulaR1C1 = "= RC[-7]-RC[-4]" '以当前单元格(J2)为坐标,用负轴(-7)单元格减去(-4)单元格(从后往前数7个格子和4个格子)
    Range("K2").Select
    ActiveCell.FormulaR1C1 = "=RC[-8]-RC[-4]"
    Range("K3").Select
    Range("I2:K2").Select '选中I2,J2,K2单元格(三个连在一起全选)
    Range(Selection, Selection.End(xlDown)).Select '将上面的三个全选单元格选中后按住ctlr+shift+↓到有数值的最后一行(之前写的3个1)
    Selection.FillDown '按ctrl+D实现前面三个单元格同样的公式操作
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    27、筛选
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    添加筛选
                Range("A1:K1").Select '选中A1到K1
                Selection.AutoFilter '增加筛选功能
    筛选条件
                Columns("E:E").Select '选择E列
                '单项筛选
                ActiveSheet.Range("$A$1:$K$" & x).AutoFilter Field:=5, Criteria1:="=" '选择5列进行筛选,筛选值为空
                '多项筛选
                ActiveSheet.Range("$A$1:$K$" & x).AutoFilter Field:=5, Criteria1:="=null", _
                  Operator:=xlOr, Criteria2:="=" '选择第5列筛选值为null(Criteria1:="=null")和空白值(Criteria2:="=" )
                e = ActiveSheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count - 1 '返回筛选后的符合条件的个数
    
    取消筛选(全选显示)
     			Columns("G:G").Select
                ActiveSheet.Range("$A$1:$K$" & x).AutoFilter Field:=7 '全选第7列筛选(取消第7列的筛选)
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    28、查找替换
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    Cells.Replace What:="null", Replacement:="", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False '查找并替换null值为空白(不写入任何字符)
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    29、单元格颜色
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    去除颜色
                Columns("A:K").Select'选择A列到K列
                With Selection.Interior '循环将填充颜色去除
                    .Pattern = xlNone
                End With
    

    添加颜色
    Range(“L3:P3”).Select’L3到P3这些单元格添加绿色
    With Selection.Interior
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
    .ThemeColor = xlThemeColorAccent6
    .TintAndShade = 0.799981688894314
    '07***为浅绿,0.599993896298105中浅绿,0.399975585192419浓绿
    .PatternTintAndShade = 0
    End With

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    30、单元格设置(字符居中)
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    '这段代码是录制的,单元格格式参数如果懒得一一百度就使用录制
    Columns("A:K").Select
                Selection.Borders(xlDiagonalDown).LineStyle = xlNone'选择。边框(xl对角线向下)。线条样式 = xlNone
                Selection.Borders(xlDiagonalUp).LineStyle = xlNone'选择。边框(xl对角线向上)。线条样式 = xlNone
                With Selection.Borders(xlEdgeLeft)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlThin
                End With
                With Selection.Borders(xlEdgeTop)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlThin
                End With
                With Selection.Borders(xlEdgeBottom)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlThin
                End With
                With Selection.Borders(xlEdgeRight)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlThin
                End With
                With Selection.Borders(xlInsideVertical)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlThin
                End With
                With Selection.Borders(xlInsideHorizontal)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlThin
                End With
                With Selection '循环被选中的单元格设置居中
                    .HorizontalAlignment = xlCenter’水平对齐
                    .VerticalAlignment = xlCenter‘垂直对齐
                End With
                HorizontalAlignment = xlCenter
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    31、在单元格内添加公式(SUMPRODUCT)
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    Range("AA3").Select
         ActiveCell.FormulaR1C1 = _
            "=SUMPRODUCT((R2C9:R" & x4 - dy & "C9>-1)*(R2C9:R" & x4 - dy & "C9<1))"
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    32、复制某个单元格
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    Range("AB3").SelectTr
    Application.CutCopyMode = True
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    33、单元格引用
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    Range("T5:AA5").Select '将表格T5至AA5
       ActiveCell.FormulaR1C1 = "=R" & x4 + 1 & "C[-12]" '上一行代码需要取值的单元格(该单元格值等于哪一个单元格值)
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    34、单元格边框
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    Selection.Merge '将表格加边框
                Range("L1:AS5").Select
                Selection.Borders(xlDiagonalDown).LineStyle = xlNone
                Selection.Borders(xlDiagonalUp).LineStyle = xlNone
                With Selection.Borders(xlEdgeLeft)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlThin
                End With
                With Selection.Borders(xlEdgeTop)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlThin
                End With
                With Selection.Borders(xlEdgeBottom)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlThin
                End With
                With Selection.Borders(xlEdgeRight)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlThin
                End With
                With Selection.Borders(xlInsideVertical)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlThin
                End With
                With Selection.Borders(xlInsideHorizontal)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlThin
                End With
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    35、复选框执行
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    Private Sub Checkbox1_Click()
    if box1 = True and w1 = 1 Then'这里使用判断来控制复选框执行。用户只点击复选框时,复选框可以被勾选但不执行。必须要点击下面的执行按钮才能剩下执行。(这是折中方案)
    '这里写入该模块的功能代码
    end if
    end sub
    

    Private Sub Checkbox2_Click()
    if box2 = True and w2 = 2 Then'这里使用判断来控制复选框执行。用户只点击复选框时,复选框可以被勾选但不执行。必须要点击下面的执行按钮才能剩下执行。(这是折中方案)
    '这里写入该模块的功能代码
    end if
    end sub
    

    Private Sub Checkbox3_Click()
    if box3 = True and w3 = 3 Then'这里使用判断来控制复选框执行。用户只点击复选框时,复选框可以被勾选但不执行。必须要点击下面的执行按钮才能剩下执行。(这是折中方案)
    '这里写入该模块的功能代码
    end if
    end sub
    

    Pubilc w1, w2, w3'定义三个全局变量
    Private Sub 执行_Click() '
    j = "" '初始化为空
    For m = 1 To 3 '开始循环,有几个复选框选项则写几。该项目中有3个选项所以写3
        If 用户主窗体名称.Controls("Checkbox" & m).Value = True Then '如果复选框被选中(""&m)引号给的是复选框名字
        If m = 1 Then
        box1 = True
        End If
        If m = 2 Then
        box2 = True
        End If
        If m = 3 Then
        box3 = True
        End If
        If j = "" Then '并且字符串当时为空
        j = 用户主窗体名称.Controls("Checkbox" & m).Caption '就将复选框的名字即j存放到char中
        Else: j = j & "," & 用户主窗体名称.Controls("Checkbox" & m).Caption '如果字符串已经有个1或2或3了,那么将新的内容用逗号与字符串中已经有的值连接起来
        End If
        End If
        Next
        if box1 = True Then'如下注释1
         用户主窗体名称.Controls("Checkbox1").Value = False'将Checbox1变成去勾选状态
         w1 = 1'将w1赋值为1
         用户主窗体名称.Controls("Checkbox1").Value = True'将Checbox1变成勾选状态
         w1 = 0'将w1赋值为1
         end if
         '注释1:这里之所以这样写是没有找到勾选复选框时不执行,只有点执行时才会执行的办法,所以选择了
         '折中先判断复选框是否被勾选了,如果勾选了将下面的box置为True。然后在所有的条件判断完成后再
         '将已被勾选的窗体去勾选,由于不满足执行条件,该控件下的代码不会执行,紧接着将w赋值后再将窗体
         '勾选,这样控件执行的条件满足后就能够正常执行控件下面的代码。而去勾选和再勾选的过程因为时间极
         '短用户基本无感知。也可以不用该方法直接把代码放在执行模块下面直接执行。(技术有限,勿喷)
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    36、取消(退出软件)
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    Unload Me'退出软件
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    37、If Else
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    sub ifelse()
    i = 0
    If i = 0 Then
    i = 1'这里编写需要执行的代码
    ElseIf i = 1 Then
    i = 2'这里编写需要执行的代码
    Else
    i = 0'这里编写需要执行的代码
    End If
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    38、For Next
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    Sub forNext()
    Dim i%, j%
    For i = 1 To 10
    j = j + i
    Next
    MsgBox j
    End Sub
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    39、While wend
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    i = 0
    while i < 10
    i = i + (i+1)
    wend
    

    ┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳
    40、Do Loop
    ┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻

    当条件成立,开始循环:
    sub Do()
    Dim i%
    Do While i<3
        i = i + 1
        MsgBox i
    Loop
    End Sub
    直到条件成立,跳出循环:
    sub Dountil()
    i  = 0
    Do Until i > 10:
    	i = i+1
    Loop
    msgbox("")  & i
    

    														  附     录:
    

    不同Sub含义:
    Public 表示 Sub 过程可被所有其他地方引用。和Sub性质一致,等价于Sub。
    Private 表示 Sub 过程只能被当前页或者窗体引用,所以只能在本模块内部可以访问。


    变量或字符串类型:
    Variant:变体型变量(类型可变),能够表除了定长string数据和用户自定义类型外可以包含任何种类的 数据,也可以包含empty、error、nothing、null等特殊值。使用该类型定义会导致代码执行时间变长。非必要时不要用。
    String:字符串类型。
    integer:整数(范围:-32768~32768)
    integer1:初始化是一个Variant类型的空值,随着对其的操作变成任意类型。
    integer2:会被正常的初始化为0。
    Dim integer1 as interger,integer2 as integer’这样1和2都为空值
    Long:长整型(范围:-214743648 ~ 214743648)
    Single 和 Double:单精度浮点数(Single) 和双精度浮点数(Double)
    Currency:货币型
    Byte:字节型
    Boolean:布尔型(表示逻辑值True或False)
    Date:日期(范围100年 ~ 9999年,0:00:00 ~ 23:59:59)
    object:对象型。利用set语句,声明为对象型的变量可以赋值为任何对象引用
    枚举型:

    Public Enum words 'Pubilc(公共)或Private(私有)
        中国
        英国
        美国
        法国
    End Enum
    Sub ad()
    	Dim from As words
    	from = 英国
    	from = 法国
    End Sub
    

    枚举型
    用户自定义类型:

    Type i
    i as Double
    End Type
    

    展开全文
    hyd_csdn 2020-06-05 14:56:21
  • 31KB qq_37066462 2021-10-26 22:17:03
  • 4星
    24KB suautotest 2018-06-17 03:10:29
  • 要么用代码调用窗体的 show 方法 3、关闭窗体 代码关闭是 unload testform方法 4、显示设置 窗体标题:caption 背景色:backcolor 背景图片:picture,代码里面可以使用loadpicture()方法进行加载 属性窗口...

    基础部分

    一、窗体的基本操作

    1、窗体插入

    2、运行窗体

    • 要么直接在窗体的界面点击运行按钮
    • 要么用代码调用窗体的 show 方法

    3、关闭窗体

    • 代码关闭是 unload testform方法

    4、显示设置

    • 窗体标题:caption
    • 背景色:backcolor
    • 背景图片:picture,代码里面可以使用loadpicture()方法进行加载

    属性窗口里面可以查看

    5、位置大小

    • top、left、height、width
    • startupPosition 启动显示位置

    6、显示行为

    • showModal 的值就是 true 或者false 可以设置显示窗体的时候是否可以进行其他的操作

    7、删除窗体

    二、控件的基本操作

    1、控件插入

    在这里插入图片描述

    2、删除

    3、对齐

    • 菜单栏格式里面
    • 可以选中多个控件进行布局的操作

    4、tab键相关

    在这里插入图片描述

    5、控件循环

    • 所有控件集合 controls
    • controls(index) controls("name")可以选定具体的控件

    6、控件类型判断

    • typename 判断控件类型
    Private Sub UserForm_Click()
        For i = 0 To Controls.Count - 1
            If TypeName(Controls(i)) = "TextBox" Then
                MsgBox Controls(i).Value
            End If
        Next i
    End Sub
    

    窗体事件

    • 和前面讲的工作表事件等是一样的,只需要特别注意一下键盘事件和鼠标事件
      在这里插入图片描述

    一、键盘事件

    1、keydown

    • keyCode 唯一,shift 参数不同的值分别代表ctrl、shift、alt
    Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    ''''''''''''''code
    End Sub
    

    2、keyup

    Private Sub UserForm_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    ''''''''''''''code
    End Sub
    

    3、keypress

    Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    ''''''''''''''code
    End Sub
    

    keydown keypress 都是按键按下,但是一般使用keydown,功能更加强大

    二、鼠标事件

    1、mousedown

    • button不同的值分别代表左右和中键
    • shift 也是和上面一样
    • x 和 y 就是鼠标的位置坐标
    Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    
    End Sub
    

    2、mouseup

    Private Sub UserForm_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    
    End Sub
    

    3、mousemove

    Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    
    End Sub
    

    vba一行的代码很长的话可以使用空格加下划线然后enter的方式进行换行


    标签和按钮

    一、按钮

    1、快捷键设置

    • 就是设置 Accelerator 属性,然后通过 alt 键加设置的键就可以激活按钮的 click 事件

    2、enter 和 esc 响应

    • 就是 default 和 cancel 属性都设置为true,然后窗体显示并且焦点在按钮上的时候按 esc 和 enter 就会激发按钮的 click 事件

    二、标签

    • label 标签基本就是用来显示一定的提示内容
    • 具体的属性使用的时候可以通过属性窗口进行摸索

    文字框

    • maxLength 和 autoTab 属性可以实现输入多少个字符自动切换
    • 基本的事件也是可以通过名字完全看懂的,不多说
    • 其他的使用基本上也是琢磨属性窗口的内容

    列表和组合框

    • 这两个的用法基本是一致的,就是下拉框比一般的列表更加节省空间而已
    • 选项的填充可以使用 additem 方法,可以用数组赋值给 list 属性,可以直接引用单元格区域赋值到RowSource 属性
    • 选项的移除使用 removeitem 方法

    一、combobox

    • listIndex 代表当前选中项的索引:ComboBox1.List(ComboBox1.ListIndex, 2)
    • list 可以获取到具体的某个行列的值,第一个参数是行数,后一个是列数

    二、listbox

    • multiselect 设置是否可以选中多行
    • selected 方法可以判断选项是否选中
    Private Sub ComboBox1_Change()
        Label1.Caption = "选中项的返回值是:" & ComboBox1.Value
    End Sub
    
    Private Sub CommandButton1_Click()
        Dim arr
        arr = Sheets(1).Range("a8:e15")
        ComboBox1.ColumnCount = 5 '设置下拉框显示的列数
        ComboBox1.BoundColumn = 3 '设置选中返回的列的数据
        ComboBox1.TextColumn = 3 '设置选中下拉框的显示列
        ComboBox1.List = arr
    End Sub
    Private Sub CommandButton2_Click()
        ListBox1.RowSource = "Sheet1!A8:E12"
        ListBox1.ColumnCount = 5
        ListBox1.ColumnHeads = True
        ListBox1.BoundColumn = 3
        ListBox1.TextColumn = 2
    End Sub
    
    Private Sub CommandButton3_Click()
        MsgBox ComboBox1.List(ComboBox1.ListIndex, 2)
    End Sub
    
    Private Sub CommandButton4_Click()
        For i = 0 To ListBox1.ListCount - 1
            If ListBox1.Selected(i) Then
                MsgBox ListBox1.List(i, 2)
            End If
        Next i
    End Sub
    

    在这里插入图片描述


    单选、复选、框架、多页

    一、单选、复选、框架

    • 单选和复选必须要通过框架才能成组
    • 不然对于单选框一个窗体的话只能有一个被选中
    Private Sub Frame1_Click()
        If 男.Value Then sr = "you sex:" & 男.Caption
        If 女.Value Then sr = "you sex:" & 女.Caption
        If 中.Value Then sr = "you sex:" & 中.Caption
        TextBox1.Value = sr
    End Sub
    
    Private Sub Frame2_Click()
        Dim sr As String
        sr = "爱好:"
        If 唱歌.Value Then sr = sr & 唱歌.Caption & Chr(10)
        If 跳舞.Value Then sr = sr & 跳舞.Caption & Chr(10)
        If 篮球.Value Then sr = sr & 篮球.Caption & Chr(10)
        TextBox2.Value = sr    
    End Sub
    

    在这里插入图片描述

    二、微调、滚动调节

    • 二者基本的使用都是一致的
    • 都包含 max 、min最大最小值属性
    • 滚动条支持步长 smallChange 和 largeChange 属性,微调只支持前者
    • 对滚动条来说 smallChange 设置的是点击箭头按钮的该表量,largeChange 是设置直接点击滚动条的改变量
    Private Sub ScrollBar1_Change()
        ScrollBar1.SmallChange = 2
        ScrollBar1.LargeChange = 10
        ScrollBar1.Min = 10
        ScrollBar1.Max = 80
        TextBox4.Value = ScrollBar1.Value
    End Sub
    
    Private Sub SpinButton1_Change()
        SpinButton1.SmallChange = 2
        TextBox3.Value = SpinButton1.Value
    End Sub
    

    在这里插入图片描述

    vba 中的Me变量代表代码所在的对象,如果是工作表代码就代表该工作表,如果是窗体代码就代表窗体

    三、多页

    1、图片控件

    Private Sub Image1_Click()
        f = Dir("C:\Users\user\Desktop\*.jpg")
        Do
            ListBox1.AddItem f
            f = Dir
        Loop While (Len(f) <> 0)
    End Sub
    Private Sub ListBox1_Click()
        Dim path As String
        path = "C:\Users\user\Desktop\" & ListBox1.Value
        Image1.Picture = LoadPicture(path)
    End Sub
    

    在这里插入图片描述

    2、多页

    • 选项卡的索引是从 0 开始的
    • style 属性设置为 2 可以隐藏上面的 tab 卡
    Private Sub Label1_Click()
        MultiPage1.Style = 2
    End Sub
    
    Private Sub MultiPage1_Change()
        MsgBox MultiPage1.Value
        MultiPage1.Value = 3
    End Sub
    

    ListView控件


    TreeView控件


    日期和进度条(略)


    综合实例


    命令栏操作(略)
    功能区操作(略)
    代码操作代码(略)

    展开全文
    stanwuc 2020-04-29 16:36:58
  • 直接在设计模式中添加控件,然后在VBA调用控件的代码: 开发——》设计——》插入——》选择Form控件的 CheckBox ActiveSheet.Shapes.Item(1).OLEFormat.Object.Value 上面代码也可以调用图形等对象。获取的...

    直接在设计模式中添加控件,然后在VBA中调用该控件的代码:

    开发——》设计——》插入——》选择Form控件的 CheckBox

    ActiveSheet.Shapes.Item(1).OLEFormat.Object.Value

    上面代码也可以调用图形等对象。获取的值感觉怪怪的,真值是1,假值是-4142

    多个Item则需要逐个遍历然后定位。

    还有一种是添加

    开发——》设计——》插入——》选择ActiveX控件的 CheckBox

     ActiveSheet.CheckBox1.Value
      这个应该可以向下兼容,控件本身功能没有测试和对比过。

    以上两种仅测试ChecBox控件,其它还没有测试。

    展开全文
    toto0805 2021-08-27 12:56:17
  • 1 窗体 form 1.1创建窗体 form (默认名:userform) 和插入模块一样,插入用户窗体即可 1.2 如何运行/显示 窗体? 1.2.1 显示窗体的代码方法 据说,单写一句 userform1.show 也是可以的,因为VBE会自动先 load ...

    前面是自己纯摸索的,这篇跟着书看,我喜欢这种先自学了再看书的感觉

    form的自学方法

    • 属性窗口,按照分类排序
    • 按F1 可以查看帮助

      

    1 窗体 form

    1.1 创建窗体 form (默认名:userform)

    • 在VBE里和插入模块一样,插入用户窗体即可

    1.2 如何运行/显示 窗体?

    1.2.1 显示窗体的代码方法

    • 据说,单写一句 userform1.show 也是可以的,因为VBE会自动先 load 这个窗体
    • load form1    '加载窗体,加载到内存,但不显示
    • form1.show   '显示窗体  (必须得先加载到内存,才可能显示)
    • 这里语法都是用的form1 的name属性,也是load name , unload name,  name.show
    Sub callform1()
    
    Load UserForm1
    UserForm1.Show
    
    End Sub
    

    1.2.2 选中form后,点运行也可以

    1.2.3 出错处理

    • 如果这个窗体不存在,就没法使用对象.show方法,会报错 要求对象
    • 如果load form2 ,form2不存在,也是报错 要求对象,load object 的语法

    1.3 关闭窗体:其实是卸载 unload,注意模式窗体和无模式窗体

    • 只能在窗体运行时,窗体本身的事件去关闭他

    • 一般正常代码代码

    Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Unload UserForm1
    End Sub
    

    1.3.1 一般创建的窗体,无法再运行时被其他VBA代码等关闭,也不能操作EXCEL

    • 下面的代码1毫无意义
    • 因为,窗体在运行的过程中,VBE是挂起的,无法调用
    • 代码1
    • Sub unloadform1()   
      Unload UserForm1      '没办法调用
      End Sub
      

    1.3.2 设置模式窗体 和无模式窗体的方法

    • 默认或者设置    vbmodal 就是有模式的窗体
    • 如果设置   窗体4.Show vbModeless  就是无模式的窗体,并且运行时可以允许其他VBA关闭这个允许的窗体
    •  注意vbmodal 不要写成 vbmodel  
    Sub test10001()
    窗体4.Show vbModal  '或 窗体4.show  注意不要写成 vbmodel
    End Sub
    
    
    Sub test1002()
    窗体4.Show vbModeless
    End Sub
    
    
    Sub test1003()   '因为窗体4设置为modelless,这里才能在其运行时关闭他
    Unload 窗体4
    End Sub
    

    1.4 窗体命名的特殊性

    • VBE中可以创建2个窗体,默认自动命名为  userform1 , userform2
    • 在不同的窗体下
    • 但是事件代码的 窗体名字都叫  userform,并没有被命名为  userform1 , userform2
    • 可能是因为不同窗体是独立的,并且每个窗体和控件组,只能有1个form窗体。

    • 在同一个窗体下
    • 反正只有1个窗体
    • 控件如果在一个窗体内窗体创建多个,是会自动+1命名的。

    1.5 窗体的基本属性

    1.5.1 窗体的名字和标题

    • form1.name           '窗体名字
    • 也是load name ,    unload name,  name.show
    • form1.caption        '只是标题而已,创建的窗体,默认窗体的name=caption 其实是独立的
    Private Sub UserForm_Click()
    Debug.Print Me.Caption
    Debug.Print Me.Name
    End Sub


    1.5.2 窗体的一些感觉会有用的属性

    • name
    • caption
    • picture 相关几个 picturesizemode picturealignment
    • picturealignment                                 '试了下默认center居中,还有topleft等4个角对齐选择。
    • picturesizemode                                 '默认是clip截断(原尺寸),zoom 缩放好像是等比例缩放?  stretch拉伸铺满
    • pictureTiling                                        '默认是否,置为1后为平铺 (可见平铺是单独的属性)
    • font  
    • height  ,width
    • top,left
    • backcolor, bordercolor, borderstyle
    • enabled                                                '是否可用,可以初始化form的
    • mouseicon,mousepointer                     '应该可以设置不同的鼠标外观
    • scrollbars                                              '给form加各种scrollbar

    • 暂时还不清楚的属性
    • righttoleft ?
    • cycle

    1.6  窗体的一些设定

    1.6.1 关于窗体和控件的事件代码中的 me   (可以说类 thisform)

    • me就是指当前的窗体,比如 窗体.name
    • 应该是一定指代parent 窗体,而不是 button这种控件
    • me 比 form.name 好的就是,即使name 改名了,me都是指代 thisform 不用修改
    Private Sub CommandButton1_Click()
    
    Debug.Print Me.Name
    'Debug.Print Me.Caption   ' 如果activeX控件在表单里
    
    End Sub

    1.6.2 切换表单和代码的地方

    1.7 窗体的事件

    1.7.1窗体的initialize事件

    • 窗体作为他下属控件的 parent ,那么 form1_intialize() 事件可以做很多初始化工作
    • 比如,初始化一些 变量值,控件变量的初值
    • 比如初始化一些功能,比如 让一些控件初始是不可用的    =enabled
    Private Sub UserForm_Initialize()
    Me.Caption = ActiveWorkbook.Name & "  的一个窗体"
    
    '设置某控件个初值
    '设置一些按钮初始可用还是不可用
    
    End Sub

    1.7.2  窗体的关闭前触发时间  queryClose

    • 窗体的关闭模式
    • 参数1:closemode
    • closemode=1, 手动点关闭按钮,或者是caption栏右键的菜单
    • closemode=2, VBA代码里用的 unload 语句
    • 参数2:cancel
    • cancel=0(false) 可以关闭
    • cancel=1(true)   取消关闭=不可关
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then        '手动关闭按钮,或者是右键点击caption栏弹出的关闭菜单
       Cancel = True
       MsgBox "不允许手动关闭,请您双击窗体关闭"
    ElseIf CloseMode = 1 Then    '代码unload方法
       Cancel = 0
       Load 窗体2
       窗体2.Show
    End If
    
    End Sub
    
    Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    
    Unload 窗体1
    Unload Me
    End Sub
    

    2 如何在窗体上创建其他控件?

    2.1 窗体上的控件工具栏

    • VBE不友好的地方
    • 和PS喜欢把一些常用工具给叠起来右键才能打开几个一样,对新手不友好
    • VBE里如果要往窗体上加控件,平时写代码的时候是灰色的,必须是切到窗体设计模式时才亮起。。。

    2.2 可添加更多工具控件

    • 还可以添加其他非常见工具控件

    2.3 设置TAB键次序

    • 表单上点右键可以呼出 设置tab 次序
    • 但是好像必须得设置,不能把某些控件给排除掉?  ---经测试,TAB键实际响应时会排除label等不影响。

     

    3 窗体控件的公共属性

    3.1 控件属性的修改

    • 同1个属性,比如 backcolor
    • 可以在属性窗口,静态的修改(只能在运行开始设置1次)
    • 也可以在VBA代码中修改     (理论上运行过程中随时可以修改)

    3.2 控件的公共属性

    • 窗体里的各种控件,有很多共用属性
    • 有很多公共属性
    1. 设置
    2. enabled    可用 
    3. visible     显示
    4. 背景设置
    5. backcolor
    6. backstyle
    7. 提示文本等
    8. controlTipText  鼠标停留时,触发的悬浮窗提示
    9. caption,text,value
    10. 其他呢?
    11. controlSource

    3.3 展示效果

    3.4 对应代码

    Private Sub CommandButton1_Click()
    If Len(TextBox2.Value) <= 6 And Len(TextBox1.Value) <= 8 Then
       MsgBox "输入正确,即将登陆... ..."
       Unload 窗体1
    Else
       MsgBox "用户名和密码输入有误,请重新输入"
    End If
    End Sub
    
    Private Sub Label1_Click()
    
    End Sub
    
    Private Sub Label3_Click()
    
    End Sub
    
    Private Sub Label4_Click()
    
    End Sub
    
    Private Sub Label5_Click()
    
    End Sub
    
    Private Sub Label6_Click()
    
    End Sub
    
    Private Sub Label7_Click()
    
    End Sub
    
    Private Sub TextBox1_Change()
       Debug.Print "TextBox1.Value = " & TextBox1.Value
       If TextBox1.Value <> "" And TextBox2.Value <> "" Then
          CommandButton1.Enabled = True
          CommandButton1.Visible = True
          CommandButton1.Visible = True
          Label5.Visible = False
       Else
          CommandButton1.Visible = False
          Label5.Visible = True
       End If
    End Sub
    
    Private Sub TextBox1_Enter()
    '类似于activeX控件的textbox1_getfocus吧
    TextBox1.ControlTipText = "可以输入数字字母或中文,但必须小于8个字符"
    End Sub
    
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    '类似于activeX控件的textbox1_lostfocus吧
    BackColor = RGB(0, 255, 255)
    If Len(TextBox1.Value) > 8 Then
       Cancel = True
       MsgBox "用户名不能超过8个字符,请重新输入"
       TextBox1.SetFocus
    Else
       TextBox2.SetFocus
    End If
    End Sub
    
    Private Sub TextBox2_Change()
       Debug.Print "TextBox2.Value = " & TextBox2.Value
       If TextBox1.Value <> "" And TextBox2.Value <> "" Then
          CommandButton1.Enabled = True
          CommandButton1.Visible = True
          Label5.Visible = False
       Else
          CommandButton1.Visible = False
          Label5.Visible = True
       End If
    End Sub
    
    Private Sub TextBox2_Enter()
       TextBox2.ControlTipText = "请输入6位以内的任意密码"
    End Sub
    
    Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Len(TextBox2.Value) <= 6 Then
       CommandButton1.SetFocus
    Else
       MsgBox "您输入的密码大于6位,请重新输入"
       TextBox2.SetFocus
    End If
    End Sub
    
    Private Sub UserForm_Click()
    
    End Sub
    
    Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Unload Me
    End Sub
    
    Private Sub UserForm_Initialize()
    Me.Caption = ActiveWorkbook.Name & "  的一个窗体"
    CommandButton1.Enabled = False
    CommandButton1.Visible = False
    '设置某控件个初值
    '设置一些按钮初始可用还是不可用
    End Sub
    
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then        '手动关闭按钮,或者是右键点击caption栏弹出的关闭菜单
       Cancel = True
       MsgBox "不允许手动关闭,请您双击窗体关闭"
    ElseIf CloseMode = 1 Then    '代码unload方法
       Cancel = 0
       Load 窗体2
       窗体2.Show
    End If
    End Sub
    

    4 控件的公共事件:鼠标事件 mouse 类

    4.1 鼠标类属性

    • mouseIcon       :自定义鼠标icon,需要mousePointer设置为custom 99
    • mousePointer    : 鼠标外观,有多种内置外观 

    4.2 鼠标类事件

    • mouseMove  : 
    • mouseDown  :  持续按下的状态
    • mouseUp       : 

    4.3 识别鼠标和shfit等三个按键

    • button 是int  识别鼠标的键位
    • 其中1是左键,2是右键,4是中键
    • shift  是int  识别是否同时按下其他几个键, ctrl shift alt 这几个键
    • shift ,ctrl ,alt 分别是 1 2 4 这几个是基础状态
    • 多个键的组合状态是求和
    • 3=1+2
    • 5=1+4
    • 6=2+4
    • 7=1+2+4

    代码注意点

    • 注意点
    • 命令按钮是 commandbutton2
    • 但是mousemove,mouseDown 等参数是button 且是过程级参数
    • 实际使用时,判断鼠标的时候有判断 shift ctrl等的吗?
    Private Sub CommandButton2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    'button 是int  识别鼠标的键位
    'shift  是int  识别是否同时按下其他几个键, ctrl shift alt 这几个键
    
    
    If Button = 1 Then
        If Shift = 1 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标左键" & "并且" & "按下了shift"
        ElseIf Shift = 2 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标左键" & "并且" & "按下了ctrl"
        ElseIf Shift = 3 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标左键" & "并且" & "按下了shift+ctrl"
        ElseIf Shift = 4 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标左键" & "并且" & "按下了alt"
        ElseIf Shift = 5 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标左键" & "并且" & "按下了shift+alt"
        ElseIf Shift = 6 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标左键" & "并且" & "按下了ctrl+alt"
        ElseIf Shift = 7 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标左键" & "并且" & "按下了shift+alt+ctrl"
        Else
            CommandButton2.ControlTipText = "刚才按下了鼠标左键"                                      '总是会记住上次的状态
        End If
    
    
    ElseIf Button = 2 Then
        If Shift = 1 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标右键" & "并且" & "按下了shift"
        ElseIf Shift = 2 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标右键" & "并且" & "按下了ctrl"
        ElseIf Shift = 3 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标右键" & "并且" & "按下了shift+ctrl"
        ElseIf Shift = 4 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标右键" & "并且" & "按下了alt"
        ElseIf Shift = 5 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标右键" & "并且" & "按下了shift+alt"
        ElseIf Shift = 6 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标右键" & "并且" & "按下了ctrl+alt"
        ElseIf Shift = 7 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标右键" & "并且" & "按下了shift+alt+ctrl"
        Else
           CommandButton2.ControlTipText = "刚才按下了鼠标右键"
        End If
    
    
    ElseIf Button = 4 Then
        If Shift = 1 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮" & "并且" & "按下了shift"
        ElseIf Shift = 2 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮" & "并且" & "按下了ctrl"
        ElseIf Shift = 3 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮" & "并且" & "按下了shift+ctrl"
        ElseIf Shift = 4 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮" & "并且" & "按下了alt"
        ElseIf Shift = 5 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮" & "并且" & "按下了shift+alt"
        ElseIf Shift = 6 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮" & "并且" & "按下了ctrl+alt"
        ElseIf Shift = 7 Then
           CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮" & "并且" & "按下了shift+alt+ctrl"
        Else
           CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮"
        End If
    
    End If
    
    End Sub

    4.4 利用mouseMove,但是需要在form 和 command 的时候分别设置

    • mousemove
    • mousemove到 commandbutton2 的时候是一个颜色
    • 但是没有 mouse--leave 状态可用,所以,当mousemove到表单了就表示 mouse-leave了
    
    Private Sub CommandButton2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    CommandButton2.BackColor = &HC00000
    End Sub
    
    Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    CommandButton2.BackColor = RGB(0, 255, 0)
    End Sub

      

    5 控件的公共事件:键盘事件  key类

    5.1 key类的事件

    • onkey?
    • keydown     ' keydown 和keypress有一定重复,但是keydown主要是指KEY一直按下的状态
    • keyup
    • keypress

    5.2  识别key值

    • key相关函数可以返回 ByVal KeyCode As MSForms.ReturnInteger 
    • 这个是 ascii码
    • 在VBA中, 用chr() 转下即可得到对应的字母,数字,符号等等。
    Private Sub CommandButton3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    MsgBox "这次按下的键是" & Chr(KeyCode)
    End Sub
    
    Private Sub CommandButton3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    
    End Sub
    
    Private Sub CommandButton3_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    
    End Sub

    6 测试发现问题

    • 有个比较奇怪的问题
    • 1是VBE测试窗体,运行不稳定,有时候弹出msgbox点击确定会关闭窗体,有时候不会关闭整个窗体,并没有改代码
    • 为什么点击msgbox 的确定时,会关闭窗体呢?暂时还没查到原因
    展开全文
    xuemanqianshan 2020-03-05 15:52:51
  • weixin_39587238 2020-12-21 11:37:48
  • 5星
    366KB tao60 2010-09-23 14:55:12
  • monkeyzh123 2019-03-19 19:10:29
  • weixin_33811539 2017-08-15 14:43:00
  • weixin_30443895 2015-05-17 16:23:00
  • 4星
    2.12MB deadman163 2011-07-20 22:52:20
  • Di77HaoWenMing 2020-08-22 21:50:36
  • w_dexu 2020-07-13 21:05:56
  • qq2427637322 2018-05-22 11:13:30
  • JPC27 2021-11-23 14:56:21
  • sxjjt 2019-07-31 15:54:05
  • liuxiaofeng1991 2017-06-27 12:38:47
  • Di77HaoWenMing 2020-08-19 23:24:04
  • 4星
    26KB zhkbx 2011-09-26 11:58:09
  • 29.02MB weixin_27076351 2021-06-16 10:37:56
  • ngbshzhn 2021-11-01 15:43:16
  • csdnhxs 2018-05-23 15:23:18
  • taller_2000 2018-08-26 13:40:39
  • ngbshzhn 2021-11-01 14:51:09
  • weixin_30569001 2014-04-11 10:29:00
  • zhanglei2060 2017-06-22 16:43:55
  • HiRuyue 2013-03-28 16:23:38

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,572
精华内容 628
关键字:

vba调用窗体控件