- 20 Mar 2024 às 07:59
#74231
Bom Dia Senhores.
Tenho uma macro que preciso deixa-la privada e ela precisa ser executada assim que a pasta de trabalho é aberta, logo não teria como inseri-la em um módulo, por isso a inserido no evento workbook open.
Uma das ações da macro é solicitar o nome do usuário por meio de um inputbox, mas esse inputbox deve aparecer pelo menos 1 segundo após a pasta de trabalho ser aberta, senão o registro não acontece pelos testes que fiz, pois a planilha que registra o nome está oculta “very hyden”, então quando a pasta de trabalho abre a planilha também é exibida e em seguida fica oculta novamente.
A pergunta é como fazer essa macro ser executada 1 segundo após a abertura da pasta de trabalho considerando que ela deve ser privada para que ela não seja exibida ao usuário?
Eu tentei a abordagem abaixo, mas não vai funcionar, pois em workbookopen não se coloca o nome da rotina. Observe que deixei em aspa simples.
Application.OnTime Now + TimeValue("00:00:01"), "RegistraDataHoraInicial"
'Private Sub RegistraDataHoraInicial()
On Error Resume Next
Dim lastRow As Long
Dim dataAtual As Date
' Inicializar a variável dataAtual com a data atual
dataAtual = Date
' Verificar se o nome do usuário já foi definido
If Not userDefined Then
Dim userName As String
' Se o nome do usuário não estiver definido, solicitar ao usuário que insira seu nome
userName = InputBox("Por favor, insira seu nome:", "Registro de Usuário")
' Armazenar o nome do usuário na pasta de trabalho
ThisWorkbook.Names.Add Name:="UserName", RefersTo:=userName
userDefined = True ' Marcar que o nome do usuário foi definido
End If
' Tornar a planilha "Login" visível
Sheets("Login").Visible = True
' Registrar entrada do usuário
With Sheets("Login")
If Err.Number <> 0 Then
MsgBox "Erro ao acessar a planilha ""Login"".", vbExclamation
Exit Sub
End If
' Encontrar a última linha preenchida na coluna B a partir da linha 2
lastRow = .Cells(.Rows.count, "B").End(xlUp).Row + 1
If lastRow < 2 Then lastRow = 2 ' Se a última linha for menor que 2, ajustar para 2
' Registrar o usuário na coluna A com o nome inserido pelo usuário
On Error Resume Next ' Ignorar erros caso o nome do usuário não exista
.Cells(lastRow, "A").Value = ThisWorkbook.Names("UserName").RefersToRange.Value
On Error GoTo 0 ' Retornar ao tratamento normal de erros
' Registra a data de entrada na coluna B
.Cells(lastRow, "B").Value = dataAtual
' Registrar a hora de entrada na coluna C
.Cells(lastRow, "C").Value = Format(Now, "hh:mm:ss")
End With
' Ocultar novamente a planilha "Login"
Sheets("Login").Visible = xlSheetVeryHidden
On Error GoTo 0
End sub
Tenho uma macro que preciso deixa-la privada e ela precisa ser executada assim que a pasta de trabalho é aberta, logo não teria como inseri-la em um módulo, por isso a inserido no evento workbook open.
Uma das ações da macro é solicitar o nome do usuário por meio de um inputbox, mas esse inputbox deve aparecer pelo menos 1 segundo após a pasta de trabalho ser aberta, senão o registro não acontece pelos testes que fiz, pois a planilha que registra o nome está oculta “very hyden”, então quando a pasta de trabalho abre a planilha também é exibida e em seguida fica oculta novamente.
A pergunta é como fazer essa macro ser executada 1 segundo após a abertura da pasta de trabalho considerando que ela deve ser privada para que ela não seja exibida ao usuário?
Eu tentei a abordagem abaixo, mas não vai funcionar, pois em workbookopen não se coloca o nome da rotina. Observe que deixei em aspa simples.
Application.OnTime Now + TimeValue("00:00:01"), "RegistraDataHoraInicial"
'Private Sub RegistraDataHoraInicial()
On Error Resume Next
Dim lastRow As Long
Dim dataAtual As Date
' Inicializar a variável dataAtual com a data atual
dataAtual = Date
' Verificar se o nome do usuário já foi definido
If Not userDefined Then
Dim userName As String
' Se o nome do usuário não estiver definido, solicitar ao usuário que insira seu nome
userName = InputBox("Por favor, insira seu nome:", "Registro de Usuário")
' Armazenar o nome do usuário na pasta de trabalho
ThisWorkbook.Names.Add Name:="UserName", RefersTo:=userName
userDefined = True ' Marcar que o nome do usuário foi definido
End If
' Tornar a planilha "Login" visível
Sheets("Login").Visible = True
' Registrar entrada do usuário
With Sheets("Login")
If Err.Number <> 0 Then
MsgBox "Erro ao acessar a planilha ""Login"".", vbExclamation
Exit Sub
End If
' Encontrar a última linha preenchida na coluna B a partir da linha 2
lastRow = .Cells(.Rows.count, "B").End(xlUp).Row + 1
If lastRow < 2 Then lastRow = 2 ' Se a última linha for menor que 2, ajustar para 2
' Registrar o usuário na coluna A com o nome inserido pelo usuário
On Error Resume Next ' Ignorar erros caso o nome do usuário não exista
.Cells(lastRow, "A").Value = ThisWorkbook.Names("UserName").RefersToRange.Value
On Error GoTo 0 ' Retornar ao tratamento normal de erros
' Registra a data de entrada na coluna B
.Cells(lastRow, "B").Value = dataAtual
' Registrar a hora de entrada na coluna C
.Cells(lastRow, "C").Value = Format(Now, "hh:mm:ss")
End With
' Ocultar novamente a planilha "Login"
Sheets("Login").Visible = xlSheetVeryHidden
On Error GoTo 0
End sub