elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (Moderadores: Novlucker, seba123neo, kub0x, Eleкtro)
| | | |-+  Problema con eliminado de filas en excel 2007/2016 en VB.NET
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con eliminado de filas en excel 2007/2016 en VB.NET  (Leído 297 veces)
Yaldabaot

Desconectado Desconectado

Mensajes: 168


Ver Perfil
Problema con eliminado de filas en excel 2007/2016 en VB.NET
« en: 26 Agosto 2017, 00:26 »

Hola amigos del foro, vengo yo a uds de nuevo luego de numerosos intentos y desesperación, ya que sinceramente ya no se que podré estar haciendo mal.

Estoy haciendo una automatización en VB.NET 2010 en Excel, la cuál consiste en un limpiado de un archivo. Me pidieron unas modificaciones en el programa entonces tuve que cambiarlo bastante pero al final de cuentas el funcionamiento en sí del programa lo hace bien, excepto en un pequeño gran detalle el cuál es que no elimina las filas que yo quiero que elimine, estas para ser eliminadas simplemente tienen que ser un campo vacío, simplemente es eso pero no entiendo porque el programa no lo hace.

Les dejo acá el fragmento del método


Código
  1.  
  2.  
  3.       'Variables a utilizar
  4.  
  5.        Dim str_cod As String = String.Empty
  6.        Dim str_xxx As String = String.Empty
  7.        Dim str_sku As String = String.Empty
  8.  
  9.  
  10.        Dim xlWorkSheet As Excel.Worksheet = Nothing ' Hojas
  11.  
  12.  
  13.        Dim i As Integer = 0 'Contador del ciclo
  14.  
  15.        Dim xcell As New Object
  16.  
  17.        xlWorkSheet = xlworkbook.Sheets("Hoja2") 'Hoja que estoy utilizando
  18.        Dim xlrange_col2 As Range = Nothing
  19.  
  20.         'Progress Bar que utilizo
  21.  
  22.        pg_proceso_inventario.Minimum = 1
  23.        pg_proceso_inventario.Maximum = filas
  24.  
  25.  
  26.        'Este es el rango que recorro de la hoja de excel
  27.        xlrange_col2 = xlWorkSheet.Range("B2:" + "B" + filas) 'Rango filas
  28.  
  29.         i = 2 ' Debe empezar en 2 porque este posee un encabezado
  30.  
  31.        'Esto es un checkbox consiste en que si quiero quitar o dejar todos. ignorar esto
  32.        If chkDejarTodos.Checked = False Then
  33.  
  34.            'Ciclo que empiezo a recorrer el rango
  35.  
  36.            For Each xcell In xlrange_col2
  37.  
  38.                pg_proceso_inventario.Value = pg_proceso_inventario.Value + 1
  39.                lbl_indice_numero.Text = i.ToString
  40.  
  41.                'limpiamos las variables
  42.  
  43.                str_cod = Nothing 'Código1
  44.                str_xxx = Nothing 'Código XXX
  45.                str_sku = Nothing 'Código SKU
  46.  
  47.                str_cod = Convert.ToString(xlWorkSheet.Cells(i, 1).Value) 'Código1
  48.                str_xxx = Convert.ToString(xlWorkSheet.Cells(i, 2).Value) 'Código XXX
  49.                str_sku = Convert.ToString(xlWorkSheet.Cells(i, 3).Value) 'Código SKU
  50.  
  51.  
  52.                'Si el checkbox de familia no está activado procedemos a eliminar todo aquel
  53.                'que no empiece por 77 y está vacío
  54.  
  55.                If chk_Familia.Checked = False Then
  56.  
  57.                    If str_cod.StartsWith("77") Then
  58.                        i = i + 1
  59.  
  60.                    'Acá es el maldito problema, no lo elimina de ninguna forma
  61.  
  62.                    ElseIf (no_vacio(str_xxx) = False) Then
  63.                        ' xlWorkSheet.Rows(i).delete()
  64.                        With xlWorkSheet
  65.                            .Rows.Item(i).delete()
  66.                        End With
  67.  
  68.                        'xlWorkSheet.Cells(i, 2).Value = "DEBO ELIMINARME"
  69.                        i = i + 1
  70.                    Else
  71.                        i = i + 1
  72.                    End If
  73.  
  74.                Else
  75.                    'Si el checkbox está activado
  76.                    If str_cod.StartsWith(str_familia) Then
  77.                        i = i + 1
  78.                    Else
  79.                        xlWorkSheet.Rows(i).Delete()
  80.                        i = i + 1
  81.                    End If
  82.                End If
  83.  
  84.            Next
  85.        End If
  86.  
  87.        pg_proceso_inventario.Value = pg_proceso_inventario.Minimum
  88.        xlworkbook.Save()
  89.  
  90.        lbl_Cant_Produc.Text = devolver_filas(xlapp, xlWorkSheet)
  91.  
  92.        release_object(xlrange_col2)
  93.        release_object(xlWorkSheet)
  94.  
  95.  
  96.  
  97.  

Bien les voy a explicar en prosa un poco más el código, consiste en recorrer ese rango desde B2 hasta la cantidad de filas que posee el archivo, cuando el encuentra un código que empieza por 77 el lo ignora si este ya no empieza por 77 entonces verifica que el código 2 (o sea la fila B del rango que estamos recorriendo) sea vacío y si no lo es lo elimina se supone porque en realidad no lo hace....


Bien este es el método que averigua si hay algo


Código
  1.  
  2. Public Function no_vacio(ByVal str As String) As Boolean
  3.        If str.Length > 0 Then
  4.            Return True
  5.        End If
  6.        Return False
  7.    End Function
  8.  
  9.  

Inicialmente utilizaba el String.nulloblank o String.nullwhitespace pero el resultado es el mismo y la verdad ya no se que estoy haciendo mal.

Muchas gracias por leerme.









« Última modificación: 26 Agosto 2017, 00:37 por Yaldabaot » En línea

Nunca me contestan -_-
NEBIRE


Desconectado Desconectado

Mensajes: 709


Ver Perfil
Re: Problema con eliminado de filas en excel 2007/2016 en VB.NET
« Respuesta #1 en: 26 Agosto 2017, 01:37 »

mmm... no si si es un error al escribir o no, pero leyéndote, me fuerza a preguntarme si sabes distinguir filas de columnas.

Citar
Fila 0 |Columna 0 | Columna 1 | Columna 2 | Columna 3 |
Fila 1
Fila 2
Fila 3

Tampoco me queda claro lo que quieres hacer... si eliminar la celda, vaciar su contenido (a juzgar por este comentario: xlWorkSheet.Cells(i, 2).Value = "DEBO ELIMINARME"), o eliminar la fila o columna...

Lego observo que en todas las condicones dentro de: "If chk_Familia.Checked = False Then", haces:
Código
  1. I=(I+1)
Entonces puedes hacerlo tras terminar, una única vez...

La función 'novacio', es redundante, e induce a complicaciones si la comparación se hace en la forma:
Código
  1. Si Novacio(x ) = FALSE luego
es preferible pensarlo en positivo:
Código
  1. Si Contienealgo(x) luego
Pero en efecto, la propia función es redundante, poque el objeto string posee métodos intrínsecos para ello (como bien señalas al final):

Código
  1. If String.IsNullOrWhiteSpace(str_xxx)=FALSE Then
  2.    xlWorkSheet.Cells(i, 2).Value = ""
  3. End If

Finalmente, advertirte que esta comprobación es correcta solo si se sabe con absoluta certeza que será siempre así y que nunca nadie cometerá errores:
Código
  1. If str_cod.StartsWith("77") Then
Ya que cabe la posibilidad de que contenga espacios a la izquierda... aunque solo sea uno. Mejor así:

Código
  1. If (str_cod.TrimStart(" ")).StartsWith("77") Then
Nota: Que esta forma en una sola línea no altera el contenido de "str_cod", solo ejecuta la comparación sin modificar el contenido.


En línea

Yaldabaot

Desconectado Desconectado

Mensajes: 168


Ver Perfil
Re: Problema con eliminado de filas en excel 2007/2016 en VB.NET
« Respuesta #2 en: 26 Agosto 2017, 03:05 »

Hola NEBIRE, primero que todo muchas gracias por el tiempo de leerme y sobretodo responderme.

Muchas gracias por la aclaración, entiendo perfectamente la diferencia entre columna y fila, mira te explico, el método .Cells de la librería interop tiene dos parámetros opcionales, en este caso seria ( fila, columna), entonces si yo le indico los dos parámetros en lugar de borrar toda la fila ( que es lo que ocupo) borro solo una celda.

Bien,  yo lo que necesito es que al no cumplirse que el código 1 empiece por 77 este verifique que el codigo 2 no sea vacío o nulo, si este es vacío o nulo necesito eliminar la fila completa, cosa que no lo está haciendo por alguna razón y por ello recurro a uds.

Antes de que me digas si estoy en la hoja correcta o si es el rango correcto debo comentarte que revisé a cabalidad y lamentablemente se encuentra bien.

Tienes razón en lo del incremento del indice, es totalmente redundante y lo voy a corregir, gracias por notarlo.

 Respecto a los condicionales voy a revisarlos nuevamente, muchas gracias.

Si sabes algo en especifico te agradecería mucho para poder dar con el problema.
« Última modificación: 26 Agosto 2017, 03:08 por Yaldabaot » En línea

Nunca me contestan -_-
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines