Que esta mal con este codigo

02/12/2006 - 19:20 por zz | Informe spam
Despues de varios dolores de cabeza, me rindo y pido ayuda

tengo este codigo que me carga una lista guardada en una hoja de excel



Private Sub load_certifications()
Dim stritem, strdesc As String
Dim i As Integer
i = 0
Sheets("Entrenamientos").Activate
ActiveSheet.Range("a2").Activate
Do Until ActiveCell.Value = ""
With ActiveCell
stritem = CStr(.Offset(, 1).Value)
strdesc = CStr(.Offset(, 2).Value)
End With
Cmbtrainings.AddItem CStr(stritem)
Cmbtrainings.ColumnCount = 2
Cmbtrainings.ColumnHeads = True
Cmbtrainings.Column(2) = strdesc
i = i + 1
ActiveCell.Offset(1, 0).Activate
Loop
End Sub

pero al ejecutarlo me marca el error "381"

could not set the column property, Invalid property array index
la verdad no le encuentro donde esta el error




zz [MX]
cuasi-musico,semi-poeta y loco

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
03/12/2006 - 00:45 | Informe spam
hola, ???

1) al codigo que expones -solo- le hace falta la aplicacion de tu variable 'i' que no le estas dando uso :))
2) [tambien] no es necesario estar 'machacando' con las propiedades: ColumnCount y ColumnHeads -> dentro del bucle Do While...
3) [ademas] la propiedad ColumnHeads no va a mostrar los encabezamientos de tus datos en la hoja de calculo
[a menos que en lugar de llenar el combo 'item por item' usaras el rango 'en si' [p.e. 'B2:C16'] dejando 'B1:C1' para ColumnHeads]
4) [finalmente] los elementos/campos/filas/columnas/... de controles activex se 'cuentan' desde 0 [cero] hasta n_elementos MENOS 1
o sea, si tu combo es de 2 columnas, la primera es CERO y la segunda es UNO ;)
[a menos que en ese modulo de codigo uses la instruccion Option Base 1 -> en el area de declaraciones] ;)
5) prueba con las siguientes -ligeras- modificaciones [aunque es posible que pudiera agilizarse por otros mecanismos] -?-

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

Private Sub load_certifications()
Dim stritem As String, strdesc As String, i As Integer
Cmbtrainings.ColumnCount = 2
Cmbtrainings.ColumnHeads = True
Sheets("Entrenamientos").Activate
ActiveSheet.Range("a2").Activate
Do Until ActiveCell.Value = ""
With ActiveCell
stritem = CStr(.Offset(, 1).Value)
strdesc = CStr(.Offset(, 2).Value)
End With
Cmbtrainings.AddItem
Cmbtrainings.List(i, 0) = stritem
Cmbtrainings.List(i, 1) = strdesc
i = i + 1
ActiveCell.Offset(1, 0).Activate
Loop
End Sub

__ la consulta original __
Despues de varios dolores de cabeza, me rindo y pido ayuda
tengo este codigo que me carga una lista guardada en una hoja de excel
Private Sub load_certifications()
Dim stritem, strdesc As String
Dim i As Integer
i = 0
Sheets("Entrenamientos").Activate
ActiveSheet.Range("a2").Activate
Do Until ActiveCell.Value = ""
With ActiveCell
stritem = CStr(.Offset(, 1).Value)
strdesc = CStr(.Offset(, 2).Value)
End With
Cmbtrainings.AddItem CStr(stritem)
Cmbtrainings.ColumnCount = 2
Cmbtrainings.ColumnHeads = True
Cmbtrainings.Column(2) = strdesc
i = i + 1
ActiveCell.Offset(1, 0).Activate
Loop
End Sub
pero al ejecutarlo me marca el error "381"
could not set the column property, Invalid property array index
la verdad no le encuentro donde esta el error...
Respuesta Responder a este mensaje
#2 Vinchenzo vinç
03/12/2006 - 00:49 | Informe spam
"zz" escribió en el mensaje news:
Despues de varios dolores de cabeza, me rindo y pido ayuda

tengo este codigo que me carga una lista guardada en una hoja de excel




Hola,
lo primero, una observación:

Dim stritem, strdesc As String



por el prefijo de 'stritem', se podría deducir que en la declaración esperas que ambas sean del tipo 'String'. Sabe que en Visual Basic no sucede lo mismo que en otros lenguajes de programación, que definiendo el tipo en la última variable, las de la mima línea de código adquieren el mismo tipo.
En esa línea estás declarando únicamente 'strdesc' como 'String', y 'stritem' como 'Variant'.
Para que ambas sean 'String' declaradas en la misma línea, debes declarar cada una con su tipo explícitamente, esto es:

Dim stritem As String, strdesc As String


Otra observación:

Do Until ActiveCell.Value = ""
...
Cmbtrainings.ColumnCount = 2
Cmbtrainings.ColumnHeads = True
...
Loop



esas dos propiedades sólo es necesario establecerlas una vez, por lo que te sugiero que las extraigas del 'Do Until', y las asignes antes de entrar en el bucle.


En el procedimiento tienes dos errores.
Uno está en el valor de la propiedad '.ListIndex', puesto que cuando a la propiedad '.Column' sólo le indiques la columna de la que quieres recuperar el valor, tomará el índice actual. Hasta que no se lo asignas, desde el principio su valor es '-1'.
El otro error (lo tendrías si no lo corriges) en el índice de columna. Los índices de columna están basados en cero, es decir, la primera columna tiene el índice 0, y en el código asignarías el valor a la tercera columna (que sería no-visible, pero estaría).

Por lo que tienes (como mínimo) tres soluciones:

1 - Establecer el valor de '.ListIndex' en cada iteración:

Cmbtrainings.ListIndex = i
Cmbtrainings.Column(1) = strdesc

2 - Indicar el índice de elemento en la columna:

Cmbtrainings.Column(1, i) = strdesc

3 - Usar la propiedad '.List'

Cmbtrainings.Column(i, 1) = strdesc


Saludos
( ! ) Respuestas precedentes en Google:
http://groups.google.com/group/micr...c.es.excel
( i ) Temperancia en el foro:
http://support.microsoft.com/defaul...newsreglas
Respuesta Responder a este mensaje
#3 Vinchenzo vinç
03/12/2006 - 01:13 | Informe spam
"Vinchenzo vinç" escribió en el mensaje news:

Esta respuesta tiene un gazapo! ;-)

Aunque ya supongo que se ve, donde dice:

3 - Usar la propiedad '.List'
Cmbtrainings.Column(i, 1) = strdesc



debe decir:

Cmbtrainings.List(i, 1) = strdesc


Saludos
( ! ) Respuestas precedentes en Google:
http://groups.google.com/group/micr...c.es.excel
( i ) Temperancia en el foro:
http://support.microsoft.com/defaul...newsreglas
Respuesta Responder a este mensaje
#4 Vinchenzo vinç
03/12/2006 - 01:17 | Informe spam
"Héctor Miguel" escribió en el mensaje news:
...
o sea, si tu combo es de 2 columnas, la primera es CERO y la segunda es UNO ;)
[a menos que en ese modulo de codigo uses la instruccion Option Base 1 -> en el area de declaraciones] ;)



Hola Héctor,
de hecho 'Option Base' sólo se aplica a los arrays que crees en el código, a excepción de aquellos arrays dimensionados con la cláusula 'To' indicando los límites, y también a excepción de los generados mediante la función 'Split', que aunque tengas la base cambiada, esta función te siguirá devolviendo una matriz de base cero.
El cambio de base tampoco afecta en la codificación interna del control, que siempre devolverá la matriz de su base predeterminada, y la primera columna siempre será la cero.


Un saludo ;-)

( ! ) Respuestas precedentes en Google:
http://groups.google.com/group/micr...c.es.excel
( i ) Temperancia en el foro:
http://support.microsoft.com/defaul...newsreglas
Respuesta Responder a este mensaje
#5 Héctor Miguel
03/12/2006 - 01:29 | Informe spam
hola, Vinchenzo !

de hecho 'Option Base' solo se aplica a los arrays que crees en el codigo [...]



tienes razon :) [se me 'chspotio' de cualquier lado, perdon si pude causar alguna 'confusion'] :(

por eso digo [dentro de muchas otros 'bondades' que tienen estos foros]...
lo bueno es que no estamos solos :))

saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida