Curso Excel VBA (8): Conceptos básicos del lenguaje Excel VBA: tipos de datos, estructuras de datos

En este artículo, analizamos el tipo de datos y la estructura de datos proporcionada entre los conceptos básicos del lenguaje Excel VBA.

Esta es una continuación del artículo anterior.

Curso Excel VBA (7): Conceptos básicos del lenguaje Excel VBA - Sintaxis

3.3. tipo de datos

3.3.1. tipo de datos básicos

La siguiente tabla resume los tipos de datos admitidos por VB (o VBA). Entre los contenidos de la tabla de la fuente a continuación, la Colección y el Diccionario se explican por separado en "Estructura de datos".

Lista de tipos de datos básicos

fuente: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/data-type-summary

formato de datoscapacidad de almacenamientoalcance
booleano2 bytesVerdadero o Falso
Byte1 byte0 ~ 255
RecopilaciónDesconocidoDesconocido
Moneda (entero escalado)8 bytes-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807
Fecha8 bytes1 de enero de 100 al 31 de diciembre de 9999
(100-01-01 ~ 9999-12-31)
Decimal14 bytes+/-79,228,162,514,264,337,593,543,950,335 sin punto decimal

+/-7.9228162514264337593543950335 con 28 lugares a la derecha del decimal

El número más pequeño distinto de cero es +/- 0.00000000000000000000000000001
DiccionarioDesconocidoDesconocido
Doble (coma flotante de doble precisión)8 bytes-1,79769313486231E308 a -4,94065645841247E-324 para valores negativos

4.94065645841247E-324 a 1.79769313486232E308 para valores positivos
Entero2 bytes-32.768 a 32.767
Largo (Entero largo)4 bytes-2.147.483.648 a 2.147.483.647
Largo largo (Entero LargoLargo)8 bytes-9.223.372.036.854.775.808 a 9.223.372.036.854.775.807

Válido solo en plataformas de 64 bits.
LargoPtr (Entero largo en sistemas de 32 bits, entero LongLong en sistemas de 64 bits)4 bytes en sistemas de 32 bits

8 bytes en sistemas de 64 bits
-2,147,483,648 a 2,147,483,647 en sistemas de 32 bits

-9,223,372,036,854,775,808 a 9,223,372,036,854,775,807 en sistemas de 64 bits
Objeto4 bytesAlguna Objeto referencia
Único (punto flotante de precisión simple)4 bytes-3.402823E38 a -1.401298E-45 para valores negativos

1.401298E-45 a 3.402823E38 para valores positivos
Cuerda (Longitud variable)10 bytes + longitud de cadena0 a aproximadamente 2 mil millones
Cuerda (longitud fija)Longitud de la cadena1 a aproximadamente 65,400
Variante (con números)16 bytesCualquier valor numérico hasta el rango de un Doble
Variante (con personajes)22 bytes + longitud de cadena (24 bytes en sistemas de 64 bits)Mismo rango que para longitud variable Cuerda
Usuario definido (usando Escribe)Número requerido por elementosEl rango de cada elemento es el mismo que el rango de su tipo de datos.

Entre ellos, los tipos de datos más utilizados son Int, Long, String y Boolean.

Los tipos de datos variantes y definidos por el usuario se explican con más detalle a continuación.

Tipo de datos variante

El tipo de datos variante es un tipo de datos especial que puede almacenar y procesar varios tipos de datos. Si se omite el tipo de datos al declarar una variable, se especifica como tipo de datos Variant. Para obtener más información sobre el formato de datos Variant, consulte la URL a continuación.

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/variant-data-type

Para verificar qué tipo de datos almacena una variable Variant durante la ejecución, use la función VarType.

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/vartype-function

construcción

TipoVar(nombrevar)

básico nombrevar El argumento es una variante que contiene variables, excluyendo variables de tipos definidos por el usuario.

retornoformulario

una constantevalorExplicación
vbVacío0Vacío(no inicializado)
vbNulo1Nulo(Datos no disponibles)
vbEntero2esencia
vbLargo3Entero largo
vbSingle4número de punto flotante de precisión simple
vbDoble5número de punto flotante de precisión doble
vbMoneda6valor de la moneda
fecha vb7valor de fecha
vbString8cuerda
vbObjeto9individual
vbError10valor de error
vbBooleano11valor booleano
vbVariante12Variante(variante Arreglousado solamente)
vbDataObject13objeto de acceso a datos
vbDecimal14valor decimal
vbByte17valor de bytes
matriz vb8192Arreglo

Personalmente, no uso bien el formato de datos Variant, y lo uso principalmente cuando leo y escribo datos de hojas a la vez. Para obtener información sobre cómo leer y escribir una gran cantidad de datos de hoja utilizando una matriz de variantes, consulte el artículo a continuación.

Patrón de codificación VBA: bucle de rango - lectura

Patrón de codificación VBA: Bucle de rango - Escritura

Este es un código de ejemplo que usa el tipo de datos Variant. Muestra que puede manejar tipos de datos enteros, cadenas, números reales y fechas.

Sub VariantTest()
    Dim a As Variant '데이터 형식을 생략하면 Variant 형식임
    a = 1: Debug.Print a
    a = "1": Debug.Print a
    a = 1.1: Debug.Print a
    a = CDate("2021-07-31"): Debug.Print a
End Sub

Tipo de datos definido por el usuario

Puede declarar y utilizar tipos de datos definidos por el usuario. Declare el tipo de datos definido por el usuario con la palabra clave 'Tipo' similar a 'estructura' en lenguaje C. Los tipos de datos definidos por el usuario no son objetos, por lo que cuando se declaran, se crea una instancia, se asigna memoria y se pueden ingresar valores.

Para obtener más información sobre el formato de datos definido por el usuario, consulte la siguiente URL.

https://docs.microsoft.com/en-us/office/vba/language/how-to/user-defined-data-type

Los códigos de ejemplo para los tipos de datos definidos por el usuario son los siguientes.

Type EmployeeRecord    ' 사용자 정의 형식을 만듭니다.
    ID As Integer    ' 데이터 형식의 요소를 정의합니다.
    Name As String
    Address As String
    Phone As Long
    HireDate As Date
End Type

Sub CreateRecord()
    Dim MyRecord As EmployeeRecord    ' 변수를 선언합니다.
    MyRecord.ID = 12003    ' 요소에 값을 할당합니다.
    MyRecord.Name = "Andy"
    MyRecord.HireDate = CDate("2021-07-31")
End Sub

3.3.2. estructura de datos

Las estructuras de datos comúnmente utilizadas incluyen Array, Collection y Dictionary. Echemos un vistazo a cada uno.

Formación

Tiene un número fijo de artículos. Dado que no es un objeto, declararlo crea una instancia. Al declarar, se puede especificar el número de dimensiones y el límite inferior y el límite superior de cada dimensión, o las dimensiones y el rango de una matriz se pueden cambiar dinámicamente en tiempo de ejecución. Si especifica solo el número de elementos sin especificar los límites inferior y superior de cada dimensión, el límite inferior es 0 de forma predeterminada. Si se utiliza Option Base 1, el límite inferior predeterminado es 1.

código de ejemplo de declaración

Dim DayArray(50)
Dim Matrix(3, 4) As Integer
Dim MyMatrix(1 To 5, 4 To 9, 3 To 5) As Double

Declare límites inferiores/superiores para cada dimensión, verifique: use LBound, UBound

Dim A(1 To 100, 0 To 3, -3 To 4) 
LBound(A, 1) ->  1,  UBound(A, 1) -> 100 ' 1차원 하한/상한
LBound(A, 2) ->  0,  UBound(A, 2) -> 3   ' 2차원 하한/상한
LBound(A, 3) -> -3,  UBound(A, 3) -> 4   ' 3차원 하한/상한

Cambio de tamaño de dimensión: cambie el tamaño de dimensión de una matriz dinámica con la instrucción Redim.

Dim MyArray() As Integer ' 동적 배열을 선언합니다. 
Redim MyArray(5) ' 5개의 요소를 할당합니다. 
Redim Preserve MyArray(15) ' 15개의 요소로 크기를 변경합니다.

Bucle de artículo (para el siguiente)

'Split & Trim 처리
Public Function SplitTrim(aExpression As String, aDelimeter As String) As String()
    Dim saOut() As String, i As Integer
    saOut = Split(aExpression, aDelimeter)
    For i = LBound(saOut) To UBound(saOut)
        saOut(i) = Trim(saOut(i))
    Next i

    SplitTrim = saOut
End Function

Inicialización: inicialice las variables de matriz con la instrucción Erase.

' 배열 변수를 선언합니다.
Dim NumArray(10) As Integer    ' 정수 배열입니다.
Dim StrVarArray(10) As String    ' 변수 문자열 배열입니다.
Dim StrFixArray(10) As String * 10    ' 고정 문자열 배열입니다.
Dim VarArray(10) As Variant    ' Variant 배열입니다.
Dim DynamicArray() As Integer    ' 동적 배열입니다.
ReDim DynamicArray(10)    ' 저장 공간을 할당합니다.
Erase NumArray    ' 0으로 지정된 각 요소입니다.
Erase StrVarArray    ' 길이가 0인 문자열 ("")로 지정된 각 요소입니다.    
Erase StrFixArray    ' 0으로 지정된 각 요소입니다.
Erase VarArray    ' Empty로 지정된 각 요소입니다.
Erase DynamicArray    ' 배열에 의해 사용되는 빈 메모리입니다.

Recopilación

La clase Collection es similar a una matriz dinámica. Se puede agregar y eliminar un número variable de elementos únicos. porque es un objetoColocar” y “Nueva” palabras clave para crear una instancia. En el lenguaje Visual Basic, al crear una referencia a un objeto o asignar una nueva referencia, debe “ColocarSe debe usar la palabra clave ", y no se necesita la palabra clave "Establecer" al asignar un valor a una variable. Debe distinguir entre el manejo de objetos y variables para evitar errores gramaticales. Puedes cometer errores a menudo, así que ten cuidado.

Consulte la siguiente tabla para ver los códigos de cada tarea, como la declaración de objetos de colección, la creación de instancias y la adición de elementos.

TareaCódigo de muestra
DeclaraciónColección Dim o Col As
Creación de instanciaEstablecer oCol = Nueva colección
Creación de instancia al mismo tiempo que declaraciónDim o Col Como Nueva Colección
Añadir artículooCol.Añadir “Apple”
Acceder al elemento por índiceoCol(1)
Número de itemsoCuentaCol.
Bucle de artículo (para)Dim l tan largo
Para l = 1 a oCol.Count
    Depurar.Imprimir oCol(l)
Próximo
Bucle de artículo (para cada uno)Fruta tenue como variante
Para cada fruta en oCol
    Depurar.Imprimir fruta
Próximo
Eliminar elemento (designar índice)oCol. Quitar(1)
Eliminar instanciaEstablecer oCol = Nada

El código de ejemplo que usa Collection es el siguiente. Como referencia, los elementos de la colección comienzan desde 1.

Sub CollectionTest()
    Dim oCol As Collection
    Set oCol = New Collection
    
    oCol.Add "Apple"
    oCol.Add "Strawberry"
    oCol.Add "Lemon"
    oCol.Add "Banana"
    
    Debug.Print oCol(1)
    Debug.Print oCol.Item(1)
    Debug.Print "----------"

    Dim l As Long
    For l = 1 To oCol.Count
        Debug.Print oCol(l)
    Next

    Debug.Print "----------"

    oCol.Remove (1)

    Dim fruit As Variant
    For Each fruit In oCol
        Debug.Print fruit
    Next

    Set oCol = Nothing
End Sub

'출력
Apple
Apple
----------
Apple
Strawberry
Lemon
Banana
----------
Strawberry
Lemon
Banana

Diccionario

Es posible administrar elementos únicos variables de la estructura de clave-valor y agregar/eliminar elementos dinámicamente.

Es una estructura de datos similar a Dictionary en lenguaje Python, HashMap en C++ y HashMap en Java. Al acceder por valor de clave, el rendimiento es O(1).

La clase de diccionario no se proporciona de forma predeterminada. Para usarlo en el método de vinculación anticipada, primero debe consultar "Microsoft Scripting Runtime". Para usar en el método de enlace tardío, cree una instancia a través de CreateObject y utilícela.

Dictionary class 사용을 위한 "Microsoft Scripting Runtime" 참조 추가
Se agregó la referencia "Microsoft Scripting Runtime" para usar la clase Dictionary

Consulte la siguiente tabla para ver el código de cada tarea, como la declaración de objetos de diccionario, la creación de instancias y la adición de elementos.

TareaCódigo de muestra
Declaración (enlace anticipado)Dim oDic como diccionario
Creación de instancias (enlace anticipado)Establecer oDic = Nuevo Diccionario
Declaración (enlace tardío)Dim oDic como objeto
Creación de instancias (enlace tardío)Establecer oDic = CreateObject(“Scripting.Dictionary”)
Añadir artículooDic.Añadir “Manzanas”, 50
Valor de cambiooDic(“Manzanas”) = 60
Obtenga valorcuentamanzanas = oDic(“Manzanas”)
Comprobar si existe la claveoDic.Existe ("Manzanas")
Eliminar elementooDic.Remove(“Manzanas”)
Eliminar todos los elementosoDic.QuitarTodo
Número de itemsRecuento dic.
Bucle de artículo (para cada uno)Tecla Dim como variante
Para Cada tecla en oDic.Teclas
    Depuración Imprimir clave, oDic(clave)
tecla siguiente
Bucle de artículo (para, enlace anticipado solamente)Dim l tan largo
Para l = 0 Hasta oDic.Count -1
    Depurar.Imprimir oDic.Keys(l), oDic.Items(l)
siguiente

El código de ejemplo que usa Dictionary es el siguiente. Como referencia, los elementos del diccionario comienzan desde 0.

Sub DictionaryTest()
    Dim oDic As Dictionary
    Set oDic = New Dictionary

    oDic.Add "A", "Apple"
    oDic.Add "S", "Strawberry"
    oDic.Add "L", "Lemon"
    oDic.Add "B", "Banana"

    Debug.Print oDic("A")
    Debug.Print oDic.Items(0)
    Debug.Print "----------"

    Dim l As Long
    For l = 0 To oDic.Count - 1
        Debug.Print oDic.Items(l)
    Next
    
    Debug.Print "----------"
    
    oDic.Remove ("A")

    Dim key As Variant, fruit As String
    For Each key In oDic.Keys
        fruit = oDic(key)
        Debug.Print fruit
    Next

    Set oDic = Nothing
End Sub

'출력
Apple
Apple
----------
Apple
Strawberry
Lemon
Banana
----------
Strawberry
Lemon
Banana

Al buscar un objeto Dictionary con la instrucción For Loop, la variable que contiene el valor clave solo puede ser de tipo Variant u Object. En el ejemplo anterior, el código de las líneas 23 y 24 usaba el formato Variant.


En este artículo, analizamos los tipos de datos y las estructuras de datos de VBA. En particular, es muy probable que la Colección y el Diccionario se utilicen con frecuencia, así que familiarícese con ellos. A continuación, veremos procedimientos que es bueno saber al codificar VBA.


<< Lista de artículos relacionados >>

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESEspañol