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