分享

Excel VBA 入门(1)

 漫步梨园 2019-03-31

Excel VBA的语法就不多说了, 从最重要的Application开始

Application对象代表Excel程序本身, 对Application的操作会直接影响Excel程序

废话不多说, 直接上代码

先来介绍一下Application的常用属性:

1.ActiveCell 当前激活的(1个)单元格, 一个Range对象, 注意是一个格子

  1. Dim myRange As Range
  2. '下述四种写法等同
  3. Set myRange = Application.ActiveCell '如果窗口没有显示工作表,则此属性无效
  4. Set myRange = ActiveWindow.ActiveCell
  5. Set myRange = ActiveCell '懒人写法, 后续会有很多Application下的属性可以去掉Application的前缀
  6. Set myRange = Application.ActiveWindow.ActiveCell

从完整写法Application.ActiveWindow.ActiveCell看出, 意思是Excel的当前有一个活动的窗口(工作簿), 里面要有一个表(工作表), 然后要有一个激活的单元格

获取到单元格的Range对象就能对其进行操作了:(语法就不介绍了)

  1. With ActiveCell '获取当前激活的单元格
  2. .Value = '哈哈'
  3. With .Font
  4. .Bold = True
  5. .Italic = True
  6. .Size = 18
  7. End With
  8. End With
把(1个)格子的内容设置为'哈哈', 加粗,斜体,字号18

2. Selection 基本概念和ActiveCell类似, 与之不同的是Selection可以表示多个单元格, 依然是一个Range对象

  1. Dim r As range
  2. Set r = Application.Selection
  3. r.Value = 1
选中的格子都变成1 了

3.ActiveWorkbook 当前激活的一个工作簿,是一个Workbook对象

  1. Dim wb As Workbook
  2. '下述两种写法等同
  3. Set wb = Application.ActiveWorkbook
  4. Set wb = ActiveWorkbook '又是懒人写法

如果当前的Excel是空的, 就是说没有打开任何一个Workbook(工作簿) 上面的wb会是Nothing (VBA里的空)

每个Workbook对象都有一个Application属性, 貌似(Excel对象都有这个属性), 表示该对象所属的Application(这个Application是对象)
  1. Dim app As Application
  2. Dim app2 As Application
  3. Set app = Application
  4. Set app2 = Application.ActiveWorkbook.Application
  5. If app = app2 Then 'I'sure. 这里会输出OK, 说明是同一个Application对象
  6. Debug.Print 'OK' 'Debug.Print 会将后面的文字内容输出到'立即窗口' (如果没看到立即窗口, 请:Ctrl+G)
  7. Else
  8. Debug.Print 'Fail'
  9. End If

4.Workbooks, Worksheets, Sheets

Application.Workbooks用于获取当前打开的(多个)工作簿

  1. For i = 1 To WorkBooks.Count '这里也可以写全Application.WorkBooks.Count
  2. Debug.Print WorkBooks(i).name
  3. Next
Applicaton.Sheets用于获取当前(激活的)工作簿下的所有工作表, 包括图表(Chart)
  1. For i = 1 To Application.Sheets.Count '同样可以偷懒 Sheets.Count 一旦省略前缀基本上都是'激活的'(worksheet或者Workbook)
  2. Debug.Print Application.Sheets(i).name
  3. Next
Application.Worksheets用于获取当前(激活的)工作簿下所有的Sheet表, 不包括其他类型(如:Chart)
  1. For i = 1 To Application.Worksheets.Count
  2. Debug.Print Application.Worksheets(i).name
  3. Next

5. Caption 这个顾名思义, 标题, 而且是Application的Caption, 修改一下试试吧
Application.Caption = 'Haha'
看到Excel标题变了吧, 有原来的 Microsoft Excel 变成了 [你当前打开的Excel的文件名]-Haha

注意一点, 这个可是没有'懒人写法'的吐舌头. 如果你想懒一下 Caption = 'Haha' VBA会把Caption当作一个新变量的

试试下面这个

    Application.Caption = ''

标题复原了.OK

6. Range 上面在提到ActiveCell时说过Range, ActiveCell是一个Range对象, 这里的Range是一个属性, 但它同时也是一个Range对象, 是不是有点晕. 别担心

可以把Application.Range理解为一个方法(或者函数), Application.Range需要一个参数, 来返回参数指定的(n个)单元格, 看个例子先:

Application.Range('A1').Value = 100

这句话, 把Application(就是Excel) 当前激活的Workbook(工作簿)下的激活的Worksheet(工作表)下的Range('A1') (这里就是A1单元格) 的值设置为数字100

完整写法就是:

  1. Dim r As range 'r是一个Range对象
  2. Set r = Application.Range('A1')
  3. r.Value = 100
r 是一个Range对象, Application.Range('A1')返回一个Range对象, 而Application.Range本身是Application的属性

再看看这个:

Application.Range('A1:B2').Value = 'Haha'
这句话, 把上面那一大堆我就不重复了, 设置Range('A1:B2') 的值为文本'Haha' , 这里的Range就不是一个单元格了, 应该是4个: A1, A2, B1, B2(对角线, 看一下Excel就明白)

也许你会问, 这样用Range属性太麻烦了 ,还必须有前面激活的工作簿,工作表, 太不灵活了.

没错, Range属性不仅仅在Application下, 同样也存在于Worksheet下, OK, 聪明的你估计已经想到该怎么写了:

只要获取到了一个我想要的Worksheet对象(工作表), 我就能访问指定的范围Range(...)

    Application.Worksheets('Sheet1').Range('A1').Value = 76000
当然,细心的你也许发现了:这里没有说是哪个Workbook, 没错, 这里的Workbook不是激活的那个Workbook, 而是你在写VBA程序的那个Workbook

7. ScreenUpdating 屏幕更新, 用于设置是否将VBA的执行的中间结果显示在Excel表中

显然, 关闭屏幕更新, 会使得VBA的执行速度更快.

我们可以做个实验, 比较关闭前后的用时.

  1. Dim startTime As Date
  2. Dim endTime As Date
  3. For t = 0 To 1
  4. Application.ScreenUpdating = (t = 1)
  5. startTime = Time
  6. For Each c In ActiveSheet.Columns
  7. If c.Column Mod 2 = 0 Then
  8. c.Hidden = True
  9. End If
  10. Next
  11. endTime = Time
  12. x = (endTime - startTime) * 24 * 60 * 60
  13. If Application.ScreenUpdating Then
  14. Debug.Print 'ScreenUpdating Enabled: ' & x & ' sec.'
  15. Else
  16. Debug.Print 'ScreenUpdating Disabled: ' & x & ' sec.'
  17. End If
  18. Next
可能的输出结果:

ScreenUpdating Disabled: 0 sec.
ScreenUpdating Enabled: 3.99999999999743 sec.

所以,执行复杂操作时很慢, 有可能就是没有关闭ScreenUpdating属性

8. StatusBarDisplayStatusBar  

Application.StatusBar就是Excel的状态栏, 而Application.DisplayStatusBar意思是否显示状态栏,一个Boolean变量

  1. Application.DisplayStatusBar = True
  2. Application.StatusBar = '正在打开文档...'
  3. Application.StatusBar = False '设为False就是恢复Excel状态栏的原来状态


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多