Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: Liudex en Noviembre 03, 2015, 12:59:28 pm
-
Amigos, buenos dias, tengo un problema verdaderamente fastidioso, a la vez que facil , facil por que es un codigo simple que ya he usado en varias ocasiones, pero que ahora me da error y no lo he resuleto. es tan corto el codigo que hasta me da verguenza preguntar..
Uso este codigo para eliminar columnas y filas de un mshflexgrid.
Public Sub Del_Line(msh As mshflexgrid)
For y = 1 To msh.Rows - 1
If (msh.TextMatrix(y, 9) <> "ProV1") Then
msh.RemoveItem (y)
End If
Next y
End Sub
Cuando lo uso me el siguiente error:
Subindice fuera del intervalo... gracias de antemano
-
No vendrá por el lado de "TextMatrix(y, 9)" ? ,
no recuerdo bien el hflexgrid, 9 es la columna? existe la columna 9?
-
Si existe la configuración del Mshflexgrid coloco:
Public Sub Init_Grid(Grd As mshflexgrid)
With Grd
.Cols = 10
.FixedRows = 1
.TextArray(0) = ""
.TextArray(1) = "Item"
.TextArray(2) = "Especificaciones"
.TextArray(3) = "Observaciones"
.TextArray(4) = "Precio"
.TextArray(5) = "IdProd"
.TextArray(6) = "Unidad"
.TextArray(7) = "CantSol"
.TextArray(8) = "CantPend"
.TextArray(9) = "IdProv"
end with
Para utilizar el código se hace el llamado de la función.
call Init_Grid(grdprov1)
-
bueno traté de repetir tu codigo, y como suponiamos, el indice fuera de intervalo se da en :
msh.TextMatrix(y, 9)
Por que?
creo que es por que dentro del FOR se va incrementando Y, entonces la primera vez, elimina la fila 1, pero ahora ROWS ya contiene 1 fila menos, "Y" vuelve a incrementar, y llega un punto en donde por ej, si inicialmente tenia 10 filas, Y vale 10, pero ya me queda solo 1 fila en la coleccion de filas, entonces nunca voy a poder eliminar el item 10, porque ya no existe.
probalo asi, creo que funciona:
Dim i As Integer
Do While i < msh.Rows
i = i + 1
If (msh.TextMatrix(1, 9) <> "ProV1") Then
msh.RemoveItem (1)
End If
Loop
-
Cuando son registros de bases de datos no hace falta colocar .row=4 y .cols=10 ya que las toma automaticamente a lo mejor ese es tu error.
-
Gracias a todos por sus respuestas, use el codigo que me recomendo el amigo Waldo, pero aun que no me da el error no realiza el filtrado de forma correcta, por que si hay 10 filas que contienen "Prov1" las elimina y deja solo una. El error es tal cual lo que dice Waldo.
-
Bueno, ahora creo que si ;D
volví a dejar tu metodo, y puse un control de errores, de esta manera se borran todas las distintas de Prov1, y despues, cuando quedan solos las que contiene Prov1, da el error.
Con el OnError se controla el error, y segun lo que probé se podria salir ahi mismo del for, para no seguir dando vueltas en el for, pero probalo vos
Dim y As Integer
With msh
For y = 1 To .Rows - 1
On Error Resume Next
If (.TextMatrix(y, 9) <> "ProV1") Then
If Err = 0 Then
.RemoveItem (y)
Else
Err.Clear
'seria mejor salir del for con el primer error
'probar descomentando la siguiente linea
'Exit For
End If
End If
Next y
End With
-
A caray, que miedo me da el On Error Resume Next jeje.
El problema es hacer un loop de filas que luego se borran. Porque no haces el loop hacia arriba, de esa forma al borrar no debería darte errores:
For y = .Rows To 1 Step -1
Y naturalmente haces la validación de la primera fila.
-
A caray, que miedo me da el On Error Resume Next jeje.
JA ja ja, es verdad, a mi tampoco me gusta, pero si lo controlas no debería pasar nada ;D
Otra opcion sería como decis vos.
-
Probe con el nuevo codigo de Waldo y el error sigue igual.. he utilizado esta forma y me funciono..
Dim m, n, x, y As Integer
m = 1
n = Msh.Rows - 1
Do Until m > n
For x = 1 To Msh.Rows - 1
For y = (x) To Msh.Rows - 1
If (Msh.TextMatrix(x, 9) = Cond1) Then
Msh.RemoveItem (x)
End If
Next
Next
m = m + 1
Loop
Igual que el amigo Yvan le tengo idea al resume next.. estoy seguro que podria funcionar si usamos el loop hacia arriba, cuando pruebe dare la respuesta...
gracias a todos por su colaboracion.
-
hace como dice yvan siempre que quieras eliminar algo de una colección es mejor empezar del fin l principio.
-
En definitiva y segun las recomendaciones de Waldo e Yvan, este es el codigo definitivo:
With Msh
For y = (.Rows - 1) To 1 Step -1
If (.TextMatrix(y, 9) = "Cond") Then
If Err = 0 Then
.RemoveItem (y)
Else
Err.Clear
End If
End If
Next y
End With
Lo probe sin las lineas del control de error y funciona perfecto, y le elimine el resume next para que Yvan se sienta completamente feliz...
-
me alegro,
pero si sacaste el control de error, tendria que tambien sacar : If Err = 0 Then y Err.Clear, ya que Err viene siempre en 0, y si llega a haber un error, como no tiene control de error, directamente explotaría :)
-
....
Lo probe sin las lineas del control de error y funciona perfecto, y le elimine el resume next para que Yvan se sienta completamente feliz...
Me siento completamente feliz si llegaste a tu solución, al margen de lo demás. Exitos