Usar Do While Loop con varias condiciones para eliminar filas y actualizar datos desde un formulario vba Excel

El formulario contiene varios textbox principales que unidos 4 de ellos en un label (LblDocSerieNum = CmbDocumento & "/" & TxtSerie & "-" & TxtNumero & "/" & TxtRUC) generan un código principal. Ejm: RECIBO EGRESOS/1-117/20602524559 y a su vez, éste documento tiene varios detalles secundarios, cuyo código es igual al principal, solo que al final se le añade una letra para que se diferencien, y cada uno tenga un código único, éstos cód. Secundarios también se enlazan en un label cada uno (LblDocSerieNum01 = LblDocSerieNum & "/" & "A"), (LblDocSerieNum02 = LblDocSerieNum & "/" & "B") Ejm: RECIBO EGRESOS/1-117/20602524559/A

        RECIBO EGRESOS/1-117/20602524559/B

En total son 11 códigos (1 cód. Princial y 10 cód. Secundarios), el detalle está en que no siempre un documento tiene detalles, sino está conformado por un solo código (el principal), y en otros casos tiene más de un detalle, es decir, más de un cód. Secundario. Entonces, al hacer el bucle con el Do While Loop, me busca el primer cód. Que es el principal, y según sea el botón en el que esté el código (CmdEliminar, CmdActualizar), eliminaría o actualizaría solo los datos que están enlazados al cód. Principal, pero no los demás campos que están enlazados a los cód. Secundarios.

Por favor necesito que me orienten cómo puedo hacer para que se eliminen todas las filas que corresponden a un documento que tenga o no detalle, y hacer lo mismo para cuando se necesite actualizar los campos con nuevos datos o quitar alguno de ellos.

1 respuesta

Respuesta
1

Si compartes una parte de tus datos como para entender mejor (OneDrive o Google Drive o DropBox o etc.), sería más fácil ayudarte. Hasta donde entendí, en una celda (de cierta columna) hay un código principal y ¿en la celda(s) de al lado? Hay al menos un código secundario que es igual al principal pero con una letra extra ¿es así? Y quieres eliminar aquellos que coincidan en su código secundario con el código principal.

Abraham Valencia

Buen día Abraham, el orden de los códigos es primero o arriba el principal y debajo de éste van los cód. secundarios, todos en forma vertical, sus datos de cada uno de ellos van hacia el lado derecho en forma horizontal, por eso que usando el Do While Loop, me busca solo el cód. principal y a éste lo puedo eliminar o actualizar sus datos, pero con los cód. secundarios no puedo hacerlo. Ejm:

RECIBO EGRESOS/1-117/20602524559       ===> Cód. Principal           ===> "DATOS"

RECIBO EGRESOS/1-117/20602524559/A   ===> Cód. Secundario 1   ===> "DATOS"

RECIBO EGRESOS/1-117/20602524559/B   ===> Cód. Secundario 2   ===> "DATOS"

este es el link del archivo:

https://drive.google.com/file/d/14djbY_fSsnMX9WV46zYCMBREpopZBsuZ/view?usp=sharing

Una forma simple como para que te des idea:

Sub Borrando()
Dim UltimaFila As Long, x As Long
Let UltimaFila = Cells(Rows.Count, 1).End(xlUp).Row
For x = UltimaFila To 5 Step -1
If Left(Range("A" & x).Value, 31) = "RECIBO EGRESOS/-136/12345678910" Then
Range("A" & x).EntireRow.Delete
End If
Next x
End Sub

Comentas

Abraham Valencia

Gracias por tu respuesta Abraham, pero no entiendo lo que hace el código, por favor podrías explicármelo, y este mismo código lo usaría también para cuando se requiera actualizar los datos ya registrados (es decir corregir y/o quitar algún dato)?, disculpa que no te entienda, mis conocimientos en VBA son limitados. Gracias por tu comprensión.

Tienes macros en el archivo así que asumí que algo del tema. Mira los comentarios que he agregado:

'encontramos la última fila con datos y usaremos el número de fila
Let UltimaFila = Cells(Rows.Count, 1).End(xlUp).Row
'Este bucle va desde el número de fila encontrado hasta la fila 5 que es la primera con datos
For x = UltimaFila To 5 Step -1
    'este IF revisa si coinciden los 31 caracteres de la celda con el código ahí ingresado
    ' si coinciden, borra toda la fila
    If Left(Range("A" & x).Value, 31) = "RECIBO EGRESOS/-136/12345678910" Then
        Range("A" & x).EntireRow.Delete
    End If
Next x

 Sobre actualizar datos, en mi blog tengo un ejemplo (N° 9) que te puede guiar:

Abraham Valencia

Abraham, gracias por tu ayuda y disculpa si te molesto con mis preguntas, pero sabes, fue mi error al no mencionar y en el archivo no incluir, pero, no solo se registran los "Recibos de Egresos", sino también otros tipos de documentos como los que figuran en la hoja Parámetros (Factura, Bol. Vta., etc) y otros que aun no se han añadido, es decir, el código que me has propuesto funciona solo cuando se trate de los "Recibos de Egresos" pero con los demás tipos documentos no, ya que los otros documentos tienen diferentes nombres y por lo tanto la cantidad de caracteres en el código (principal y secundarios) que se generen varían, cómo podría hacer en esos casos?

En tu hoja "parámetros" podrías tener una lista de tus códigos principales "únicos" y en la celda de su derecha el número de caracteres de dicho código (con la función "Largo" lo obtienes rápidamente).

Luego llenas, por ejemplo, un "Combobox" en tu "UserForm" con los códigos de la lista y podrías hacer que cada vez que se elija un valor en el "Combobox" una variable obtenga el valor del número de caracteres, algo así:

Variable = Application.WorksheetFunction.Vlookup (Combobox1,WorkSheets("PARAMETROS").Range("R1:S20"),2,0)

Y luego reemplazas valores:

If Left(Range("A" & x).Value, Variable) = Combobox1 Then

Abraham Valencia

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas