Evitar error en la función range find si no encuentra ningún valor
Tengo este macro:
Im filab As Integer
Dim FILACITA
ActiveSheet.Range("A21").Select
FILACITA = ActiveCell.Offset(1, 1)
While ActiveCell.Value <> ""
filab = Sheets("ABONOS").Range("A1000").End(xlUp).Row + 1
Sheets("ABONOS").Cells(filab, 1) = ActiveSheet.Range("G4") 'FECHA
Sheets("ABONOS").Cells(filab, 2) = ActiveCell.Offset(1, 1) ' N FACTURA
Sheets("ABONOS").Cells(filab, 3) = ActiveCell.Offset(1, 0) ' CLIENTES
Sheets("ABONOS").Cells(filab, 4) = ActiveCell.Offset(1, 3) ' TOTAL
Sheets("CREDITOS").Select
ActiveSheet.Range("B:B").Find(FILACITA).Select
If ActiveCell.Offset(0, 7) = 0 Then
ActiveCell.Offset(0, 6) = Sheets("CIERRE").Range("G4")
Sheets("CIERRE").Select
filab = filab + 1
ActiveCell.Offset(1, 0).Select
Else
filab = filab + 1
ActiveCell.Offset(1, 0).Select
End If
Wend
Lo que hace es pasar todas las cobranzas de una parte a otra, y si la deuda con ese abono llega a cero, entonces le pone automáticamente la fecha del pago. El problema esta en que si la factura no esta registrada, me da el error "variable de objeto o bloque with no definido", quiero que si el numero de factura no lo encuentra, entonces que simplemente ignore eso y continué con el código
1 Respuesta
Podrías explicar tu proceso.
¿En cuál hoja comienza tu proceso?
Sheets("CREDITOS").Select ActiveSheet.Range("B:B").Find(FILACITA).Select If ActiveCell.Offset(0, 7) = 0 Then ActiveCell.Offset(0, 6) = Sheets("CIERRE").Range("G4") Sheets("CIERRE").Select
En esa parte del código seleccionas la hoja "CREDITOS", si la celda es igual a 0, seleccionas la hoja "CIERRE", pero si no es igual a 0, entonces el programa sigue en la hoja "CREDITOS".
Mejor explica, donde empiezas, qué datos lees y dónde los quieres poner.
Si pudieras explicar con un ejemplo, sería más fácil de entender.
Disculpa, no me funciono:(( cuando no encuentra el numero de factura da error, lo que quiero es que si no encuentra el numero de factura (filacita), no de error y siga con el código
Pero no entiendo tu macro, por eso te pedí la explicación del proceso.
Cuando entienda el proceso podré hacer cambios en tu macro.
Podrías explicar tu proceso.
¿En cuál hoja comienza tu proceso?
El proceso comienza en la hoja cierre, en esa parte del macro que puse lo que hace es tomar todos los abonos del día, y quiero que automáticamente si una deuda llega a 0 (eso esta en la hoja créditos), entonces se me ponga automáticamente la fecha que esta en la celda g4, el problema es que a veces la factura no esta en esa hoja, por equis razón. Entonces quiero evitar que me salga ese error, es decir, si no encuentra ninguna factura entonces no importa, que ignore el proceso
Pensé que funcionaria así:
While ActiveCell.Value <> ""
filab = Sheets("ABONOS").Range("A1000").End(xlUp).Row + 1
Sheets("ABONOS").Cells(filab, 1) = ActiveSheet.Range("G4") 'FECHA
Sheets("ABONOS").Cells(filab, 2) = ActiveCell.Offset(1, 1)
Sheets("ABONOS").Cells(filab, 3) = ActiveCell.Offset(1, 0) ' CLIENTES
Sheets("ABONOS").Cells(filab, 4) = ActiveCell.Offset(1, 3) ' TOTAL
If FILACITA <> "" Then
Sheets("CREDITOS").Select
On Error Resume Next
ActiveSheet.Range("B:B").Find(FILACITA).Select
If ActiveCell.Offset(0, 7) = 0 Then
ActiveCell.Offset(0, 6) = Sheets("CIERRE").Range("G4")
Sheets("CIERRE").Select
filab = filab + 1
ActiveCell.Offset(1, 0).Select
Else
Sheets("cierre").Select
filab = filab + 1
ActiveCell.Offset(1, 0).Select
End If
Else
Sheets("cierre").Select
filab = filab + 1
ActiveCell.Offset(1, 0).Select
end if
wend
Pero ahora no me pone la fecha automáticamente, es como si no existiera esa línea
El proceso comienza en la hoja cierre
Solamente entendí esa parte.
No conozco tu proceso, así que podrías explicarlo, paso a paso.
1. Entonces, empiezas en la hoja "Cierre"
2. Cuál es el siguiente paso.
No entiendo tu macro, podrías explicar tu proceso, paso a paso sin utilizar código.
Por ejemplo:
If ActiveCell.Offset(0, 7) = 0 Then
No sé cuál es la celda activa, por lo tanto no sé cuál es la celda a 7 columnas.
Ya no pongas código, explica paso a paso lo que quieres hacer. Sería fabuloso si lo puedes explicar con imágenes.
Ok, tengo tres hojas en este caso. Cierre, créditos y abonos.
En la hoja cierre comienza el proceso, captura los datos desde el rango A22(empezando en el a21 y utilizando el offset). Entonces me captura el cliente (offset 1,0). Numero de factura (offset1, 1) y monto (offset 1,3) y aparte una fecha que es fija (g4). Ok, cuando yo paso estos datos a la hoja abonos automáticamente estos abonos me bajan la deuda de su respectiva factura, quiero que si si la deuda llega a 0, automáticamente se me ponga la fecha de g4. es por eso que uso esta parte
sheets("CREDITOS").Select ' selecciona la hoja donde se va a buscar la factura
On Error Resume Next
ActiveSheet.Range("B:B").Find(FILACITA).Select ' la columna b es donde estan todos los numeros de factura, filacita viene siendo el numero de factura
If ActiveCell.Offset(0, 7) = 0 Then 'una vez que se encontro el nro de factura, selecciona esa celda. y mira si su su deuda (offset 0,7) es igual a 0
ActiveCell.Offset(0, 6) = Sheets("CIERRE").Range("G4") 'en caso de que si sea igual a cero entonces coloca la fecha de la celda g4, que es la fecha del cierre
Sheets("CIERRE").Select ' selecciona la hoja cierre
filab = filab + 1 aumenta la variable para repetir el bucle
ActiveCell.Offset(1, 0).Select baja una fila en la celda y repite todo
Else
De lo contrario entonces solo selecciona la la hoja cierre y vuelve a repetir el bucle
Sheets("cierre").Select
filab = filab + 1
ActiveCell.Offset(1, 0).Select
End If
Else
Sheets("cierre").Select
filab = filab + 1
ActiveCell.Offset(1, 0).Select
end if
¿Si me explique bien?
Entonces, todo me funciona correctamente el único error es que cuando puse on error resume next, dejo de darme el error pero también dejo de funcionar el código. Y antes de modificarlo estaba como puse el código al principio, ahí me daba error cuando no encontrataba ningún numero de factura por lo que veo
No entiendo tu explicación, te pedí que no pusieras código. Te pedí que pusieras imágenes.
Captura los datos desde el rango A22(empezando en el a21
Qué es eso, ¿Empiezas en A22 o en A21?
Me captura el cliente (offset 1,0).
Qué es eso?
Realiza lo siguiente, busca la la factura con el método find, si lo encuentras continúas con tu código, si no lo encuentra que no haga nada:
dim f as range set f = sheets(hoja).range(columna).find(factura, , xlvalues, xlwhole) if not f is nothing then 'sí encontró la factura, continúa el código end if
Si tienes problemas para poner el código, yo te ayudo con todo gusto, pero para saber en dónde poner el código, necesito entender tu proceso, y para entender el proceso, debes explicarlo paso a paso sin código.
Imagina que no soy experto en VBA y le estás explicando el proceso a una persona que no sabe nada de VBA, entonces no utilices código.
Pon un par de imágenes para apoyarte y puedes explicar.
OK.. al referirme a que comienza en el rango A21 pero comienza a capturar en el A22, es porque selecciona inicialmente el A21 y luego comienza a bajar filas
Comienza en a21 (DESCRIPCIÓN) y va moviéndose columnas y filas
Ahora estos datos se pasan para la hoja abonos
Ok, y tengo una fórmula en la hoja créditos para que me sume todos los abonos que se le hagan a una factura.
En la columna abonos esta la fórmula, utilizo sumar.si. y tenemos la columna deuda, que es la resta de la columna total, con la columna abonos. Con el principio del macro. Todos esos datos son capturados y todas las hojas se actualizan sin problema. Ahora lo que quiero es que si la columna deuda es igual a 0 ( la 7) entonces en la columna fecha del pago se coloque la fecha que esta indicada en la celda G4 de la hoja cierre. Lo que quiero es que si esa factura no esta en la hoja créditos, que continué con el código normal y en caso de que esté, si la deuda es igual a 0, entonces se coloque la fecha de la celda g4 de la hoja cierre
¿Ahora si? :(
Gra cias por la explicación y por las imágenes.
Tus imágenes están incompletas (no se ven las filas ni las columnas) y no tienen datos.
En las imágenes debes poner ejemplos. En base a esos ejemplos debes realizar la explicación.
Traté de armar tu rompecabezas. Todavía tengo una duda, ¿en la columna Factura siempre es la misma factura?
En tu código solamente lees una vez la factura y lo haces antes del ciclo:
FILACITA = ActiveCell.Offset(1, 1) While ActiveCell.Value <> ""
Si es la misma factura entonces prueba lo siguiente:
Sub test_24() Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet Dim f As Range, i As Long ' Set sh1 = Sheets("CIERRE") Set sh2 = Sheets("ABONOS") Set sh3 = Sheets("CREDITOS") ' Set f = Sheets("CREDITOS").Range("B:B").Find(sh1.Range("B22"), , xlValues, xlWhole) i = 22 Do While sh1.Range("A" & i) <> "" sh2.Range("A" & Rows.Count).End(3)(2).Resize(1, 4).Value = Array(sh1.Range("G4").Value, _ sh1.Range("B" & i).Value, sh1.Range("A" & i), sh1.Range("D" & i)) If Not f Is Nothing Then If sh3.Range("I" & f.Row) = 0 Then sh3.Range("H" & f.Row) = sh1.Range("G4") i = i + 1 Loop End Sub
Prueba la macro y me comentas.
Si falta algo, entonces ahora sí, realiza la explicación con imágenes que contengan datos.
son varias facturas
tenemos estas dos cobranzas (hoja cierre)
esa informacion se va a esta hoja (abonos) ignora la columna E
y luego todos esos abonos, se suman a su respectiva celda de la columna abonos
como puedes ver, ahi la deuda llego a cero, entonces, cuando yo proceso toda esta informacion de la hoja cierre, en la celda g4 esta la fecha del dia, por lo tanto es la fecha de la cobranza, asi que la fecha del pago es la fecha en la se saldo la deuda. por lo general las empresas van abonando en varias cuotas, por lo que quiero es que si la deuda de una factura llega a 0, entonces que se ponga su respectiva fecha, pero si no es asi, que ignore el codigo, y si por alguna razon El numero de factura buscado no se encuentra en la hoja. de igual forma ignore el codigo y continue procesando
Disculpa que insista, pero tus imágenes están incompletas, no veo las columnas, no puedo saber en cuál columna están los datos. Solamente en la segunda imagen se ven las columnas (A, B, C, D y F).
Puedes responder esto:
¿En la columna Factura siempre es la misma factura?
En tu código solamente lees una vez la factura y lo haces antes del ciclo:
FILACITA = ActiveCell.Offset(1, 1) While ActiveCell.Value <> ""
Entonces si no es la misma Factura, debes poner el número de factura dentro del ciclo, de esa manera, la variable tomará el nuevo número de factura y lo buscará en la hoja "CREDITOS".
Ayúdame a ayudarte. Con gusto te sigo ayudando, pero pon las imágenes completas.
La segunda imagen está perfecta.
De la hoja "CREDITOS", Puedes reducir el ancho de las columnas para que la imagen pueda verse mejor.
- Compartir respuesta