Problema con el método Range.Find

Les escribo nuevamente para solicitar su ayuda con problema que me tiene algo desubicado, el código es el siguiente:

Sub pruebas()
Dim Fecha As Date, Rango As Range, RangoF As Range, FechaFinal As Integer, FechaInicio As Integer, RangoC As Range
Set Rango = Sheet2.ListObjects("Table1").ListColumns(2).Range
TurnoX = Sheet1.Cells(Rows.Count, "G").End(xlUp).Value
Fecha = Date - 1 'Format(Date, "MMDDYYYY")
FechaInicio = Rango.Find(Fecha, LookIn:=xlValues, searchdirection:=xlNext).Row
FechaFinal = Rango.Find(Fecha, LookIn:=xlValues, searchdirection:=xlPrevious).Row
RangoF = Range(Cells(FechaInicio, 6), (Cells(FechaFinal, 6)))
RangoC = Range(Cells(FechaInicio, 3), (Cells(FechaFinal, 3)))
TurnoEnRango = WorksheetFunction.CountIf(RangoC, Turno) '''coincidencias encontradas del turno actual en la fecha actual
Coincidencias1 = WorksheetFunction.CountIf(RangoF, 1) '''coincidencias encontradas de la fecha actual de la maquina 1
Coincidencias2 = WorksheetFunction.CountIf(RangoF, 2) '''coincidencias encontradas de la fecha actual de la maquina 2
If UserForm1.OptionButton1.Value = True Then
    If Coincidencias1 >= 1 And TurnoEnRango >= 1 Then
        UserForm1.OptionButton5.Value = True
        UserForm1.OptionButton5.Enabled = False
        UserForm1.OptionButton6.Enabled = False
            Else
                UserForm1.OptionButton5.Value = False
                UserForm1.OptionButton5.Enabled = True
                UserForm1.OptionButton6.Enabled = True
    End If
    Else
If UserForm1.OptionButton2.Value = True Then
    If Coincidencias2 >= 1 And TurnoEnRango >= 1 Then
        UserForm1.OptionButton5.Value = True
        UserForm1.OptionButton5.Enabled = False
        UserForm1.OptionButton6.Enabled = False
            Else
                UserForm1.OptionButton5.Value = False
                UserForm1.OptionButton5.Enabled = True
                UserForm1.OptionButton6.Enabled = True
    End If
End If
End If
End Sub

El problema es las variables FechaInicio y FechaFinal, cuando cierro el archivo de excel y lo abro de nuevo me marca el error "Run-time '91':

Entonces modifico las variables cambiándolas a Range en el tipo de variable y la codificación que lleva:

Sub pruebas()
Dim Fecha As Date, Rango As Range, RangoF As Range, FechaFinal As Range, FechaInicio As Range, RangoC As Range
Set Rango = Sheet2.ListObjects("Table1").ListColumns(2).Range
TurnoX = Sheet1.Cells(Rows.Count, "G").End(xlUp).Value
Fecha = Date - 1 'Format(Date, "MMDDYYYY")
Set FechaInicio = Rango.Find(Fecha, LookIn:=xlValues, searchdirection:=xlNext)
Set FechaFinal = Rango.Find(Fecha, LookIn:=xlValues, searchdirection:=xlPrevious)

asi funciona, pero no me da el resultado que yo espero, una vez hecho esto regreso el código como lo puse al inicio y funciona sin problema  -.- no entiendo el error o porque pasa.

1 respuesta

Respuesta
4

Prueba lo siguiente:

Debes utilizar "set" cada vez que le vas a asignar un rango.

Sub pruebas()
  Dim Fecha As Date
  Dim Rango As Range, RangoF As Range, RangoC As Range
  Dim FechaFinal As Range, FechaInicio As Range
  Dim TurnoX As Variant
  Dim TurnoEnRango As Long, Coincidencias1 As Long, Coincidencias2 As Long
  '
  Set Rango = Sheet2.ListObjects("Table1").ListColumns(2).Range
  TurnoX = Sheet1.Cells(Rows.Count, "G").End(xlUp).Value
  Fecha = Date - 1 'Format(Date, "MMDDYYYY")
  Set FechaInicio = Rango.Find(Fecha, LookIn:=xlFormulas, searchdirection:=xlNext)
  If FechaInicio Is Nothing Then
    MsgBox "No está la fecha"
    Exit Sub
  End If
  Set FechaFinal = Rango.Find(Fecha, LookIn:=xlFormulas, searchdirection:=xlPrevious)
  Set RangoF = Sheet2.Range(Sheet2.Cells(FechaInicio.Row, 6), (Sheet2.Cells(FechaFinal.Row, 6)))
  Set RangoC = Sheet2.Range(Sheet2.Cells(FechaInicio.Row, 3), (Sheet2.Cells(FechaFinal.Row, 3)))
  '
  TurnoEnRango = WorksheetFunction.CountIf(RangoC, TurnoX) '''coincidencias encontradas del turno actual en la fecha actual
  Coincidencias1 = WorksheetFunction.CountIf(RangoF, 1) '''coincidencias encontradas de la fecha actual de la maquina 1
  Coincidencias2 = WorksheetFunction.CountIf(RangoF, 2) '''coincidencias encontradas de la fecha actual de la maquina 2

Gracias Dante, agregue el .row como bien me recomiendas, pero me quedó la duda porqué no funciona así:

FechaFinal = Rango.Find(Fecha, LookIn:=xlFormulas, searchdirection:=xlPrevious).row

para obtener la posición desde la variable, tengo un codigo muy similar en otra macro y si me ha funcionado, en este caso funciona primero asignando la variable como rango y colocando Set a la variable y despues regresando todo me funciona como Integer o Long hasta que vuelvo a abrir el excel. 

Si no encuentra la fecha, entonces no te puede regresar el número de fila, por lo tanto te regresa un error.

Por esto debes establecer el rango con "Set" y después verificar si el objeto está vació o con datos.

[No olvides valorar las respuestas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas