Error al comparar fechas en una macro.

Tengo un formulario que jala una macro, en esta macro hay un for each que selecciona todos los archivos con cierto formato, los abre en formato de texto y luego los consolida.

Todo estaba bien hasta que me solicitaron que se puedan ingresar parametros de texto, a lo que añadi un formulario con 2 combobox y a estos les añadi la clase date time picker (userform4).

Ahora cada vez que intento llamar desde esta macro las variables de fecha, no me da error pero al parecer hay un problema con el formato de fechas pues no me ejecuta nada.

Porfa su apoyo, estoy cabezón con esto :(

Adjunto como cree el data time picker
Private Sub UserForm_Initialize()
Set dpFrom = New DateTimePicker
With dpFrom
.Add ComboBox1
.Add ComboBox2
.Create Me, "dd/mm/yyyy", BackColor:=&H125FFFF, TitleBack:=&H808000, Trailing:=&H99FFFFF, TitleFore:=&HFFFFFF
End With
End Sub

ADJUNTO MACRO QUE CONSOLIDA INFORMACION
Sub DoFolder3(Folder3)
Dim SubFolder3
Dim fecha
Dim ruta
Dim PrimeraCelda As Long ' captura el valor de la primera celda vacia
Dim UltimaFila As Long 'captura el valor de la ultima fila
Dim StorePath() As String
Dim StoreName As String
'---
Dim rowita 'Almacena el numero de filas actuales para quitar encabezado
Dim columnita 'Almacena el numero de columas actuales para quitar encabezado
Dim celdapegado
For Each SubFolder3 In Folder3.SubFolders
DoFolder3 SubFolder3
Next
Dim File
For Each File In Folder3.Files
Dim Rango1 As String
Dim Rango2 As String
Rango1 = UserForm4.dpFrom.Value(1)
Rango2 = UserForm4.dpFrom.Value(2)
If Right(File.Name, 4) = ".DBF" And Left(File.Name, 2) = "VT" And (FileDateTime(File) >= CDate(Rango1)) And (FileDateTime(File) <= CDate(Rango2)) Then
cuentaarchivos = cuentaarchivos + 1
Debug.Print File.Path
StoreName = File.Path
StorePath = Split(StoreName, "\")
StoreName = StorePath(UBound(StorePath) - 1)
Debug.Print StoreName
Workbooks.OpenText Filename:=(File.Path)

1 Respuesta

Respuesta
1

Hello Alex,

¿Dónde has declarado el objeto DateTimePicker? Lo estas inicializando sin haberlo declarado. Honestamente no se de donde lo sacaste, ¿qué librería es? ¿Te refieres al control DatePicker?:

Y para comparar dos fechas yo prefiero usar la función DateDiff. En los códigos que muestras nada hace indicio de una comparación de fechas.

Hola Andy, gracias por tu pronta respuesta.

Si tienes razón, si lo he declarado, lo declare en el formulario, solo que no llegue a copiarlo por que el código es bastante grande y solo pegue algunas cosillas

'Public dpFrom As DateTimePicker

En realidad buscando encontré esta librería con este nombre, asumo que es la que mencionas pues es lo mismo, líneas arriba te muestro como la declare y me sale el mismo elemento que en tu combobox. En realidad no quiero comparar las dos fechas, mi lógica en ese código ha sido que solo seleccione los archivos que según la fecha ingresada en los 2 combos (CB1 Y CB2), solo seleccione los archivos que terminen en DBF, comencen en VT y que estén dentro de rango de fechas que inicialmente solicito en los combos.

If Right(File.Name, 4) = ".DBF" And Left(File.Name, 2) = "VT" And (FileDateTime(File) >= CDate(Rango1)) And (FileDateTime(File) <= CDate(Rango2)) Then

Ah disculpa, no había visto el resto de esa línea, como es larga estaba escondida en la etiqueta de código. Recuerdo que te ayude a construir esa macro.

Veras, la función FileDateTime() arroja la fecha junto con la hora, te recomendaría hacerlo en un IF anidado y no en la misma comprobación ya que va a requerir que manipules un par de variables.

Tu tienes esto:

IF condicion And condicion And segundaCondicion And segundaCondicion Then

A lo que me refiero es esto:

IF condicion And condicion Then

IF segundaCondicion And SegundaCondicion Then

Primero chequea el nombre del archivo nada más, si se cumple, entonces abajo chequea su fecha. Y como dije antes, DateDiff te va a ayudar.

En mi opinión es más limpio y acertado comparar fechas con DateDiff que con los comparadores > < =

Claro Andy, también me acuerdo por tu imagen, me salvaste de unas buenas, ahora ya mi conocimiento ha aumentado pero hay cosas que aun no se, ya que aprender de manera autónoma no es fácil ja ja.

Mira, te cuento que ya lo hice en dos if anidados y los cerré (end if) juntos también, pero a pesar de ello tengo problemas. La macro esta haciendo el recorrido como si esas dos validaciones fueran falsas (a pesar de que son verdaderas). No logro entender cual es el error.

Por cierto, ¿cómo podría usar el date diff? Por que solo noto que se puede usar para hallar diferencia entre dos fechas y lo que quiero es hallar un rango.

Muchas Gracias!

Muéstrame como te quedo ese pedazo del código.

Es igual, cuando tu dices Fecha1 > Fecha2 estas haciendo lo mismo que DateDiff.

DateDiff devuelve un Integer. Cuando el Integer es = 0 significa que se trata de la misma fecha, cuando es mayor a 0 (un numero positivo) significa que la fecha aun no ha llegado, y cuando es menor a 0 (un numero negativo) significa que la fecha ya pasó. Eso obviamente dependerá del orden en que las pusiste en los parámetros.

Por ejemplo, yo lo pondría así:

If Right(File.Name, 4) = ".DBF" And Left(File.Name, 2) = "VT" Then
FlDate = Format(FileDateTime(File), "mm/dd/yyyy") 'cambia el formato a como sea Rango1 y Rango2'
If DateDiff("d", flDate, Rango1) < 0 And DateDiff("d", flDate, Rango2) > 0 Then
    'aqui ejecutas lo que debe pasar si todo eso se cumple'
End If
End If

Andy

Si no me decías, no hacia las pruebas. Ya me di cuenta del error, las fechas que me jala del UserForm4.dpFrom.Value(1), me esta jalandoun valor en 0 cuando lo imprimo desde el modulo, pero cuando lo imprimo en el formulario si se esta guardando correctamente.

¿Qué crees que podría ser? Mira te dejo una imagen de mi código para que veas, a la izquierda esta lo programado en el modulo y en la derecha lo del formulario. Nunca he programado jalando variables de un modulo a un formulario, quizá por eso pueda ser.

Ach no estoy seguro, pero presiento que es porque no le estas pidiendo el VALOR a los controles RangoFecha1 y RangoFecha2

Veo mucho este problema aquí en Todoexpertos, no se por que dejan el control "desnudo" jajaja

Me refiero a esto:

UserForm4. RangoFecha1 <---(cri cri cri, grillos de soledad)

intenta con: UserForm4.RangoFecha1.Value

o .Text (ultima opción)

No he usado mucho ese control, así que no estoy seguro, pero inténtalo.

Espera, ya me di cuenta del erro JA JA, soy un torpe. La variable esta muriendo al cerrar el formulario. Cuando le doy el Unload me, se perdían las variables, por eso el modulo no capturaba la variable y quedaba en 0, ya hice las pruebas y se ejecuta. Creo que creare la variable en mi libro modulo. Andy como algo personal, una pregunta, ¿sabes de algún buen curso o libro? Por que lleve uno en udemy y uno presencial y no me fue muy bien. Muchas Gracias! Me sirvió mucho lo del datediff!

Hombre pues, curso sobre VBA no conozco, tengo 10 años de experiencia con VBA y la verdad es que no he necesitado cursos (recientemente jaja). Tenia entendido que los cursos en Udemy son buenos, yo tengo muchos de Udemy pero de otras materias, diseño digital mas que nada, de programación no necesito, así que no sabría recomendarte alguno. Lo que si conozco son algunos foros o blogs pero están en ingles. Yo estoy pensando abrir un canal de youtube y quizás algún blog personal en español, ya te avisare.

Mi idea precisamente es enseñar las buenas practicas en VBA porque veo muchas cosas por ahí que dan ganas de llorar, ayer vi un video de un chico haciendo un tutorial de Excel VBA y casi me arranco los pelos de lo mal que está y la maratón de desinformación jaja.

Te había respondido pero no aparece la respuesta. Te decía que tengo unos 10 años de experiencia con VBA en Excel y no he necesitado cursos recientes, así que no sabría recomendarte alguno. Pero yo estoy pensando abrir algún canal de youtube principalmente para dar información sobre las mejores practicas de VBA porque tutoriales hay muchísimos, pero la mayoría son malos. Te contaba que ayer vi un video que da pena, y tiene muchos seguidores. Lo que hizo ese chico en ese video se podía hacer mucho pero mucho mucho mejor.

Disculpa, no pude conectar y concuerdo contigo, no hay buenas practicas, todo es muy básico y lamentablemente cuando busco profundizar me topo con información muy básica, solo quedan los fotos y cuando te animes a hacer tu canal avisame por favor. Muchas Gracias!

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas