Những đối tượng Excel nào là không dựa trên và đối tượng nào là một?


17

Sử dụng VBA để truy cập trang tính đầu tiên trong bảng tính là Bảng tính (1). Mục đầu tiên trong ListBox là myListBox.List (0). Tôi nghe nói Bộ sưu tập dựa trên 1 nhưng tôi không biết chúng là gì. Mảng VBA dựa trên 0. Các hàm chuỗi Excel như MID dựa trên 1. Có một nguyên tắc chung như những gì dựa trên 0 hoặc 1, hoặc bạn có thể cung cấp một danh sách của mỗi?


ô (1,1) .char character (index, length) là 1 dựa nhưng thực hiện một số loại cắt ranh giới sao cho ô (1,1) .char character (0, length) = cell (1,1) .char character (1, chiều dài) (excel 2013)
seanv507

Câu trả lời:


21

Có 3 loại cấu trúc nhóm chính có sẵn trong VBA, với sự khác biệt giữa các chỉ mục

  • Bộ sưu tập - Chỉ mục dựa trên 1

    • Ngoại lệ dựa trên 0: Bộ sưu tập UserForm như Tab, Trang, Điều khiển (ListBox, TextBox)
    • Bộ sưu tập là các đối tượng Excel gốc có chứa các nhóm (hoặc danh sách) các đối tượng liên quan đến logic
    • Thường được sử dụng để giữ các đối tượng phức tạp, nhưng cũng có thể giữ các loại cơ bản
    • Bộ sưu tập Excel:

      • Workbook, Sheets, Ranges, Shapes
      • Trang tính (1) là trang đầu tiên trong tệp, Ô (1, 1) là ô trong Hàng đầu tiên và Cột đầu tiên
    • Ưu điểm chính của bộ sưu tập là sự tiện lợi của việc truy cập các yếu tố theo tên

      • Vòng lặp For-Each rất hiệu quả (so với xử lý For-Each mảng)
      • Truy cập các mục riêng lẻ theo chỉ mục, nhanh hơn so với truy cập chúng theo tên

  • Mảng - dựa trên 0 theo mặc định, nhưng chỉ mục đầu tiên có thể được thay đổi thành bất kỳ số nào (dưới đây minh họa)

    • Mảng là các biến chứa một tập hợp các biến liên quan
    • Thường được sử dụng cho các kiểu dữ liệu nguyên thủy như Boolean, Integer, Long, String, Double, v.v.
    • Khi được xác định, nó sẽ chỉ giữ một loại vật phẩm: Dim x() As Long

      • Để giữ các đối tượng phức tạp hơn, một mảng có thể được định nghĩa là Dim x() As Variant
      • Các biến thể có thể là bất kỳ loại Đối tượng nào, bao gồm Sổ làm việc, Trang tính, Phạm vi, Mảng

        • Dim x As Variant: x = Array(1) '1 Variant variable containing 1 array
        • Dim y(2) As Variant '1 Variant array containing 3 arrays
        • y(0) = Array(1): y(1) = Array(2): y(2) = Array(3)
    • Ưu điểm chính của mảng là hiệu năng khi truy cập các mục theo chỉ mục

      • For index=0 To 10vòng lặp nhanh hơn For-Eachvòng lặp

  • Từ điển - không được lập chỉ mục, nhưng các chỉ mục có thể được mô phỏng bằng Khóa

    • Bản địa của VB Script, không phải VBA (phải sử dụng Thư viện bên ngoài)
    • Có thể chứa bất kỳ loại đối tượng nào, bao gồm Mảng, Bộ sưu tập hoặc Từ điển khác

ListBox là một đối tượng phức tạp và có thể được truy cập thông qua bộ sưu tập Điều khiển dựa trên 0

Thuộc tính .List () của ListBox là mảng dựa trên 0

Ghi chú khác

  • Các chỉ mục dựa trên 0 là tiêu chuẩn cho các ngôn ngữ khác

  • VBA đã giới thiệu khái niệm dựa trên 1 để làm cho nó trực quan hơn cho người dùng mới:

    • Sheet1 đến Sheet3, với bộ sưu tập Đếm 3 dễ sử dụng hơn
    • Sheet0 đến Sheet2, với bộ sưu tập Đếm 3

Một số ví dụ thực tế về sự khác biệt giữa các chỉ mục của chúng:

Public Sub vbaCollections()
    Dim c As New Collection     '1-based index

    c.Add Item:="a", Key:="1"   'index 1; Key must a String
    c.Add Item:="b", Key:="2"   'index 2
    c.Add Item:="c", Key:="3"   'index 3

    Debug.Print c.Count         '3;   Items in index sequence: a,b,c, Keys: "1","2","3"
    Debug.Print c.Item(1)       'a;   not available for Dictionaries
    'Debug.Print c.Key("1")     'invalid, so is: c.Key(1)

    c.Remove Index:=2
    Debug.Print c.Count         '2;   items in index sequence: a,c, Keys: "1","3"
    'c.Remove Item:="c"         'invalid, so is: c.Remove Key:="3"

    'c.Add Item:="c", Key:="3", Before:=1   'Key must be unique - Error
    c.Add Item:="c", Key:="5", Before:=1    'allows duplicate Item
    Debug.Print c.Count         '3;   items in index sequence: c,a,c, Keys: "5","1","3"
End Sub

Public Sub vbaArrays()
    Dim a() As Long, b(3) As Long   'Arrays default to "Option Base {0 | 1}"
    Dim c(0 To 0)                   'if "Option Base" not defined, it defaults to 0
    Dim ar(1) As Worksheet: Set ar(0) = Worksheets(1)   'array with 1 Worksheets object

    ReDim a(3)          'creates an array of 4 elements; indexes 0,1,2,3
        Debug.Print "LB: " & LBound(a) & ", UB: " & UBound(a)   'LB: 0, UB: 3
        Debug.Print UBound(a) - LBound(a)                       '3, array b() is the same

    'even whith "Option Base 1", the following still default to 0
    Dim v As Variant:  v = Split("A B")         'array with 2 items: v(0) = "A", v(1) = "B"
    'UserForm1.ListBox1.List = Array("Test")    'array with 1 item: .List(0,0) = "Test"

    ReDim a(0 To 3)     'creates an array of 4 elements; indexes 0,1,2,3
    a(0) = 1:   a(1) = 2:   a(2) = 3    'a(3) defaults to 0

        Debug.Print "LB: " & LBound(a) & ", UB: " & UBound(a)   'LB: 0, UB: 3
        Debug.Print UBound(a) - LBound(a)                       '3; offset index by -1

    ReDim a(1 To 3)     'creates an array of 3 elements; indexes 1,2,3
    a(1) = 1:   a(2) = 2:   a(3) = 3

        Debug.Print "LB: " & LBound(a) & ", UB: " & UBound(a)   'LB: 1, UB: 3
        Debug.Print UBound(a) - LBound(a)                       '2; offset count by +1

    ReDim a(5 To 7)     'creates an array of 3 elements; indexes 5,6,7
    a(5) = 1:   a(6) = 2:   a(7) = 3

        Debug.Print "LB: " & LBound(a) & ", UB: " & UBound(a)   'LB: 5, UB: 7
        Debug.Print UBound(a) - LBound(a)                       '2; offset count by +1

    ReDim a(-3 To -1)   'creates an array of 3 elements; indexes -3,-2,-1
    a(-3) = 1:  a(-2) = 2:  a(-1) = 3

        Debug.Print "LB: " & LBound(a) & ", UB: " & UBound(a)   'LB: -3, UB: -1
        Debug.Print UBound(a) - LBound(a)                       '2; offset count by +1
End Sub

Public Sub vbsDictionaries()
    Dim d As Object         'not indexed (similar to linked lists)
    Set d = CreateObject("Scripting.Dictionary")    'native to VB Script, not VBA

    d.Add Key:="a", Item:=1 'index is based on Key (a, b, c)
    d.Add Key:="b", Item:=2
    d.Add Key:="c", Item:=3
    Debug.Print d.Count     '3; Keys: a,b,c, Items: 1,2,3

    Debug.Print d(1)        'output is empty ("") - adds new element: Key:="1", Item:=""
    Debug.Print d.Count     '4; Keys: a,b,c,1, Items: 1,2,3,Empty
    Debug.Print d("a")      '1
    Debug.Print d(1)        'output is Empty ("") from element with Key:="1"

    'd.Add Key:="b", Item:=2        'attempt to add existing element: Key:="b" - Error

    'd.Keys  - 0-based array (not available for Collections)
    'd.Items - 0-based array (not available for Collections)

    d.Remove d.Keys()(1)            'remove element Item:=2 (Key:="b")
        Debug.Print d.Count         '3; Keys: a,c,1, Items: 1,3,""
    d.Remove d.Items()(0)           'remove Items element 0 (Key:="1", Item:="")
        Debug.Print d.Count         '2; Keys: a,c, Items: 1,3
    d.Remove "c"                    'remove element Key:="c" (Item:=3)
        Debug.Print d.Count         '1; Keys: a, Items: 1

    d.Add Key:="c", Item:=3
        Debug.Print d.Count         '2; Keys: a,c, Items: 1,3

    'd.Remove d.Items()(0)          'invalid
    Debug.Print d.Items()(d.Count - 1)  '3
    d.Remove d.Keys()(d.Count - 1)  'remove last element; access last Key by Key
        Debug.Print d.Count         '1; Keys: a, Items: 1

    Debug.Print d.Exists("a")       'True (not available for Collections)
    Debug.Print d.Exists(2)         'False
End Sub

Đọc thêm:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.