Insertar usuario de windows en celdas

Estoy haciendo una hoja de cálculo de libre office, que me registre la fecha y la hora en que voy modificando los datos de una columna.

Me encontré un ejemplo muy bueno que me registra la fecha y he tratado de modificar este ejemplo para que me registré el usuario de windows, pero no lo he logrado

El código lo tengo de la siguiente manera:

Sub InsertarUsuario()

Dim oSel As Object

Dim oDir As Object

Dim oHoja As Object

Dim lCol As Long

Dim uSuario As String

uSuario = Environ("USERNAME")

'msgbox uSuario

                'Cambiar por la columna a insertar

                ' A = 0, B = 1, etc

                lCol = 1

   oSel = ThisComponent.CurrentController.Selection

                oHoja = oSel.SpreadSheet

                oDir = oSel.CellAddress

                oHoja.getCellByPosition(lCol, oDir.Row).setValue(uSuario)

End Sub

1 Respuesta

Respuesta

El código lo tengo de la siguiente manera:

Sub InsertarUsuario()
    Dim oSel As Object
    Dim oDir As Object
    Dim oHoja As Object
    Dim lCol As Long
    Dim uSuario As String
    ' Obtener el nombre de usuario de Windows
    uSuario = Environ("USERNAME")
    ' Cambiar por la columna a insertar (A = 0, B = 1, etc.)
    lCol = 1
    oSel = ThisComponent.CurrentController.Selection
    oHoja = oSel.SpreadSheet
    oDir = oSel.CellAddress
    oHoja.getCellByPosition(lCol, oDir.Row).setValue(uSuario)
End Sub

Gracias por contestar!! no entendí tu respuesta, ese código es el mismo de la pregunta que hice

Una disculpa, te proporcionaré un ejemplo de código que puedes utilizar en LibreOffice para registrar el usuario de Windows junto con la fecha y hora en que se modifican los datos de una columna:

Sub InsertarUsuario()
    Dim oSheet As Object
    Dim oCell As Object
    Dim lColumn As Long
    Dim sUsuario As String
    sUsuario = Environ("USERNAME")
    lColumn = 1 ' Cambia esto al número de la columna donde deseas registrar el usuario
    oSheet = ThisComponent.CurrentController.ActiveSheet
    oCell = oSheet.getCellByPosition(lColumn - 1, 0)
    If oCell.getString() = "" Then
        oCell.setString("Fecha")
        oCell = oSheet.getCellByPosition(lColumn, 0)
        oCell.setString("Hora")
        oCell = oSheet.getCellByPosition(lColumn + 1, 0)
        oCell.setString("Usuario")
    End If
    oCell = oSheet.getCellByPosition(lColumn - 1, oSheet.Rows.Count)
    oCell.setString(Date())
    oCell = oSheet.getCellByPosition(lColumn, oSheet.Rows.Count)
    oCell.setString(Time())
    oCell = oSheet.getCellByPosition(lColumn + 1, oSheet.Rows.Count)
    oCell.setString(sUsuario)
End Sub

Este código agregará una fila al final de la hoja de cálculo y registrará la fecha, la hora y el usuario de Windows en las columnas especificadas.

Muchas gracias por el código!! 

Al momento de intentar agregar algún vamos en las celdas de la columna A, me da el siguiente error :

El error "IndexOutOfBoundsException" indica que estás tratando de acceder a una celda que está fuera del rango válido en la hoja de cálculo. Corregido tu código

Sub InsertarUsuario()
    Dim oSheet As Object
    Dim oCell As Object
    Dim lColumn As Long
    Dim sUsuario As String
    Dim nLastRow As Long
    sUsuario = Environ("USERNAME")
    lColumn = 1 ' Cambia esto al número de la columna donde deseas registrar el usuario
    oSheet = ThisComponent.CurrentController.ActiveSheet
    oCell = oSheet.getCellByPosition(lColumn - 1, 0)
    If oCell.getString() = "" Then
        oCell.setString("Fecha")
        oCell = oSheet.getCellByPosition(lColumn, 0)
        oCell.setString("Hora")
        oCell = oSheet.getCellByPosition(lColumn + 1, 0)
        oCell.setString("Usuario")
    End If
    nLastRow = oSheet.getRows().getCount() - 1 ' Obtener la última fila con contenido
    oCell = oSheet.getCellByPosition(lColumn - 1, nLastRow)
    oCell.setString(Date())
    oCell = oSheet.getCellByPosition(lColumn, nLastRow)
    oCell.setString(Time())
    oCell = oSheet.getCellByPosition(lColumn + 1, nLastRow)
    oCell.setString(sUsuario)
End Sub

Esta casi perfecto, que pena, cómo hago para cambiar el nLastRow y me cargue la fecha, la hora y el usuario, pero a la par de cada celda de la columna "A" 

Lo que busco es registrar esos tres datos pero en cada fila

cada vez que agrego algo en la columna "A" quiero que a la par  de esa celda,se registre esos tres datos

Para modificar el código y registrar la fecha, la hora y el usuario en cada fila junto a la celda en la columna "A", puedes hacer lo siguiente:

Sub InsertarUsuario()
Dim oSheet As Object
Dim oCell As Object
Dim lColumn As Long
Dim sUsuario As String
Dim nLastRow As Long
sUsuario = Environ("USERNAME")
lColumn = 1 ' Cambia esto al número de la columna donde deseas registrar el usuario
oSheet = ThisComponent.CurrentController.ActiveSheet
oCell = oSheet.getCellByPosition(lColumn - 1, 0)
If oCell.getString() = "" Then
oCell.setString("Fecha")
oCell = oSheet.getCellByPosition(lColumn, 0)
oCell.setString("Hora")
oCell = oSheet.getCellByPosition(lColumn + 1, 0)
oCell.setString("Usuario")
End If
nLastRow = oSheet.getRows().getCount() - 1 ' Obtener la última fila con contenido
oCell = oSheet.getCellByPosition(lColumn - 1, 0)
If oCell.getString() = "" Then
oCell.setString("Fecha")
oCell = oSheet.getCellByPosition(lColumn, 0)
oCell.setString("Hora")
oCell = oSheet.getCellByPosition(lColumn + 1, 0)
oCell.setString("Usuario")
End If
nLastRow = oSheet.getRows().getCount() - 1 ' Obtener la última fila con contenido
oCell = oSheet.getCellByPosition(lColumn - 1, nLastRow)
oCell.setString(Date())
oCell = oSheet.getCellByPosition(lColumn, nLastRow)
oCell.setString(Time())
oCell = oSheet.getCellByPosition(lColumn + 1, nLastRow)
oCell.setString(sUsuario)
oCell = oSheet.getCellByPosition(lColumn - 1, nLastRow + 1) ' Agregar una fila más
End Sub

me vuelve a dar el error pero, en la última línea del código 

le documente la última línea y ya no muestra el error, pero en la primer fila coloca los encabezados y en la última fila registra la fecha, hora y usuario. 

Cada vez que se ejecuta la macro se actualizan los 3 datos siempre en la última fila  y no a la par de cada celda (en cada fila) 

Estás intentando acceder a una celda que está fuera del rango válido en la última línea de código comentada.

Sub InsertarUsuario()
    Dim oSheet As Object
    Dim oCell As Object
    Dim lColumn As Long
    Dim sUsuario As String
    Dim nLastRow As Long
    sUsuario = Environ("USERNAME")
    lColumn = 1 ' Cambia esto al número de la columna donde deseas registrar el usuario
    oSheet = ThisComponent.CurrentController.ActiveSheet
    oCell = oSheet.getCellByPosition(lColumn - 1, 0)
    If oCell.getString() = "" Then
        oCell.setString("Fecha")
        oCell = oSheet.getCellByPosition(lColumn, 0)
        oCell.setString("Hora")
        oCell = oSheet.getCellByPosition(lColumn + 1, 0)
        oCell.setString("Usuario")
    End If
    nLastRow = oSheet.getRows().getCount() - 1 ' Obtener la última fila con contenido
    oCell = oSheet.getCellByPosition(lColumn - 1, nLastRow)
    If oCell.getString() = "" Then
        oCell.setString("Fecha")
        oCell = oSheet.getCellByPosition(lColumn, nLastRow)
        oCell.setString("Hora")
        oCell = oSheet.getCellByPosition(lColumn + 1, nLastRow)
        oCell.setString("Usuario")
    End If
    nLastRow = oSheet.getRows().getCount() - 1 ' Obtener la última fila con contenido
    oCell = oSheet.getCellByPosition(lColumn - 1, nLastRow)
    oCell.setString(Date())
    oCell = oSheet.getCellByPosition(lColumn, nLastRow)
    oCell.setString(Time())
    oCell = oSheet.getCellByPosition(lColumn + 1, nLastRow)
    OCell. SetString(sUsuario)
    ' Insertar una nueva fila antes de la última fila con contenido
    OSheet. Rows.insertByIndex(nLastRow + 1, 1)
End Sub

Con esta corrección, se debería insertar una nueva fila antes de actualizar los valores en cada ejecución de la macro.

sigue el error 

Es que soy nuevo en libre office y no entiendo mucho. 

En excel si lo logré hacerlo, pero el código de excel no funciona  en libre office 

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 21 Then
   Cells(Target.Row, 22).Value = Now
   Cells(Target.Row, 23).Value = Environ("UserName")
    Exit Sub
End If

Ese es el que tengo en el excel 

El código corregido:

Sub InsertarUsuario()
    Dim oSheet As Object
    Dim oCell As Object
    Dim lColumn As Long
    Dim sUsuario As String
    Dim nLastRow As Long
    sUsuario = Environ("USERNAME")
    lColumn = 1 ' Cambia esto al número de la columna donde deseas registrar el usuario
    oSheet = ThisComponent.CurrentController.ActiveSheet
    oCell = oSheet.getCellByPosition(lColumn - 1, 0)
    If oCell.getString() = "" Then
        oCell.setString("Fecha")
        oCell = oSheet.getCellByPosition(lColumn, 0)
        oCell.setString("Hora")
        oCell = oSheet.getCellByPosition(lColumn + 1, 0)
        oCell.setString("Usuario")
    End If
    nLastRow = oSheet.getRows().getCount() - 1 ' Obtener la última fila con contenido
    oCell = oSheet.getCellByPosition(lColumn - 1, nLastRow)
    If oCell.getString() = "" Then
        oCell.setString("Fecha")
        oCell = oSheet.getCellByPosition(lColumn, nLastRow)
        oCell.setString("Hora")
        oCell = oSheet.getCellByPosition(lColumn + 1, nLastRow)
        oCell.setString("Usuario")
    End If
    nLastRow = oSheet.getRows().getCount() - 1 ' Obtener la última fila con contenido
    oCell = oSheet.getCellByPosition(lColumn - 1, nLastRow)
    oCell.setString(Date())
    oCell = oSheet.getCellByPosition(lColumn, nLastRow)
    oCell.setString(Time())
    oCell = oSheet.getCellByPosition(lColumn + 1, nLastRow)
    OCell. SetString(sUsuario)
    ' Insertar una nueva fila antes de la última fila con contenido
 oSheet. Rows.insertByIndex(nLastRow + 1, 1)
End Sub

Sigue el mismo error 

Y sigue cargando los datos en la. Último fila

Ya me. Da pena con usted, me. Has ayudado mucho y no sé si seré yo el. Que esta haciendo algo mal. 

Algo así es lo que debo hacer pero en libre office 

Te aparece el error

Si, el mismo error

mi correo es [email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas