Bucle infinito

Hola Elsa
¿que crees? Hice la modificación pero ahora se queda en un bucle infinito que me obliga a cortar Excel, siguiendo el programa me doy cuenta  que la línea "nuevo=midato.addres nunca cambia la posición aunque lo este condicionando a que si el  siniestro y rubro encontrados son los mismos que se solicitaron para grabar los cambios simplemente no esta coordinado y eso es lo que truena las lineas de Range(NUEVO).Offset(0, 30)puedes ayudarme? Esta pregunta la hice en "guardar el registro correcto"
==========================
Hola:
Leyendo tu macro noté que estás guardando la fila antes del bucle DO, por lo que si encuentra el registro dentro del bucle lo coloca en la fila del primer encontrado.
Realizá este cambio que dejé en negrita.
Private Sub CmbAceptar_Click()
 Sheets("BASE").Select
 ActiveSheet.Unprotect (14)
 Filalibre = Range("A3").End(xlDown).Offset(1, 0).Row 'la variable filalibre guarda el nro. De la primer celda vacía.
 Control = 0
 Dato = TxtSiniestro
 Dato2 = CboRubro
 Rango = "A3:A" & Filalibre
 ActiveSheet.Range("A3").Select
 While ActiveCell <> ""
  Set Midato = Sheets("Base").Range(Rango).Find(Dato, LookIn:=xlValues, lookat:=xlWhole)
   If Not Midato Is Nothing Then 'lo encontro
    'NUEVO = Midato.Address     aquí no va
    Dato3 = ActiveCell.Offset(0, 1).Value
     Do
      If Dato2 = Dato3 Then
       MsgBox NUEVO
       NUEVO = Midato.Address
       Sheets("Base").Select

1 Respuesta

Respuesta
1
Si así es como te lo indiqué, el error fue mío, disculpa.
Tiene que ser a continuación del DO
Do
NUEVO = Midato.Address
      If Dato2 = Dato3 Then
      MsgBox NUEVO
       Sheets("Base").Select
Sdos
Hola Elsa
Ya hice el cambio, siguiendo el las instrucciones paso apaso encuentra y coloca ahora si en el renglón, pero sigue quedándose en el bucle infinito ¿no tendré algún desorden en las instrucciones?
Private Sub CmbAceptar_Click()
 Sheets("BASE").Select
 ActiveSheet.Unprotect (14)
 Filalibre = Range("A3").End(xlDown).Offset(1, 0).Row 'la variable filalibre guarda el nro. de la primer celda vacía.
 Control = 0
 Dato = TxtSiniestro
 Dato2 = CboRubro
 Rango = "A3:A" & Filalibre
 ActiveSheet.Range("A3").Select
 While ActiveCell <> ""
  Set Midato = Sheets("Base").Range(Rango).Find(Dato, LookIn:=xlValues, lookat:=xlWhole)
   If Not Midato Is Nothing Then 'lo encontro
    'NUEVO = Midato.Address
     Do
      Nuevo = Midato.Address
      Dato3 = Range(Nuevo).Offset(0, 1).Value
      If Dato2 = Dato3 And Dato = Midato Then
        MsgBox Nuevo
        Sheets("Base").Select
        Range(Nuevo).Offset(0, 30).Value = Format(TxtFechaIngreso.Value, "DD-MMM-YY") 'Diasin
        Range(Nuevo).Offset(0, 31).Value = TxtPagosAnte                                'Pagos
        Range(Nuevo).Offset(0, 32).Value = Format(TxtRecuperable.Value, "$###,###,###.00") 'Monto Recuperable
        Range(Nuevo).Offset(0, 33).Value = Format(TxtRecuperado.Value, "$###,###,###.00")  'Monto Recuperado
        Range(Nuevo).Offset(0, 34).Value = CboRubroRecup                                    'Rubro Recuperacion
        Range(Nuevo).Offset(0, 35).Value = CboAbogado                                       'Abogado Asignado
        Range(Nuevo).Offset(0, 36).Value = CboRubroRecup                                    'Rubro Recuperado
        Range(Nuevo).Offset(0, 37).Value = TxtRed                                           'Red
        Range(Nuevo).Offset(0, 38).Value = Format(TxtMontoTotal.Value, "$###,###,###.00")   'Monto Total de Deuda
        '================================================
        Range(Nuevo).Offset(0, 39).Value = "MAY"                                  'Bandera de mes
        Sheets("Principal").Select
      End If
     Set Midato = Sheets("Base").Range(Rango).FindNext(Midato)
     'el bucle continúa mientras se encuentre coincidencias y NO sea la primer celda encontrada
     Loop While Not Midato Is Nothing And Midato.Address <> Nuevo
   End If
   Set Midato = Nothing
   ActiveCell.Offset(1, 0).Select
 Wend
 Sheets("Principal").Select
 CmbAceptar.Enabled = True
 ActiveSheet.Protect Password:="14"
End Sub
No sé si comprendés del todo lo que estás haciendo, o hay alguna razón para tener 1 bucle dentro de otro:
While ActiveCell <> ""
  Set Midato = Sheets("Base").Range(Rango).Find(Dato, LookIn:=xlValues,   lookat:=xlWhole)
   If Not Midato Is Nothing Then 'lo encontro
    'NUEVO = Midato.Address
     Do
      Nuevo = Midato.Address
      Dato3 = Range(Nuevo).Offset(0, 1).Value
      If Dato2 = Dato3 And Dato = Midato Then
'tu código para el registro encontrado
      End If
     Set Midato = Sheets("Base").Range(Rango).FindNext(Midato)
     'el bucle continúa mientras se encuentre coincidencias y NO sea la primer celda encontrada
     Loop While Not Midato Is Nothing And Midato.Address <> Nuevo
   End If
   Set Midato = Nothing
   ActiveCell.Offset(1, 0).Select
 Wend
'lo que está en cursiva no es necesario porque estás usando Find(Dato) por lo tanto será = Midato con seguridad
Es decir, que estando en A3 se ejecuta la rutina. Si encontró el Dato en el Rango, copia en esa fila el contenido de los controles
Después le indicás que se posicione en la fila siguiente (A4) y repita el proceso con los mismos datos y en el mismo rango (en realidad estás sobrescribiendo lo que ya escribió)
Y así hasta que encuentre una celda vacía en col A
Revisá nuevamente tu proceso, porque creo que el While... Wend está de más.
Sdos
Elsa
PD) ¿Todavía sin un buen manual de macros?
http://aplicaexcel.galeon.com/manuales.htm
Hola Elsa
Veras trato de hacer lo siguiente :usando el mismo formulario le pido al usuario que teclee el número de siniestro y rubro con el que se debió haber dado de alta el siniestro (en otro modulo) si no es el siniestro con el rubro no le permite capturar y le arroja un mensaje de que debe darlo de alta.
Esto se pide por que un siniestro se puede dar de alta hasta 8 veces con diferente rubro.
Si el usuario pide el correcto entonces el formulario trae los datos que ya fueron dados de alta la primera vez como son: Fecha, Aseguradora, región etc. para que sirvan de referencia de que estamos trabajando con el siniestro correcto.
Con los datos desplegados en la parte superior (usando buscar_altas) el usuario teclea los datos nuevos que corresponden a este modulo como son: monto recuperado, monto recuperable, fecha de ingreso, rubro de recuperación etc.
Como el dato que despliega (buscar_altas), no contiene la posición de la celda, El do While permite hacer esta búsqueda otra vez hasta que lo encuentra y como hay números de siniestro repetidos entomnces debe coincidir con el rubro también.
Aquí es donde entra el IF si estos 2 datos coinciden con lo del Textbox entonces procede a grabar en la posición correcta.
Fue la única manera en que me ha dejado hacerlo después de quitar y poner y buscar de otras formas, pero si tu tienes una mejor sugerencia te agradecería mucho la ayuda, la cual ha siempre muy valiosa para mi.
Mil gracias y recibe un cordial saludo.
Empecemos entonces desde el inicio.
El DO ... Loop alcanza para realizar la búsqueda hasta encontrar que coincidan los 2 criterios.
Te adjunto una rutina extraída de mi manual 400Macros, a la que le hice pequeñas modificaciones para que se parezca a tu caso. Como sos un programador ya experimentado no tendrás inconvenientes en adaptarlo a tu modelo.
Sub BusquedaContinua()
'desarrollada por Elsamatilde
Dim busca As Object
Dim Primero
Dim hojaBusc As String, quebusco As String, mihoja As String
Dim quebu2 As String
'en la siguiente variable se indica la hoja dónde buscar
hojaBusc = "Hoja3"
'el dato a buscar se encuentra en B2 de la hoja activa
'la variable "mihoja" será donde se volcarán los datos
mihoja = "Hoja2"
quebusco = Sheets(mihoja).Range("B2")
quebu2 = Sheets(mihoja).Range("C2")
'la búsqueda se realiza sobre la columna C de la Hoja3
Set busca = Sheets(hojaBusc).Range("C5:C65500").Find(quebusco, LookIn:=xlValues, Lookat:=xlWhole)
'si busca No es Vacío. es decir si la búsqueda es exitosa y encuentra el dato, guarda la dirección en la variable Primero
If Not busca Is Nothing Then
Primero = busca.Address
'comienza el bucle
Do
If busca.Offset(0, 1) = quebu2 Then
'completa la fila de la hoja activa (Hoja2) con datos del registro encontrado
Sheets(mihoja).Cells(5, 1) = busca                'dato de col A
Sheets(mihoja).Cells(5, 2) = busca.Offset(0, 1)   'dato de col B
Sheets(mihoja).Cells(5, 3) = busca.Offset(0, 2)   'dato de col C
Exit Do
End If
'continúa la búsqueda
Set busca = Sheets(hojaBusc).Range("C6:C65500").FindNext(busca)
'se repite la rutina hasta volver a la primer dirección guardada. Ahí termina el ciclo
Loop While Not busca Is Nothing And busca.Address <> Primero
End If
'se libera la variable
Set busca = Nothing
End Sub
Sdos
Elsa

Añade tu respuesta

Haz clic para o