Is there a way to get the name of the computer in VBA?
            Asked
            
        
        
            Active
            
        
            Viewed 1.4e+01k times
        
    4 Answers
70
            Dim sHostName As String
' Get Host Name / Get Computer Name
sHostName = Environ$("computername")
 
    
    
        Tommy
        
- 39,592
- 10
- 90
- 121
- 
                    6Note that Environ variables must be handled with care because they are a security risk (http://stackoverflow.com/questions/3366192/using-nt-login-as-part-of-sql-query-run-via-vba-in-access-2007) – Fionnuala Aug 23 '10 at 21:19
- 
                    4@Fionnuala I disagree. That's not a security risk with the handling of environment variables, but rather code that is susceptible to SQL injection. – Josh Stodola Jan 27 '17 at 17:37
- 
                    3better (security, immutability) use the more robust **`CreateObject("WScript.Network").ComputerName`** from *Nigel Heffernan's* answer for this question: https://stackoverflow.com/a/10108951/1915920 – Andreas Covidiot Sep 10 '19 at 12:11
23
            
            
        You can do like this:
Sub Get_Environmental_Variable()
Dim sHostName As String
Dim sUserName As String
' Get Host Name / Get Computer Name    
sHostName = Environ$("computername")
' Get Current User Name    
sUserName = Environ$("username")
End Sub
 
    
    
        Sarfraz
        
- 377,238
- 77
- 533
- 578
17
            
            
        Looks like I'm late to the game, but this is a common question...
This is probably the code you want.
Please note that this code is in the public domain, from Usenet, MSDN, and the Excellerando blog.
Public Function ComputerName() As String
'' Returns the host name
'' Uses late-binding: bad for performance and stability, useful for 
'' code portability. The correct declaration is:
'   Dim objNetwork  As IWshRuntimeLibrary.WshNetwork
'   Set objNetwork = New IWshRuntimeLibrary.WshNetwork
    Dim objNetwork As Object
    Set objNetwork = CreateObject("WScript.Network")
    ComputerName = objNetwork.ComputerName
    
    Set objNetwork = Nothing
End Function
You'll probably need this, too:
Public Function UserName(Optional WithDomain As Boolean = False) As String
'' Returns the user's network name
'' Uses late-binding: bad for performance and stability, useful for
'' code portability. The correct declaration is:
'   Dim objNetwork  As IWshRuntimeLibrary.WshNetwork
'   Set objNetwork = New IWshRuntimeLibrary.WshNetwork
    Dim objNetwork As Object
    Set objNetwork = CreateObject("WScript.Network")
    If WithDomain Then
        UserName = objNetwork.UserDomain & "\" & objNetwork.UserName
    Else
        UserName = objNetwork.UserName
    End If
    
    Set objNetwork = Nothing
End Function
 
    
    
        Nigel Heffernan
        
- 4,636
- 37
- 41
- 
                    Question asked for the name of the computer, not the user (though that would be useful also). – Rob I Aug 12 '13 at 13:12
- 
                    4+1 for using `WScript.Network` instead of `Environ()`. Note: you can do it in one line with `ComputerName = CreateObject("WScript.Network").ComputerName` – Andre Mar 10 '17 at 11:43
- 
                    1Thanks [Andre](https://stackoverflow.com/users/3820271/andre) - I often use the one-line format, but StackOverflow is for explanation as well as copy-and-code samples, so I try to lay out an explanatory answer. The mutability of `Environ()` seems to be unknown to most beginner and intermediate-level developers, and this worries me: do you have a reference - a link to an authoritative explanation - I can add to my answer? – Nigel Heffernan Oct 19 '17 at 15:20
- 
                    3Always create and destroy objects properly. If you don't want to declare you an use `With CreateObject("WScript.Network")` then the object will be garbage collected properly after the `End With` – HackSlash Apr 01 '20 at 20:45
3
            
            
        A shell method to read the environmental variable for this courtesy of devhut
Debug.Print CreateObject("WScript.Shell").ExpandEnvironmentStrings("%COMPUTERNAME%")
Same source gives an API method:
Option Explicit
#If VBA7 And Win64 Then
    'x64 Declarations
    Declare PtrSafe Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
#Else
    'x32 Declaration
    Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
#End If
Public Sub test()
    Debug.Print ComputerName
    
End Sub
Public Function ComputerName() As String
    Dim sBuff                 As String * 255
    Dim lBuffLen              As Long
    Dim lResult               As Long
 
    lBuffLen = 255
    lResult = GetComputerName(sBuff, lBuffLen)
    If lBuffLen > 0 Then
        ComputerName = Left(sBuff, lBuffLen)
    End If
End Function
 
    
    
        QHarr
        
- 83,427
- 12
- 54
- 101
 
    