Tengo un error en Redim Preserve y no consigo verlo. Agradecería cualquier ayuda. Excel 2007

Private Sub Carga()
Dim I As Integer, Matriz() As String, J As Integer
Dim Pos As Integer, NumReg As Integer
Application.ScreenUpdating = False
NumReg = 1: Pos = NumReg - 1
ReDim Matriz(Pos, 0 To 3)
Range("A1").Select
Do While ActiveCell <> Empty
celda = ActiveCell.Address
Matriz(Pos, 0) = Range("A" & NumReg)
Matriz(Pos, 1) = Range("B" & NumReg)
Matriz(Pos, 2) = Range("C" & NumReg)
Matriz(Pos, 3) = Range("D" & NumReg)
NumReg = NumReg + 1: Pos = NumReg - 1
ReDim Preserve Matriz(Pos, 0 To 3) Linea del error
ActiveCell.Offset(1, 0).Select
Range("A" & NumReg).Select
Loop
Dim Item As ListItem
frmAlimentación.Alimentación.ListItems.Clear
For I = 0 To UBound(Matriz) - 1
For J = 0 To 3
Set Item = frmAlimentación.Alimentación.ListItems.Add(, , Matriz(I, J))
Item.SubItems(J + 1) = Matriz(I, J)
Next J
Next I
frmAlimentación.Alimentación.View = lvwReport
Application.ScreenUpdating = True
End Sub

1 respuesta

Respuesta
1

Cuando se usa la sentencia ReDim Preserve en matrices multidimensionales, solamente se puede modificar la última dimensión.

ReDim Preserve Matriz(Pos, 0 To 3) 'Linea del error

En tu caso se trata de una matriz de dos dimensiones, y estás intentando cambiar el tamaño de la primera dimensión, por eso falla.

Si fuese la segunda dimensión la que necesitases modificar, tu programa funcionaría.

Ver http://msdn.microsoft.com/es-es/library/w8k3cys2(v=vs.80).aspx (en el apartado "Cambiar el tamaño con Preserve")

Saludos,

Carlos

[email protected]

Buenas tardes Carlos.

El valor que quiero que varíe en la matriz (X,Y) siempre ha de ser la X puesto que la Y se mantiene constante.

La X son las filas de la hoja Excel y la Y son las celdas A, B, C y D. Yo siempre había creído que el REDIM PRESERVE se podía utilizar en cualquier matriz, ya que como solucionas el almacenamiento matricial verticalmente.

Si me das un correo te envío la hoja Excel, quizá viéndolo comprendas la necesidad del almacenamiento matricial.

Un saludo

Tu aclaración ha sido muy oportuna ya que me ha permitido solucionar el problema de la siguiente forma.


Private Sub Carga()
Dim I As Integer, Matriz() As String, J As Integer
Dim Pos As Integer, NumReg As Integer
Application.ScreenUpdating = False
NumReg = 1: Pos = NumReg - 1
Range("A1").Select
Do While ActiveCell <> Empty
celda = ActiveCell.Address
ActiveCell.Offset(1, 0).Select
Loop
Pos = Mid(celda, 4, 3)
ReDim Matriz(Pos, 0 To 3)
Range("A1").Select
For I = 0 To Pos
celda = ActiveCell.Address
Matriz(Pos, 0) = Range("A" & NumReg)
Matriz(Pos, 1) = Range("B" & NumReg)
Matriz(Pos, 2) = Range("C" & NumReg)
Matriz(Pos, 3) = Range("D" & NumReg)
NumReg = NumReg + 1: Pos = NumReg - 1
ActiveCell.Offset(1, 0).Select
Range("A" & NumReg).Select
Next
Dim Item As ListItem
frmAlimentación.Alimentación.ListItems.Clear
For I = 0 To UBound(Matriz)
For J = 0 To 3
Set Item = frmAlimentación.Alimentación.ListItems.Add(, , Matriz(I, J))
Next J
Next I
frmAlimentación.Alimentación.View = lvwReport
Application.ScreenUpdating = True
End Sub


El problema se ha trasladado al final, quiero pelearme un poco con ello e indagar por si me falta alguna cosa. Si al final no consigo nada recurriré a pedir ayuda.
Muchas gracias por todo y un saludo

De nada, me alegra haber colaborado a que encontrases la solución ;)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas