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

Respuesta
1

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.

Creo que ya me funciono, era simplemente por eso de que no seleccionaba de nuevo la hoja cierre

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.

ok ya voy a hacerlo de nuevo.. ¿pero no hay una manera de hacer eso mismo con fórmulas? Seria mucho más fácil, estoy probando con max condicional a ver

Creo que lo logre con fórmulas!

Me alegra saber que ya funciona para ti.

Para futuras preguntas, anexo un ejemplo de una imagen:

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas