美文网首页VBA
4、[VBA入门到放弃笔记]工作簿、工作表、单元格的引用

4、[VBA入门到放弃笔记]工作簿、工作表、单元格的引用

作者: 叶知行 | 来源:发表于2017-06-06 09:51 被阅读124次

    【工作簿集合Workbooks】

    • 工作簿集合Workbooks:由当前所有在内存里打开的工作簿Workbook对象组成。
    • 如当前一共打开了两个工作簿,这两个工作簿就组成了Workbooks集合。可以在视图--切换窗口里看到。

    【工作簿的引用方法】

    • 1.使用索引:第一个打开的工作簿是1号,第二个打开的工作簿是2号,按打开先后顺序(电脑自动)给予号码。不推荐这种方式引用工作簿,容易混乱。
    Sub 引用工作簿()
        Dim WBK As Workbook
       Set WKB = Workbooks(1)'括号里写索引号
        Debug.Print WKB.Name
    End Sub
    
    • 2.使用工作簿名称引用:
    Sub 引用工作簿1()
        Dim WBK As Workbook
       Set WKB = Workbooks("毛泽东思想.xlsm")
        Debug.Print WKB.Name
    End Sub
    

    【Sheets集合】:在Wokrbook对象里,Sheets集合的成员一般是Worksheet工作表对象和Chart图表对象。为兼容旧版的Excel,也可以是DialogSheets对象,Excel4MacroSheets对象等。见下图。

    Paste_Image.png

    【引用工作表方法】

    • 1.使用索引引用工作表:工作表的索引就是工作表从左到右的顺序。索引与工作表的位置有关系,位置变了其索引也变,和名称没有一毛钱的关系。如图,根据索引来提取工作表的名称。
    Paste_Image.png
    Sub 工作表索引()
        Dim i As Integer
        For i = 1 To 5
            Debug.Print Worksheets(i).Name '用索引表示工作表
        Next
    End Sub
    
    Paste_Image.png
    • 将工作表的位置调整一下,如下图
    Paste_Image.png
    • 再执行上面的代码:工作表索引,结果如下图
    Paste_Image.png
    • 如工作簿索引一样,一般也不推荐用工作表索引来表示工作表,容易混乱。
    • 当工作簿中只有工作表没有图表工作表的时候,Worksheets(索引)和Sheets(索引)表示同一个工作表,而存在图表工作表时,Sheets(索引)可能会表示图表工作表。如下图中工作簿有这么些表......
    Paste_Image.png
    • Worksheets(2)和Sheets(2)并不表示同一个对象。


      Paste_Image.png

    • 2.使用名称引用工作表
    
    Sub 工作表名称()
    '[周星星]这个工作表的单元格A1值为"周星星",单元格A2值为"吴孟达"
        Sheets("周星星").Range("a1") = "周星星"
        Worksheets("周星星").Range("a2") = "吴孟达"
        '和索引对比
        Sheets(3).Range("b1") = "周星星"
        Worksheets(2).Range("b2") = "吴孟达"
    End Sub
    
    • 以上四种方法都引用‘周星星’工作表,并对其中的单元格赋值。
    Paste_Image.png
    • 3.使用工作表的CodeName引用工作表
    工作表CodeName

    图中红色框内的就是工作表的CodeName,这个CodeName是固定不变的,建立工作表的时候,电脑就分配了的,不能修改。改变工作表的名称,CodeName也不会变。如下图

    Paste_Image.png
    • 下面代码都是引用当前工作簿中同一个工作表--‘周星星’
    Sub 工作表()
    '工作表名称引用
        Sheets("周星星").Range("a1") = "周星星"
        Worksheets("周星星").Range("a2") = "吴孟达"
        
        '工作表索引引用
        
        Sheets(3).Range("b1") = "周星星"
        Worksheets(2).Range("b2") = "吴孟达"
        
        'CodeName引用
        Sheet1.Range("c1") = "周星星"
        Sheet1.Range("c2") = "吴孟达"
    End Sub
    
    CDDENAME

    总结:推荐使用CodeName和名称来引用工作表.


    【引用单元格】单元格VBA一般用Range或Cells来引用。

    • 完整的写法应该是:工作簿.工作表.单元格
    • 如下面语句是让[当前活动工作表]中的单元格A1的值为‘周星星’,它并没有具体指定是那一个工作表。当前正在使用的工作表是[周星星],运行代码,则工作表[周星星]的单元格A1为‘周星星’;切换到工作表[吴孟达],运行代码,则工作表[吴孟达]的单元格A1为‘周星星’......
    Range("a1") = "周星星"
    
    • 因此有必要指定工作表
    Sheets("周星星").Range("a1") = "周星星"
    
    • 假如当前打开了2个或2个以上的工作簿,每个工作簿都有名称为[周星星]的工作表,那么运行上面的代码(同上),编辑的是当前正在使用的工作簿中工作表[周星星]单元格A1,因此有必要指定工作簿。
    Workbooks("马克思主义.xlsm").Sheets("周星星").Range("a1") = "周星星"
          Workbooks("邓小平理论.xlsm").Sheets("周星星").Range("a1") = "周星星"
    
    • 是否需要完整的写法,可视乎实际情况而定。在写代码时候,忘记指定工作簿工作表这个问题上镜的机率很高,要注意。

    • 单元格的Range属性和Cells属性
    • 下面代码功能是:代替鼠标选中单元格A1
    Range("a1").Select
    Cells(1, 1).Select
    
    • Range直接引用的是平常常使用的单元格名称(字母不区分大小写,注意不要漏双引号),Cells是通过 (行、列)的坐标定位来确定单元格(位置),A1单元格的坐标是第1行第1列,C10单元格的坐标是第10行第3列.
    • Cells(行,列),其中行,列一般是用数字来表示;当然,列也可以用字母(不区分大小写,带双引号)来表示。下面代码都是选中单元格C10.
    Cells(10, 3).Select
    Cells(10, "C").Select
    
    • 表示单元格区域
    '单元格A1:D10
    Range("a1:d10").Select '方法1
    Range("a1", "d10").Select '方法2
    
    • 再来看下面的代码,将上面代码方法2的"a1", "d10"单元格分别用Cells表示。Cells(1, 1)为单元格A1,Cells(10, 4)为单元格D10。如下
    Range(Cells(1, 1), Cells(10, 4)).Select '同样表示单元格A1:D10
    
    • 不连续的单元格选择,运行代码如下图1.1
    Range("a1:a3, d6:e8, j2").Select
    
    1.1
    • 非活动工作表中的单元格引用:上面的代码都没有指定单元格属于具体的工作表,在活动的工作簿中,我们只需要指定具体的工作表就能引用单元格,而不需要去激活工作表。如下面代码,不需要激活[周星星]工作表就可以通过代码使其单元格A1的值为‘周星星’。
    Sheets("周星星").Range("a1")="周星星"
    
    • 常犯的错误
    • 1.假设要对Sheet1工作表的A1:A10求和,调用Sum函数
    Paste_Image.png
    Sub 求和()
        MsgBox Application.WorksheetFunction.Sum(Range("a1:a10"))
    End Sub
    
    • 2.当我们正在操作工作表Sheet1时,此代码没有问题;一旦切换到工作表Sheet2,再运行代码,则会得不到想要的结果。
    gggg.gif
    '指定工作表Sheets("sheet1"),再运行代码,结果就对了。
    MsgBox Application.WorksheetFunction.Sum(Sheets("sheet1").Range("a1:a10"))
    
    hhh.gif
    • 题目:将下表中科目分数大于等于90的改为优秀。上次我们用For each Next写的,这次改动一下。
    姓名 语文 数学 英语 化学 物理 生物
    A 90 63 73 49 98 58
    B 56 84 51 61 48 72
    C 43 42 98 96 82 70
    D 86 84 49 74 66 96
    E 44 86 72 62 100 94
    Sub 优秀()
        Dim x As Integer, y As Integer
        For x = 2 To 6 '遍历行,确定Cells的行坐标
            For y = 2 To 7 '遍历列,确定Cells的列坐标
                If Cells(x, y).Value >= 90 Then '如果单元格的值大于等于90
                    Cells(x, y).Value = "优秀" '则值改为优秀
                End If
            Next y
        Next x
    End Sub
    
    • 上面代码用了两个For....Next,一个For循环嵌套在另一个For循环里面,这叫循环嵌套。这个代码的运行路线是:从B2单元格开始,C2,D2,E2...G2,遍历完第2行,然后开始从B3开始遍历第三行,完毕,从B4开始遍历第4行....直到结束。
    • 这里单元格没有指定工作表,则将代码放到对应的工作表中。结果如图
    Paste_Image.png
    • 将代码略有改动,用F8本地窗口,运行代码。红色标记遍历的路线。看下面GIF.
    hhhhh.gif
    Sub 优秀()'辅助代码可以删除,不影响。
        Dim x As Integer, y As Integer
        For x = 2 To 6 '遍历行,确定Cells的行坐标
            For y = 2 To 7 '遍历列,确定Cells的列坐标
                X的值 = x  'x的值从2到6,辅助代码
                y的值 = y   'y的值从2到7,辅助代码
                Cells(x, y).Interior.ColorIndex = 3'辅助代码,背景颜色设为红色
                If Cells(x, y).Value >= 90 Then '如果单元格的值大于等于90
                    Cells(x, y).Value = "优秀" '则值改为优秀
                End If
            Next y
       Next x
    End Sub
    

    相关文章

      网友评论

        本文标题:4、[VBA入门到放弃笔记]工作簿、工作表、单元格的引用

        本文链接:https://www.haomeiwen.com/subject/rpkifxtx.html