Notifications
Clear all

Erro de compilação

8 Posts
1 Usuários
0 Reactions
6,890 Visualizações
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

A atual Suite Office instalada pela TI aqui na empresa, é de 64 Bits.
e me disseram que é este o motivo do erro na planilha; erros de compilação.

"Erro de compilação em módulo oculto: GET COMPUTER NAME"
o código é esse ; como faço pra resolver?

Option Private Module

Option Explicit
Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, _
                                                nSize As Long) As Long
Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
                                                        (ByVal lpBuffer As String, _
                                                        nSize As Long) As Long
Sub Get_Computer_Name()
Dim linha As Long
Dim XCar1 As Byte
Dim XCar11 As Byte
Dim XCar2 As Byte
Dim XCar3 As Byte
Dim XDay As Long
Dim XWeekday As Long
Dim XSenha As Long
Dim XNum As Long
Dim XMaq As Long
Dim Usuario As String
Dim Maquina As String
Dim Comp_Name_B As String * 255
Dim Comp_Name As String
GetComputerName Comp_Name_B, Len(Comp_Name_B)
Comp_Name = Left(Comp_Name_B, InStr(Comp_Name_B, Chr(0)))
Dim lpBuff As String * 25
Dim ret As Long, UserName As String
ret = GetUserName(lpBuff, 25)
XDay = Day(Now)
XWeekday = Weekday(Now, vbSunday)
UserName = Left(lpBuff, InStr(lpBuff, Chr(0)) - 1)
Desprot2
Plan5.Visible = xlSheetVisible
Plan5.Select
Plan5.Range("A1").Select
Desprot
Plan5.Range("CA65000").End(xlUp).Offset(1, 0).Value = Int(Now)
Plan5.Range("CA65000").End(xlUp).Offset(0, 1).Value = UCase(UserName)
Plan5.Range("CA65000").End(xlUp).Offset(0, 2).Value = Comp_Name
' Acha a ultima linha vazia
linha = Plan5.Range("CD65000").End(xlUp).Row + 1
' Pega o Nome do Usuário na Coluna B+Linha
Usuario = UCase$(Range("CB" & linha)) 'Coluna onde entra o usuario
Maquina = UCase$(Range("CC" & linha)) 'Coluna onde entra a maquina
' Pega o terceiro caracter para ver se é um número
XCar1 = Asc(Mid$(Usuario, 3, 1))
' Pega o sexto caracter do nome da maquina  para ver se é um número
XCar11 = Asc(Mid$(Maquina, 10, 1))
' Compara se o Usuário começa com C ou E e se o 3º caracter é um número (se não for número, então é um Usuario normal)
If (Left$(Usuario, 1) = "C" And XCar1 < 65) Or (Left$(Usuario, 1) = "E" And XCar1 < 65) Then
XNum = Int(Val(Right$(Usuario, 5)) / 2)
XMaq = Int(Val(Right$(Maquina, 4)) / 35)
XSenha = XNum + Int(Now) + Int(XDay * XWeekday) + XMaq
GoTo NumSenha
End If
' Pega o valor ASC do primeiro caracter do Nome do Usuário
XCar1 = Asc(Left$((Usuario), 1))
' Pega o valor ASC do segundo caracter do Nome do Usuário
XCar2 = Asc(Mid$((Usuario), 2, 1))
' Pega o valor ASC do terceiro caracter do Nome do Usuário
XCar3 = Asc(Mid$((Usuario), 3, 1))
' Forma a "SENHA" pela soma dos códigos ASC do Nome do Usuário mais a data atual
XSenha = XCar1 + XCar2 + XCar3 + Int(Now) + Int(XDay * XWeekday) + XMaq
' Coloca a "SENHA" na célula CD+Linha
NumSenha:
Plan5.Range("CA65000").End(xlUp).Offset(0, 3) = XSenha

Plan1.Visible = xlSheetVisible
Plan1.Select
Desprot
Plan1.Range("B3").Value = XSenha + (XWeekday * 7000)
Prot
           'With Selection.Font
        '.Color = -16711681
       ' .TintAndShade = 0
   ' End With
Plan1.Visible = xlSheetVeryHidden
Prot2
End Sub
 
Postado : 26/04/2013 6:36 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

De uma olhada aqui: http://www.ambienteoffice.com.br/office ... pi_no_vba/
Pode ser que lhe ajude

 
Postado : 26/04/2013 7:35 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

ok Reinaldo , o meu problema é que não entendo muito de VBA , o que faço é pegar códigos aqui e tentar adapta-los a necessidade , mas nem sempre sei o que determinada parte do codigo quer dizer. Vi sua postagem , mas não consegui identificar uma solução.

 
Postado : 26/04/2013 8:12 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Não tenho nem usei a vs 64 bits, então não posso contribuir muito; vamor esperar que alguem que utiliza possa ajuda-lo.
Porem tenho visto que, na maioria dos casos, a declaração funções API é que geram conflito.
Conforme o BenzaDeus diz no tópico:
"Nesse exemplo, estamos usando as APIs GetActiveWindow e GetTickCount. Da forma como estão declaradas acima, são executadas em qualquer versão do Microsoft Office. Observe que se a versão do VBA for 7.0, deve-se:
-Adicionar o parâmetro PtrSafe entre Declare e Function (ou Sub);
-Substituir Long por LongPtr"
Talvez assim resolva:

    Option Private Module

    Option Explicit
    Private Declare PtrSafe Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, _
                                                    nSize As Long) As Longptr
    Private Declare PtrSafe Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
                                                            (ByVal lpBuffer As String, _
                                                            nSize As Long) As Longptr.....
 
Postado : 26/04/2013 9:25 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

não funcionou

 
Postado : 29/04/2013 4:39 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

ainda nao consegui, alguem com alguma idéia?

 
Postado : 29/04/2013 8:12 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

ainda nao consegui, alguem com alguma idéia?

Para o questionamento acima, a "Idéia" é : GOOGLE uma vez que está pelo jeito com urgencia em uma solução, e como a mesma pode demorar devido a estar utilizando uma Suite que ainda poucos utilizam, então só temos material referente as Declarações.

Estou na mesma situação do Reinaldo, não lidei com 64bits, nem em Suites do Office nem SO, aqui no serviço ainda é WinXP e office 2003.

Mas de qualquer forma de uma olhada no link abaixo com duvida parecida e parece que foi resolvida.
http://social.msdn.microsoft.com/Forums ... 147a3e0d6/

Outros artigos alem do que o Reinaldo passou seriam :
VBA 64 BITS (EXCEL 2010)
http://www.tudosobrexcel.com/vba/vba_32bits/

How to detect if the computer is x32 or x64?
http://stackoverflow.com/questions/6256 ... x32-or-x64

GetComputerNameA for Excel 2010 (64-bit)
http://www.experts-exchange.com/Softwar ... 17060.html

Aproveito para fazer um pedido, que se chegar a resolver esta questão disponibilize no Forum, ajudaria muito a todos os que estão com o mesmo problema.

[]s

 
Postado : 30/04/2013 5:56 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Esta foi a solução:

Option Private Module

Option Explicit
'Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, _
                                                nSize As Long) As Long
'Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
                                                        (ByVal lpBuffer As String, _
                                                        nSize As Long) As Long
#If VBA7 Then

Declare PtrSafe Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, _
                                                        nSize As Long) As Long
Private Declare PtrSafe Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, _
                                                        nSize As Long) As Long
                                                        
#Else

    Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" _
                                                        (ByVal lpBuffer As String, nSize As Long) As Long
    Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
                                                        (ByVal lpBuffer As String, _
                                                        nSize As Long) As Long
                                                        #End If

Muito obrigado a todos que colaboraram

 
Postado : 02/05/2013 6:52 pm