Página 1 de 1

[RESUELTO] Insertar fecha automáticamente

NotaPublicado: Sab May 23, 2009 2:47 pm
por layug
Hola amigos, mi problema es el siguiente:
He intentado sin resultados positivos que mi hoja de cálculo ingrese automáticamente la fecha del sistema en una columna específica sin que actualice toda la colunma a dicha fecha,es decir,lo que pretendo es que de manera automática OpenOffice ingrese la fecha del sistema en la fila que introduzco datos en la columna a la que definí como fecha.

Re: Insertar fecha automáticamente

NotaPublicado: Dom May 24, 2009 2:16 am
por FJCC-ES
En el foro inglés, Villeroy publicó una macro http://user.services.openoffice.org/en/forum/viewtopic.php?f=21&t=12575 que inserta la fecha del sistema en columna A cuando se introducen datos en una fila. Es fácil cambiar la macro para insertar la fecha en otra columna.
Código: Seleccionar todo   Expandir vistaContraer vista
    REM  *****  BASIC  *****

    Sub test_splitStringAddress()
    Dim s$,sSh$,sRg$
       a=Array("'my sheet'.A1", _
       "$'my sheet'.A", _
       "'file:///doc.ods'#'my sheet'.A1", _
       "$'file:///doc.ods'#$'my sheet'.A")
       for i= 0 to uBound(a())
          s = a(i)
          splitStringAddress(s,sSh,sRg)
          print sSh,sRg
       next
    End Sub
    sub splitStringAddress(s$, sSheet$, sRange$)
    dim sURL$, linkPos%, sheetPos%
       ' remove leading $ in any case:
       if left(s, 1) = "$" then s = mid(s, 2)
       linkPos = instr(s, "'#")
       if linkPos > 0 then
          sheetPos = instr(linkPos, s, ".")
          sURL = left(s, linkPos +1)
          sSheet = mid(s, linkPos +2, sheetPos -linkPos -2)
          sRange = mid (s, sheetPos +1)
       else
          sheetPos = instr(s, ".")
          if sheetPos > 0 then
             sSheet = left(s, sheetPos -1)
             sRange = mid (s, sheetPos +1)
          else
          sRange = s
          endif
       endif
       if left(sSheet, 1) = "$" then sSheet = mid(sSheet, 2)
       if (left(sSheet, 1) = "'") and (right(sSheet, 1) = "'") then
          sSheet = mid(sSheet, 2, len(sSheet) -2)
       endif
       sSheet = sURL & sSheet
    end sub
    '-------usefull helper-function, returning focussed cell
    'by UROS > http://www.oooforum.org/forum/viewtopic.phtml?t=19348
    REM 2006-08-09: fixed error when row > 8191
    '       ;sh;                     ;lSheet +3
    '100/60/0;1;tw:309;2/2/0/0/0/0/2/0/0/0/0;253/8191/0/0/0/0/2/246/0/0/8158;0/0/0/0/0/0/2/0/0/0/0
    '100/60/0;1;tw:309;2/2/0/0/0/0/2/0/0/0/0;253+8192+0+0+0+0+2+246+0+0+8158;0/0/0/0/0/0/2/0/0/0/0
    Function getActiveCell(oView)
    Dim as1(), lSheet&,lCol&,lRow$, sDum as String,bErr as Boolean
       as1()  = Split(oView.ViewData, ";")
       lSheet = CLng(as1(1))
       sDum = as1(lSheet +3)
       as1() = Split(sDum, "/")
       on error goto errSlash
          lCol = CLng(as1(0))
          lRow = CLng(as1(1))
       on error goto 0
       getActiveCell = oView.Model.getSheets.getByIndex(lSheet).getcellByPosition(lCol,lRow)
    exit Function
    errSlash:
       if NOT(bErr) then
          bErr = True
          as1() = Split(sDum, "+")
          resume
       endif
    End Function
    Sub printStamp(oCell)
        '''Put the current time into the active cell.
        'No formatting intended. Apply any date/time formatting you like.'''
        oCell.setFormula("=NOW()")
        oCell.setValue(oCell.getValue())
    End Sub

    Sub _NowToColumnAByValidation(sAddr, bOverwrite)
    Dim s$,r$
        iCol = 0
        doc = thisComponent
        splitStringAddress(sAddr,s,r)
        sh = doc.Sheets.getByName(s)
        rg = sh.getCellRangeByName(r)
        iRow = rg.RangeAddress.StartRow
        c = sh.getCellByPosition(iCol, iRow)
        if bOverwrite or (len(c.getFormula())=0)then printStamp(c)
    End Sub

    Sub _NowToTimeStampCell(bOverwrite)
        oNames = thisComponent.NamedRanges
        oName = oNames.getByName("TimeStamp")
        oRg = oName.getReferredCells()
        c = oRg.getCellByPosition(0,0)
        if bOverwrite or (len(c.getFormula())=0)then printStamp(c)
    End Sub

    Sub NowToEmptyColumnAByValidation(sFormula, sAddr):
        '''Current time to empty column A, triggered by failing validation'''
        _NowToColumnAByValidation(sAddr, False)
    End Sub

    Sub NowToColumnAByValidation(sFormula, sAddr):
        '''Current time to column A, triggered by failing validation'''
        _NowToColumnAByValidation(sAddr, True)
    End Sub

    Sub NowToTimeStampCell():
        '''Put current time into a cell named "TimeStamp"'''
        _NowToTimeStampCell(True)
    End Sub

    Sub NowToEmptyTimeStampCell():
        '''Put current time into an empty cell named "TimeStamp"'''
        _NowToTimeStampCell(False)
    End Sub

    Sub NowToActiveCell():
        '''Put current time into the currently active input cell'''
        oDoc = thisComponent
        oView = oDoc.getCurrentController()
        oCell = getActiveCell(oView)
        printStamp(oCell)
    End Sub

1.Copiar el código al archivo: Seleccione el código y elija Editar → Copiar.
Elija Herramientas → Macros → Organizar Macros → OpenOffice Basic. Escoja el archivo y su biblioteca Standard y haga clic en el botón “Nuevo”. Acepte el nombre Module1 y pegue (Editar → Pegar) el código debajo del texto “End Sub”

2.Cambiar el código: Busque esta sección del código
Código: Seleccionar todo   Expandir vistaContraer vista
    Sub _NowToColumnAByValidation(sAddr, bOverwrite)
    Dim s$,r$
        iCol = 0  'Cambie la columna aqui. Columna A=0, B=1, C=2, etc.
        doc = thisComponent
        splitStringAddress(sAddr,s,r)
        sh = doc.Sheets.getByName(s)
        rg = sh.getCellRangeByName(r)
        iRow = rg.RangeAddress.StartRow
        c = sh.getCellByPosition(iCol, iRow)
        if bOverwrite or (len(c.getFormula())=0)then printStamp(c)
    End Sub

y cambie iCol = 0. El cero significa columna A. Uno significaría Columna B, 2 significaría Columna C, etc.

3.Definir validez del contenido de celdas: Seleccione las celdas que contendrán datos. Elija Datos → Validez. En la pestaña Criterios escoja Permitir=Longitud de texto, Datos=igual, Valor = 0. En la pestaña Mensaje de Error escoja Acción = Macro. Haga clic en el botón “Examinar”. Escoja el archivo, su biblioteca Standard, y Module1. En la lista Nombre de la Macro, escoja “NowToColumnAByValidation”.

Ahora cuando introduzca datos en las celdas que seleccionó en la sección 3, la fecha del sistema aparecerá en la columna que eligió en la sección 2.

Re: Insertar fecha automáticamente

NotaPublicado: Dom May 24, 2009 9:43 pm
por layug
Gracias amigo, es justo lo que buscaba y todo funciona correctamente.
Muchas gracias por tu ayuda.

Re: [Resuelto]Insertar fecha automáticamente

NotaPublicado: Jue Sep 20, 2012 5:08 am
por Gustavo Mattoni
¿no hay una forma de hacerlo sin usar macros? o sea con simples fórmulas tipo..=ahora() y que ésta no cambie automáticamente?

Re: [RESUELTO] Insertar fecha automáticamente

NotaPublicado: Jue Sep 20, 2012 6:13 pm
por SLV-es
No es posible hacerlo sin macros, pues =Ahora() se actualiza cada vez que se recalcula la hoja, o se imprime, o se guarda.

Saludos

Re: [RESUELTO] Insertar fecha automáticamente

NotaPublicado: Jue Sep 20, 2012 7:04 pm
por mauricio
En el ejemplo anexo, en cuanto agregan una clave o el nombre del empleado, inserta la fecha en la columna respectiva...

Saludos

Re: [RESUELTO] Insertar fecha automáticamente

NotaPublicado: Vie Sep 21, 2012 1:18 am
por SLV-es
Ummmm, muy original.

+1

Saludos

Re: [RESUELTO] Insertar fecha automáticamente

NotaPublicado: Vie Sep 21, 2012 12:07 pm
por xiseme
Original y simple (como es preferible) :mrgreen:

Ahora bien, ¿como ha hecho Mauricio para que la macro sólo se ejecute al modificar las celdas A2-A20 y C2-C20 y sólo con esas?

Re: [RESUELTO] Insertar fecha automáticamente

NotaPublicado: Vie Sep 21, 2012 4:55 pm
por mauricio
xiseme escribió:Ahora bien, ¿como ha hecho Mauricio para que la macro sólo se ejecute al modificar las celdas A2-A20 y C2-C20 y sólo con esas?

Selecciona cualquier celda de estos rangos y ve a Datos... Validez... ahí esta el secreto... claro, mi amigo FJCC-ES nos lo enseño...

Saludos

Re: [RESUELTO] Insertar fecha automáticamente

NotaPublicado: Vie Sep 21, 2012 6:39 pm
por xiseme
Me estaba volviendo loco, buscando por eventos, formatos ... Cuando lo veas, dale las gracias a FJCC-ES en mi nombre. :D
A ver si no me olvido de este truco, es como un evento de celda «al cambiar valor».
Gracias también a ti.

Re: [RESUELTO] Insertar fecha automáticamente

NotaPublicado: Vie Sep 21, 2012 7:35 pm
por SLV-es
Y con la ventaja que lo puedes extender, simplemente, con la herramienta brocha para copiar estilos !!!!!

Saludos

Re: [RESUELTO] Insertar fecha automáticamente

NotaPublicado: Mar Ene 19, 2016 3:21 am
por olavarria_l
Holaa te hago una consulta yo tengo en una lista desplegable 3 valores pendiente pasado y terminado, los uso para determinar el estado de las tareas y me gustaria ver como se puede cambiar el macro para que aparesca la fecha cuando en la lista lo pongo como Terminado.

Re: [RESUELTO] Insertar fecha automáticamente

NotaPublicado: Mar Ene 19, 2016 5:15 am
por mauricio
Por favor, no hagas consultas a alguien en particular dado que cualquier te puede responder...

Tu pregunta es diferente del tema tratado y resuelto en este tema, por favor, abre un nuevo tema, de preferencia con un ejemplo lo más explicativo posible, obtendrás mejores respuestas...

Saludos

Re: [RESUELTO] Insertar fecha automáticamente

NotaPublicado: Jue Jun 15, 2017 12:58 am
por deniscapo
Hola mira tiene que ver quiero hacer lo mismo pero con la fecha y la hora en la celda intente hacer lo de arriba pero no me sale me da un error de sintaxsis seguro meti la pata podrias referirme o decirme como desde ya gracias y un abrazo desde Uruguay

Re: [RESUELTO] Insertar fecha automáticamente

NotaPublicado: Jue Jun 15, 2017 3:25 am
por mauricio
Por favor, es importante hacer una búsqueda primero, tu pregunta ya se ha respondido, por acá:
https://forum.openoffice.org/es/forum/v ... fecha+hora

Saludos

Re: [RESUELTO] Insertar fecha automáticamente

NotaPublicado: Jue Ago 10, 2017 10:55 pm
por guillepr
hola, ya sé que está resuelto, pero buscando entre las opciones y enlaces a otros foros que pusisteis, encontré una solución muy sencilla.
Hay que activar la iteración en HERRAMIENTAS-OPCIONES-LIBREOFFICE CALC-CALCULAR, y con esta fórmula:

=IF(B1="";"";IF(A1="";NOW();A1))

Al menos es la que he usado yo y me sirve para que cuando en la celda B1 introduzco algún dato, en la A1 pone automáticamente fecha y hora.

Espero no molestar y que os sirva.