sábado, abril 03, 2010

Posición del objeto Calendario en una hoja de Excel

De vuelta mis vacaciones estoy tratando de ponerme al día con las consultas de mis lectores. Lamentablemente no podré responder a todas, pero algunas serán transformadas en notas en el blog. Como la consulta de un lector sobre cómo posicionar el objeto Calendario en una hoja de Excel.

La consulta viene a colación de la nota sobre validación de fechas en Excel que publiqué hace ya casi tres años. Allí mostré como hacer que el objeto Calendario aparezca cuando activamos una celda de un determinado rango.

La consulta de mi lector consiste en cómo lograr que el calendario aparezca siempre a la derecha de la celda activa y no en el centro del área de la hoja que aparece en pantalla. Para lograr esto tendremos que programar la propiedad Position del Userform que contiene el calendario.

Empezamos por descargar el ejemplo de la nota mencionada. Luego activamos el editor de Vba (Alt+F11) y el Userform1. En la ventanilla de las propiedades activamos la pestaña Categorized y vamos al grupo Position



Vemos que tenemos, además del tamaño (Height y Width) la posibilidad de establecer la posición inicial (StartUpPosition)



En nuestro caso vamos a usar la opción 0-Manual. Por supuesto, esto no es suficiente y tendremos que establecer la posición relativa a la celda activa programáticamente.

Activamos el Modulo1 que contiene la rutina "abrir_calendario" y ponemos este código



Sub abrir_calendario()
    With UserForm1
        .Left = ActiveCell.Left + ActiveCell.Width + 25
        .Top = ActiveCell.Top + 75
        .Show
     End With
    
End Sub


El código es bastante obvio y se puede apreciar cómo se controla la posición en relación a la celda activa. Los parámetros "+25" y "+75" nos permiten establecer el grado de desvío.

El archivo se puede descargar gratuitamente aquí.

7 comentarios:

  1. Buenas tardes Jorge,
    Mi nombre es Fredy Arevalo, Desde mis inicios en Excel he estado visitando tu blog y puedo anotar que es lo mejor que se puede conseguir en internet, por tal motivo te felicito y agradezco todo el apoyo que tu nos prestas con tus comentarios.
    Aprovechando este mensaje me gustaría que me ayudaras con un ejercicio complejo que tengo en el cual tengo que buscar una fecha maxima en unos datos dependiendo de unos criterios.lo grave es que estos criterios estan varias veces:

    Cedula Concepto fecha valor
    1232 1300 10/02/2007 15000
    1232 1300 11/02/2008 30000
    1232 1300 02/10/2009 90000

    En este ejercicio debo tomar la cedula el concepto la fecha maxima y el valor de estos.

    Agradezco tu apoyo con el tema.

    ResponderBorrar
  2. Freddy,
    gracias por los conceptos. Este tipo de consultas no tienes que hacerla en el espacio de los comentarios sino directamente por mail, como indico en Ayuda (fijate en la barra superior del blog).

    ResponderBorrar
  3. Querido Jorge:
    He seguido tus indicaciones al pie de la letra con relación al calendario y su posición con respecto a la celda activa, pero sabes... he cambiado el rango para la celdas, hasta "a150" por lo que mi programa ha quedado así:

    Sub abrir_calendario()
    With UserForm1
    .Left = ActiveCell.Left + ActiveCell.Width + 25
    .Top = ActiveCell.Top - 175
    .Show
    End With

    End Sub

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim rngFechas As Range
    Set rngFechas = Range("a2:a150")
    If Union(Target, rngFechas).Address = rngFechas.Address Then _
    Call abrir_calendario

    End Sub
    Private Sub Class_Initialize()

    End Sub

    EL PROBLEMA que surge es que cuando llego a un numero de celda superior al 20, más o menos, el calendario va apareciendo cada vez más abajo de la celda activa, así que cuando llego por la "a40" el calendario ha desaparecido, es decir esta por debajo de la barra de tareas y entonces ya ni puedo capturar la fecha, porque no veo el calendario, y no puedo cerrar el programa, así que tengo que recurrir al administrador de tareas para cerrar excel, podrías checar a que se debe el problema?
    Te lo agradecezco de antemano.

    ResponderBorrar
  4. Después de estudiar un poco el problema te sugiero usar este código

    Sub abrir_calendario()
    With UserForm1
    .Left = ActiveCell.Left + ActiveCell.Width + 25
    .Top = ActiveCell.Row + 150
    .Show
    End With

    End Sub

    La única diferencia está en la definición de la propiedad Top

    ResponderBorrar
  5. Ya segui tus instrucciones pero igual no logro que el calendario aparezca a la para de todas de las celdas, mas de las que estan proximas a la parte superior.

    ResponderBorrar
  6. Yo tengo el rango de celda hasta el A40, al selecionarla el calendario no se visualiza, pero si se esta ejecutando.

    ResponderBorrar
  7. Para que aparezca a la para de la celda activa, no hay que definir la posición del calendario. De esa manera aparece siempre en el centro del área visible de la hoja.

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.