张亦Excel VBA——基础篇

'张亦Excel VBA——基础篇
'写给每一个想学VBA但又无从下手的人
'由于工作原因,笔者自学了VBA,以下便是学习过程中写的测试样例并做了注释,个人觉得对于有开发基础的朋友来说下面的样例很好理解,如果没有开发基础可能会多用一些时间来学习,其实VBA并不难,关键是要自己动手写。
'本文并无商业目的,仅供大家参考,如果发现有错误或者想一起沟通交流VBA可以访问我的微博:【http://www.weibo.com/zychere】
Option Explicit '强制声明变量
Public str0 As String '声明公共变量

'给变量赋值
Public Sub mysub() '注意:如果声明成private则只能在模块内部调用
    Dim str1 As String '此处定义变量还可以用以下方式:1、Dim str1 As String * 2
                                                     '2、Dim str1$
                                                     '3、Dim str1 As String,str2 as Integer
    str1 = "test" '这里前面省略了"Let"
    Const str2 As Single = 3.14 'str2是常量,值不能修改
    MsgBox str2
End Sub

'一维数组
Public Sub mysub2()
    Dim array1(1 To 50) As String '声明数组,也可以写成Dim array1(50) As String
    array1(1) = "a" '给数组赋值
    
    Dim i As Integer
    For i = 1 To 10 '循环给数组赋值
    array1(i) = i
    MsgBox array1(i)
    Next
End Sub

'二维数组
Public Sub mysub3()
    Dim array1(1 To 10, 1 To 20) As String '定义二维数组也可以写成Dim array1(10,20)
    array1(1, 3) = "二维数组测试"
    MsgBox array1(1, 3)
End Sub

'动态数组、Array函数创建数组、Range对象创建数组、UBound/LBound、Join、Transpose
Public Sub mysub4()
    Dim array1() As String
    Dim n As Long
    n = Application.WorksheetFunction.CountA(range("A:A")) '统计有多少个非空单元格,常用Application方法
    ReDim array1(n) As String
    '-----------------------------------------------------------------------------
    Dim array2() As Variant '不加As Variant和前面这句话效果是一样的
    array2 = Array(1, 2, 3, 4, 5)
    'MsgBox array2(0)
    '-----------------------------------------------------------------------------
    Dim array3() As Variant 'A1:C3必须有值
    array3 = range("A1:C3").Value '注意:用这种方式赋值时,数组是二维数组,即使是这样array3 = Range("A1:A1").Value
    range("E1:G3").Value = array3 '注意:利用这种方式给单元格赋值,array3的属性必须是Vaiant
    '-----------------------------------------------------------------------------
    MsgBox UBound(array3) & "_" & LBound(array3)
    '-----------------------------------------------------------------------------
    Dim txt As String
    txt = Join(array2, "_")
    'MsgBox txt
    '-----------------------------------------------------------------------------
    '将数组中的值批量写入不同的单元格,常用Application方法
    range("H1:H9").Value = Application.WorksheetFunction.Transpose(array2)
End Sub

'比较运算符
Public Sub mysub5()
    'MsgBox Range("A1") Like "a*"
    MsgBox Worksheets("Sheet1").range("A1") Is Worksheets("Sheet1").range("A1") '?这里不是很明白
End Sub

'内置函数
Public Sub mysub6()
    MsgBox "现在时间是:" & Time()
End Sub

'if...else...then
Public Sub mysub7()
    Dim array1() As Variant
    Dim i As Integer
    array1 = Array(1, 2, 3, 4, 5) '利用Array函数创建数组,前面提到过
    
    For i = 0 To 4
        If array1(i) > 3 And array1(i) < 5 Then
            MsgBox "4"
        Else
            MsgBox "<>4" '这里把and替换成&也可以
        End If
    Next
        
End Sub

'稍微复杂一点的if...else...并和for循环结合
Public Sub mysub8()
    Dim num As Integer
    Dim array1 As Variant
    Dim i As Integer
    array1 = Array(1, 2, 3, 4, 5)
    For i = 0 To 4 '开始for循环,注意这里最后还可以加一个[step 步长值]
        num = array1(i)
        If num > 0 Then '开始外层if判断(是否大于0)
            MsgBox "the number is positive number"
            If num = 5 Then '开始内层if判断(具体的数字)
                MsgBox "num=5"
            ElseIf num = 4 Then
                MsgBox "num=4"
            ElseIf num = 3 Then
                MsgBox "num=3"
            ElseIf num = 2 Then
                MsgBox "num=2"
            ElseIf num = 1 Then
                MsgBox "num=1"
            End If
        Else
            MsgBox "the number is nagtive number"
        End If
    Next
End Sub

'select case语句,这里就是类似java中的switch语句
Public Sub mysub9()
    Dim num As Integer
    num = 5
    Select Case num
        Case Is > 0
            MsgBox "the number is positive number"
        Case Is < 0
            MsgBox "the number is nagtive number"
    End Select
End Sub

'do...while语句(循环条件为true,则运行Loop之前的代码)
Public Sub mysub10()
    Dim i As Integer
    i = 1
    Do While i < 5
        MsgBox i
        i = i + 1
    Loop
End Sub

'do...until语句(循环条件为false,则运行Loop之前的代码)
Public Sub mysub11()
    Dim i As Integer
    i = 1
    Do Until i > 5
        MsgBox i
        i = i + 1
    Loop
End Sub

'for each...next(循环次数未知的情况下使用)
Public Sub mysub12()
    Dim sheet1 As Worksheet
    Dim cell1 As range '注意:cell其实是range对象
    Dim i As Integer '用来循环单元格
    Set sheet1 = Worksheets("Sheet1") '注意:给对象变量赋值使用SET,SET 不能省略。
    i = 1
    For Each cell1 In sheet1.range("A1:A" & sheet1.Application.WorksheetFunction.CountA(range("A:A"))) '这里的意思是从A1找到本列最后一个非空单元格,常用Application方法
        Set cell1 = sheet1.Cells(i, "A")
        MsgBox cell1
        i = i + 1
    Next
End Sub

'with语句
Public Sub mysub13()
    Worksheets("Sheet1").Cells(1, "A") = "with测试123"
    With Worksheets("Sheet1").Cells(1, "A").Font
    .Name = "黑体"
    .Bold = True
    .ColorIndex = 5
    End With
End Sub

'参数测试_定义
Public Sub mysub14(ran As range)
    ran = 100
    'MsgBox i & " test"
End Sub


'参数测试2_实现
Public Sub mysub15()

    Dim r As range
    Set r = range("A1:A3")
    Call mysub14(r)  '注意:如果调用有参数的过程必须加call关键词,如果不加则必须去掉后面的括号!
    'MsgBox TypeName(r)
End Sub

'删除非活动的worksheet
Public Sub mysub16()
    Dim sheet As Worksheet
    Application.DisplayAlerts = False '常用Application方法:屏蔽显示警告提醒
    For Each sheet In Worksheets
        If sheet.Name <> ActiveSheet.Name Then
            sheet.Delete
        End If
    Next
End Sub


'对文件的操作
Public Sub mysub17()
    Dim str As String
    str = ThisWorkbook.FullName & "-----" & ThisWorkbook.Path
    MsgBox str
    '下面是文档激活的操作
    Workbooks("aaa.xlsx").Activate '激活aaa.xlax
    MsgBox ActiveWorkbook.Name '& "_____________" & ThisWorkbook.Name
    Workbooks("test.xlsx").Activate '激活test.xlsx
    MsgBox ActiveWorkbook.Name
    '下面是打开关闭的操作
    MsgBox Dir("D:\test.xlsx") '判断文件是否存在,一般同时用Len()函数确定文件名长度
    Workbooks.Add ("D:\test.xlsx") '新建excel文档,如果不加参数就是新建一个空文档
    Workbooks.Open ("D:\test.xlsx") '打开一个excel文档
    ThisWorkbook.Save '保存当前文档,类似的方法还有saveas+路径
    this.workboos.Close '关闭当前文档
    Worksheets.Add '创建新的sheet,和workbook同理,可以添加before或者after标签
    Worksheets("Sheet1").Name = "测试修改名称"
    
End Sub

'文档复制操作,这个经常用所以单列出来
Public Sub mysub18()
    Worksheets("测试修改名称").Copy before:=Worksheets("测试修改名称")
End Sub

'range之——关于Offset和Resize
Public Sub mysub19()
    Cells(1, 1).Offset(2, 5) = "offset test" '为下2右5单元格复制
    range("A2").Resize(1, 4).Select '重新选择range范围
End Sub

'range之——UsedRange
Public Sub mysub20()
    Dim sht As Worksheet
    Set sht = Application.Workbooks("aaa.xlsx").Worksheets("test")
    sht.UsedRange.Select '选择sheet中所有已用单元格
    range("D2").End(xlDown).Select '选择D列最后一个已用单元格
    MsgBox sht.range("D1").End(xlDown).Row '得到range范围列的已用行数
    range("A1").Clear '清除
End Sub

'range之——cut
Public Sub mysub21()
    range("A1:B2").Cut Destination:=range("D3:E4") ' 指定复制粘贴位置
End Sub

'遍历文件夹中的所有excel文件
Public Sub mysub22()
    Dim filename As String
    filename = Dir("D:\*.xlsx")
    Do While filename <> ""
        MsgBox filename
        filename = Dir
    Loop
End Sub



'下面开始是函数function相关,其实和sub是类似的,只是多了返回值
'第一个function,显示当前时间
Public Function myfun1()
    myfun1 = Time() '这里其实就是函数的返回值
End Function

'统计单元格中红色个数的函数
Public Function myfun2(user_range As range) '这里的参数是用户选择
    Application.Volatile True '注意:标记函数为易失性函数,常用Application方法
    Dim range As range
    For Each range In user_range
        If range.Interior.ColorIndex = 3 Then
        myfun2 = myfun2 + 1
        End If
    Next range
End Function

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值