어떤 Excel 개체가 0부터 시작하고 어떤 Excel 개체에서 1부터 시작됩니까?


20

VBA를 사용하여 워크 시트의 첫 번째 시트에 액세스하는 것은 Worksheets (1)입니다. ListBox의 첫 번째 항목은 myListBox.List (0)입니다. 컬렉션이 1 기반이라고 들었지만 컬렉션이 무엇인지 모르겠습니다. VBA 어레이는 0을 기준으로합니다. MID와 같은 Excel 문자열 함수는 1 기반입니다. 0 또는 1을 기반으로하는 것에 대한 일반적인 원칙이 있습니까, 아니면 각각의 목록을 제공 할 수 있습니까?


cell (1,1) .characters (index, length)는 1 기반이지만 cell (1,1) .characters (0, length) = cell (1,1) .characters (1, length) (excel 2013)
seanv507

답변:


24

VBA에는 세 가지 주요 유형의 그룹화 구성이 있으며 색인간에 차이가 있습니다.

  • 컬렉션-1 기반 인덱스

    • 0 기반 예외 : 탭, 페이지, 컨트롤 (ListBox, TextBox)과 같은 UserForm 컬렉션
    • 컬렉션은 논리적으로 관련된 개체의 그룹 (또는 목록)을 포함하는 기본 Excel 개체입니다.
    • 일반적으로 복잡한 오브젝트를 보유하는 데 사용되지만 기본 유형도 보유 할 수 있습니다.
    • 엑셀 컬렉션 :

      • 통합 문서, 시트, 범위, 모양
      • Sheets (1)은 파일에서 첫 번째이고 Cells (1, 1)은 첫 번째 행과 첫 번째 열의 셀입니다.
    • 컬렉션의 주요 장점은 이름으로 요소에 액세스하는 편리함입니다

      • For-Each 루프는 매우 효율적입니다 (어레이의 For-Each 처리와 비교).
      • 그러나 색인으로 개별 항목에 액세스하면 이름으로 액세스하는 것보다 빠릅니다.

  • 배열-기본적으로 0부터 시작하지만 첫 번째 색인은 임의의 숫자로 변경할 수 있습니다 (그림 참조).

    • 배열은 관련된 변수 세트를 포함하는 변수입니다
    • Boolean, Integer, Long, String, Double 등과 같은 기본 데이터 유형에 일반적으로 사용됩니다.
    • 정의되면 한 가지 유형의 항목 만 보유합니다. Dim x() As Long

      • 보다 복잡한 객체를 유지하기 위해 배열을 다음과 같이 정의 할 수 있습니다. Dim x() As Variant
      • 변형은 통합 문서, 시트, 범위, 배열을 포함한 모든 유형의 개체 일 수 있습니다.

        • 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)
    • 배열의 주요 장점은 인덱스로 항목에 액세스 할 때의 성능입니다

      • For index=0 To 10루프 속도보다 For-Each루프

  • 사전-색인화되지 않았지만 키를 사용하여 색인을 시뮬레이션 할 수 있습니다.

    • VBA가 아닌 VB 스크립트 기본 (외부 라이브러리를 사용해야 함)
    • 배열, 컬렉션 또는 기타 사전을 포함한 모든 유형의 객체를 보유 할 수 있습니다.

ListBox는 복잡한 개체이며 0 기반의 Controls 컬렉션을 통해 액세스 할 수 있습니다.

ListBox의 .List () 속성은 0 기반 배열입니다.

기타 노트

  • 0 기반 색인은 다른 언어의 표준입니다

  • VBA는 새로운 사용자가보다 직관적으로 사용할 수 있도록 1 기반 개념을 도입했습니다.

    • Sheet1 ~ Sheet3, 수집 횟수가 3보다 사용하기 쉬움
    • 수집 횟수가 3 인 Sheet0에서 Sheet2로

인덱스의 차이점에 대한 몇 가지 실제 예 :

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

더 읽을 거리 :

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.