Imprimir página | Cerrar ventana

Elementos en una matríz

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84706
Fecha de impresión: 31/Octubre/2020 a las 08:06


Tema: Elementos en una matríz
Publicado por: emiliove
Asunto: Elementos en una matríz
Fecha de publicación: 14/Septiembre/2019 a las 19:35
Buenas Tardes a todos

Lo que pretendo es meter Elementos a una Matríz, de una dimensión del estilo:
Dim n(0 To 7) As Double
   
    n(0) = 12.344
    n(1) = 12.345
    n(2) = 12.346
    n(3) = 12.354
    n(4) = 12.355
    n(5) = 12.356

Pero no se hasta que numero va a llegar, y los tomo de un subformulario mas o menos así:

Private Sub Comando17_Click()
Dim contar As Integer
contar = Me.SubDETALLE.Form.Recordset.RecordCount
Dim cont As Integer
cont = 0
Dim arrIVA(4) As Variant
With Me.SubDETALLE.Form.RecordsetClone
.MoveFirst
Do Until .EOF
arrIVA(cont) = !IVA
    .MoveNext
    cont = cont + 1
    Loop
End With
Debug.Print arrIVA(1), arrIVA(0), arrIVA(3)
End Sub

Y efectivamente me da el resultado, pero como es variable quiero asignar yo el valor aquí:
Dim arrIVA(4) As Variant  poder poner el valor de contar-1

Lo hice también con Getrows y me da el resultado pero de dos dimensiones y no se como hacer que sea de una sola dimensión, para poder usarlo.

Saludos y buen fin de semana.



Respuestas:
Publicado por: xavi
Fecha de publicación: 14/Septiembre/2019 a las 20:05
A lo mejor se me escapa algo pero...¿no te vale un ReDim?

Dim arrIVA() As variant
ReDim arrIVA(Me.SubDetalle.Form.RecordsetClone.RecordCount)

Un saludo


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: guarracuco
Fecha de publicación: 15/Septiembre/2019 a las 05:07
Prueba esto. Solo cambia el nombre de tu tabla.

Sub rows()
Dim db As Database, rs As DAO.Recordset, rows As Variant, ivaArr(), row As Integer, col As Integer, q As Integer

Set db = CurrentDb
Set rs = db.OpenRecordset("select * from [table1];")
rs.MoveLast: rs.MoveFirst
rows = rs.getrows(rs.RecordCount)
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing

If IsArray(rows) And UBound(rows) > 0 Then
    q = UBound(rows, 2) ' la columna dos, indica la cantidad de registros
    ReDim Preserve ivaArr(q + 1)
   
    'si la cantidad de registros es grande, utiliza un objeto dictionary (arreglo indexado)
    Dim ivaObj As Object
    Set ivaObj = CreateObject("scripting.dictionary")
   
    For row = 0 To UBound(rows, 2)
        For col = 0 To UBound(rows, 1)
            'suponiendo que el campo IVA es el tercer campo
            Debug.Print rows(col, row)
            If col = 2 Then
                ivaArr(row) = rows(col, row)
               
                'agregando al dictionary
                ivaObj.Add row, rows(col, row)
            End If
        Next
    Next
   
    'comprobando que el arreglo iva tiene valores y su recorrido
    If IsArray(ivaArr) And UBound(ivaArr) > 0 Then
        For row = 0 To UBound(ivaArr) - 1
            Debug.Print "iva(" & row + 1 & ") :" & ivaArr(row)
        Next
    End If
   
    'recorriendo el dictionary
    If IsObject(ivaObj) And ivaObj.count > 0 Then
        For Each itm In ivaObj.keys
            Debug.Print ivaObj(itm)
        Next
    End If
End If
End Sub


Publicado por: guarracuco
Fecha de publicación: 15/Septiembre/2019 a las 05:08
El Preserve se utiliza cuando el arreglo ya tiene informacion y deseas conservarla. En este caso no es necesaria.


Publicado por: emiliove
Fecha de publicación: 18/Septiembre/2019 a las 21:14
Hola a todos

Xavi, no se te escapa nada y con ReDim funciona perfectamente.

Carlos sigo con tu función y es muy interesante sigo en estudio.

Por lo pronto gracias a ambos y podemos cerrar.

Saludos.



Imprimir página | Cerrar ventana