cargar datos en listbox userform desde una matriz trabajando con vba excel97

05/02/2006 - 12:12 por vdadesolano | Informe spam
Sin tener practicamente idea, sin leer ningun libro sobre la materia, y
a partir de los consejos que he encontrado en este foro y de la
enigmatica ayuda de excel97 vba (soy un antiguo, lo se, pero me
encontre mi ordenador en la basura y es lo que llevaba) me he propuesto
hacer mi primera macro par a Excel. No quiero trabajar con celdas ,
sino con datos cargados en una matriz, que representan la tabla excel
que quiero calcular. El problema actual surge por que quiero cargar en
una user form los datos de una columna , que ahora son variables una
mimatriz(1 to x ,1 to y). Son numeros de telefono y estan repetidos.
Quiero que mi userform lisbox me pregunte que elementos quiero
seleccionar listandos a partir de los existentes pero mostrando los
repetidos solo una vez. Todo esto para devolver los elemento con los
que voy a hacer el calculo y llamar a la matriz para esos elementos y
calcular dentro de la sub y devolver el resultado como msgbox.De
momento voy por aqui.¿Agradeceria cualquier idea?

Dim ArchivoAAbrir As String, ArchivoAAbrirtxt As String
Dim Matriz()
Dim x As Integer
Dim y As Integer
Dim valor
Dim contador As Integer

Sub ABRIR()
'ArchivoAAbrir = Application.GetOpenFilename("Archivos de Microsoft
Excel (*.XLS), *.XLS")
'If ArchivoAAbrir <> False Then
'End If
'UserForm1.Show
Workbooks.Open FileName:="c:\ejemplo.xls" 'ArchivoAAbrir
Worksheets("Hoja1").Activate
Worksheets("Hoja1").Range("a3").Activate
Dim x As Integer
Dim numrows As Integer ' declara numero de filas.
Range("a1").Select 'va a 1ª celda
numrows = Range("a3", Range("a3").End(xlDown)).Rows.Count ' cuenta
filas
numrows = numrows + 2
numcolumns = Range("a3", Range("a3").End(xlToRight)).Columns.Count '
cuenta Columns
ReDim Matriz(1 To numrows, 1 To numcolumns)

For x = 1 To numrows
For y = 1 To numcolumns
valor = Cells(x, y).Value
Matriz(x, y) = valor
Next y
Next x

Stop
End Sub

Preguntas similare

Leer las respuestas

#1 KL
05/02/2006 - 23:20 | Informe spam
Hola vdadesolano,

1) comentarte que el codigo que expones (tal cual) lo realizaria de una de las siguientes formas (es mas eficiente pasar el rango a
matriz directamente que usar bucle)

'Inicio Codigo 1
Sub ABRIR1()
' si NO hay formatos fuera del area de datos
Dim Matriz As Variant, oLibro As Workbook, y As Long
ArchivoAAbrir = Application.GetOpenFilename _
("Archivos de Microsoft Excel (*.XLS), *.XLS")
If ArchivoAAbrir <> False Then
Set oLibro = Workbooks.Open(ArchivoAAbrir)
With oLibro
With .Worksheets("Hoja1").UsedRange
y = .Columns.Count
Matriz = .Offset(2).Resize(.Rows.Count - 2).Value
End With
.Close
End With
With UserForm1
With .ListBox1
.ColumnCount = y
.List() = Matriz
End With
.Show
End With
End If
End Sub
'Fin Codigo 1

'Inicio Codigo 2
' si hay formatos fuera del area de datos
Sub ABRIR2()
Dim Matriz As Variant, oLibro As Workbook, x As Long, y As Long
ArchivoAAbrir = Application.GetOpenFilename _
("Archivos de Microsoft Excel (*.XLS), *.XLS")
If ArchivoAAbrir <> False Then
Set oLibro = Workbooks.Open(ArchivoAAbrir)
With oLibro
With .Worksheets("Hoja1")
x = .Cells(.Rows.Count, "A").End(xlUp).Row
y = .Cells(3, .Columns.Count).End(xlToLeft).Column
Matriz = .Range(.Range("A3"), .Cells(x, y)).Value
End With
.Close
End With
With UserForm1
With .ListBox1
.ColumnCount = y
.List() = Matriz
End With
.Show
End With
End If
End Sub
'Fin Codigo 2

2) Si solo necesitas meter en un listbox los valores unicos de UNA columna (digamos la columna [A]) podrias usar el siguiente
codigo:

'Inicio Codigo 3
Sub ABRIR3()
Dim Matriz As Variant, oLibro As Workbook, x As Long, y As Long
ArchivoAAbrir = Application.GetOpenFilename _
("Archivos de Microsoft Excel (*.XLS), *.XLS")
If ArchivoAAbrir <> False Then
Set oLibro = Workbooks.Open(ArchivoAAbrir)
With oLibro
With .Worksheets("Hoja1")
Matriz = Unique(.Range(.Range("A3"), _
.Cells(.Rows.Count, "A").End(xlUp)))
End With
.Close
End With
With UserForm1
.ListBox1.List() = Matriz
.Show
End With
End If
End Sub

Function Unique(inArray As Range) As Variant
Dim colItems As Collection
Dim cell As Range
Dim temp As Variant

Set colItems = New Collection
On Error Resume Next
For Each cell In inArray
colItems.Add cell.Value, CStr(cell.Value)
Next cell
ReDim temp(colItems.Count)
For i = 1 To colItems.Count
temp(i) = colItems.Item(i)
Next i
Unique = temp
End Function
'Fin Codigo 3

3) Si aparte de filtrar valores unicos necesitas que esten ordenados alfabeticamente, podrias usar la siguiente funcion de John
Walkenbach:
http://j-walk.com/ss/excel/tips/tip15.htm

4) Si es otra cosa, comentas detalles adicionales?

Saludos,
KL
Respuesta Responder a este mensaje
#2 KL
05/02/2006 - 23:48 | Informe spam
Hola de nuevo,

"KL" wrote:
3) Si aparte de filtrar valores unicos necesitas que esten ordenados alfabeticamente, podrias usar la siguiente funcion de John
Walkenbach:
http://j-walk.com/ss/excel/tips/tip15.htm



Parece que me he equivocado de codigo y no consigo encontrar el que tenia en mente. En todo caso, so quieres que te ordene los
datos, puedes sustituir la funcion que te puse antes con la siguiente:

Function Unique(inArray As Range) As Variant
Dim colItems As Collection
Dim cell As Range
Dim temp As Variant

Set colItems = New Collection
On Error Resume Next
For Each cell In inArray
colItems.Add cell.Value, CStr(cell.Value)
Next cell
For i = 1 To colItems.Count - 1
For j = i + 1 To colItems.Count
If colItems(i) > colItems(j) Then
Swap1 = colItems(i)
Swap2 = colItems(j)
colItems.Add Swap1, before:=j
colItems.Add Swap2, before:=i
colItems.Remove i + 1
colItems.Remove j + 1
End If
Next j
Next i
ReDim temp(colItems.Count)
For i = 1 To colItems.Count
temp(i) = colItems.Item(i)
Next i
Unique = temp
End Function

Saludos,
KL
Respuesta Responder a este mensaje
#3 vdadesolano
07/02/2006 - 01:04 | Informe spam
Hola a todos . Abrumado por tanta atencion recibida y agradecido
,muchas gracias KL, acabo de llegar de trabajar y todavia no he cenado.
Pero mañana comenzare a digerir toda la información recibida. Como
estoy algo pez se prevee que la digestion será larga.No dudo que tal y
como me relaciono yo con esta codigo muy pronto acabaré metido en un
nuevo lodazal del que no sabré como salir. Pero creo que en el fondo
es lo que me divierte , no tener ni puñetera idea de por donde voy ni
de en que me he metido.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida