Objek Excel mana yang berbasis nol dan mana yang berbasis satu?

20

Menggunakan VBA untuk mengakses lembar pertama dalam lembar kerja adalah Lembar Kerja (1). Item pertama dalam ListBox adalah myListBox.List (0). Saya mendengar bahwa Koleksi berbasis 1 tetapi saya tidak tahu apa itu. Array VBA berbasiskan 0. Fungsi string Excel seperti MID berbasis 1. Apakah ada prinsip umum tentang apa yang didasarkan pada 0 atau 1, atau bisakah Anda memberikan daftar masing-masing?

Noumenon
sumber
sel (1,1) .karakter (indeks, panjang) adalah 1 berdasarkan tetapi melakukan semacam kliping batas sehingga sel (1,1) .karakter (0, panjang) = sel (1,1) .karakter (1, panjang) (excel 2013)
seanv507

Jawaban:

24

Ada 3 jenis utama konstruksi pengelompokan yang tersedia di VBA, dengan perbedaan antara indeks

  • Koleksi - indeks berbasis 1

    • Pengecualian berbasis 0: koleksi UserForm seperti Tab, Halaman, Kontrol (ListBox, TextBox)
    • Koleksi adalah objek Excel asli yang berisi grup (atau daftar) objek yang berhubungan secara logis
    • Biasanya digunakan untuk memegang benda-benda kompleks, tetapi dapat menampung tipe dasar juga
    • Koleksi Excel:

      • Buku Kerja, Lembar, Rentang, Bentuk
      • Lembar (1) adalah yang pertama di file, Sel (1, 1) adalah sel di Baris pertama dan Kolom pertama
    • Keuntungan utama dari koleksi adalah kemudahan mengakses elemen dengan nama

      • Untuk-Setiap loop sangat efisien (dibandingkan dengan Untuk-Setiap pemrosesan array)
      • Mengakses setiap item berdasarkan indeks, lebih cepat daripada mengaksesnya dengan nama

  • Array - berbasis 0 secara default, tetapi indeks pertama dapat diubah ke nomor apa saja (diilustrasikan di bawah)

    • Array adalah variabel yang berisi sekumpulan variabel terkait
    • Biasanya digunakan untuk tipe data primitif seperti Boolean, Integer, Long, String, Double, dll
    • Setelah ditentukan, ia hanya akan menyimpan satu jenis item: Dim x() As Long

      • Untuk menahan objek yang lebih kompleks, sebuah array dapat didefinisikan sebagai Dim x() As Variant
      • Varian dapat berupa semua jenis Objek, termasuk Buku Kerja, Lembar, Rentang, Array

        • 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)
    • Keuntungan utama dari array adalah kinerja ketika mengakses item berdasarkan indeks

      • For index=0 To 10loop lebih cepat dari For-Eachloop

  • Kamus - tidak diindeks, tetapi indeks dapat disimulasikan dengan Kunci

    • Asli ke VB Script, bukan VBA (harus menggunakan Perpustakaan eksternal)
    • Dapat menampung semua jenis objek termasuk Array, Koleksi, atau Kamus lainnya

ListBox adalah objek yang kompleks dan dapat diakses melalui koleksi Kontrol berbasis 0

Properti .List () dari ListBox adalah array berbasis 0

Catatan lain

  • Indeks berbasis 0 adalah standar untuk bahasa lain

  • VBA memperkenalkan konsep berbasis 1 untuk membuatnya lebih intuitif bagi pengguna baru:

    • Sheet1 ke Sheet3, dengan koleksi Hitungan 3 lebih mudah digunakan daripada
    • Sheet0 ke Sheet2, dengan koleksi Hitungan 3

Beberapa contoh praktis perbedaan antara indeks mereka:

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

Bacaan lebih lanjut:

paul bica
sumber