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 datos | capacidad de almacenamiento | alcance |
booleano | 2 bytes | Verdadero o Falso |
Byte | 1 byte | 0 ~ 255 |
Recopilación | Desconocido | Desconocido |
Moneda (entero escalado) | 8 bytes | -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 |
Fecha | 8 bytes | 1 de enero de 100 al 31 de diciembre de 9999 (100-01-01 ~ 9999-12-31) |
Decimal | 14 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 |
Diccionario | Desconocido | Desconocido |
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 |
Entero | 2 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 |
Objeto | 4 bytes | Alguna 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 cadena | 0 a aproximadamente 2 mil millones |
Cuerda (longitud fija) | Longitud de la cadena | 1 a aproximadamente 65,400 |
Variante (con números) | 16 bytes | Cualquier 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 elementos | El 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 constante | valor | Explicación |
vbVacío | 0 | Vacío(no inicializado) |
vbNulo | 1 | Nulo(Datos no disponibles) |
vbEntero | 2 | esencia |
vbLargo | 3 | Entero largo |
vbSingle | 4 | número de punto flotante de precisión simple |
vbDoble | 5 | número de punto flotante de precisión doble |
vbMoneda | 6 | valor de la moneda |
fecha vb | 7 | valor de fecha |
vbString | 8 | cuerda |
vbObjeto | 9 | individual |
vbError | 10 | valor de error |
vbBooleano | 11 | valor booleano |
vbVariante | 12 | Variante(variante Arreglousado solamente) |
vbDataObject | 13 | objeto de acceso a datos |
vbDecimal | 14 | valor decimal |
vbByte | 17 | valor de bytes |
matriz vb | 8192 | Arreglo |
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.
Tarea | Código de muestra |
Declaración | Colección Dim o Col As |
Creación de instancia | Establecer oCol = Nueva colección |
Creación de instancia al mismo tiempo que declaración | Dim o Col Como Nueva Colección |
Añadir artículo | oCol.Añadir “Apple” |
Acceder al elemento por índice | oCol(1) |
Número de items | oCuentaCol. |
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 instancia | Establecer 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.
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.
Tarea | Có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ículo | oDic.Añadir “Manzanas”, 50 |
Valor de cambio | oDic(“Manzanas”) = 60 |
Obtenga valor | cuentamanzanas = oDic(“Manzanas”) |
Comprobar si existe la clave | oDic.Existe ("Manzanas") |
Eliminar elemento | oDic.Remove(“Manzanas”) |
Eliminar todos los elementos | oDic.QuitarTodo |
Número de items | Recuento 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 >>
- Inicie el curso de Excel VBA. (Aviso de conferencia, hazaña. Por qué recomendamos Excel VBA)
- Curso Excel VBA(1): Descripción general de Excel VBA
- Curso de Excel VBA (2): Conceptos básicos de Excel VBA
- Curso de Excel VBA (3): Modelo de objetos de Excel
- Curso de Excel VBA (4): Trabajar con el modelo de objetos de Excel
- Curso de Excel VBA (5): extensión de archivo de Excel, VBE, configuración de fuente
- Curso Excel VBA (6): Conceptos básicos del lenguaje Excel VBA - Variables
- Curso Excel VBA (7): Conceptos básicos del lenguaje Excel VBA - Sintaxis
- Curso Excel VBA (8): Conceptos básicos del lenguaje Excel VBA: tipos de datos, estructuras de datos
- Cursos de Excel VBA (9): Procedimientos de Excel VBA
- Curso Excel VBA (10): Herramientas desarrolladas y utilizadas con Excel VBA
- Tabla de contenido completa para cursos de Excel VBA