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
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
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 SubEste 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

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 SubCon 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 IfEse 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
mi correo es [email protected]
- Compartir respuesta


