Environ username vba excel

Выборочное отображение листов пользователям

Довольно часто при совместной работе возникает ситуация, когда неплохо бы знать имя пользователя, который работает сейчас с файлом. Это позволит, например, поприветствовать человека по имени в диалоговом окне или, наоборот, ограничить его доступ к данным, если его имя не входит в разрешенный список и т.д.

Классический способ определения имени заключается в использовании очевидного свойства UserName объекта Application:

	Sub Hello_1() MsgBox "Привет, " & Application.UserName End Sub

Выполнение такого макроса приведет к появлению простого окна сообщения с приветствием:

username1.png

Неплохо, несложно, но есть одно «но». В качестве UserName макрос берет имя пользователя, которое введено в поле Пользователь в параметрах Excel Файл — Параметры — Пользователь (File — Options — User):

username2.png

Засада в том, что это имя любой пользователь у себя на компьютере может в любой момент свободно поменять на любое другое. А у корпоративных пользователей там, зачастую, при установке Office автоматически прописывается какой-нибудь безличный «user».

Чуть более сложным, но гораздо более надежным способом, будет брать не имя пользователя из параметров Excel, а логин входа в Windows. Его поменять уже не так легко и, для большинства пользователей, он уникален в пределах локальной сети компании.

Чтобы считать его нам потребуется использовать малоизвестную функцию VBA Environ, которая выдает информацию о различных параметрах операционной системы и Office на текущем компьютере. Аргумент USERNAME заставит эту функцию считать логин пользователя в Windows, под котороым сейчас произведен вход в компьютер:

	Sub Hello_1() MsgBox "Привет, " & Environ("USERNAME") End Sub

Таким образом, несложно организовать с помощью простого макроса, своего рода защиту при открытии файла — если книгу открывает не тот человек, то ему не показываются определенные листы с приватной информацией или промежуточными вычислениями. Если открыть редактор Visual Basic (Alt+F11) и затем двойным щелчком открыть в левом верхнем углу модуль ЭтаКнига (ThisWorkbook), то туда можно вставить макрос обработки события открытия книги, который и будет выполнять эту функцию защиты:

	 
Private Sub Workbook_Open() 
  If Environ("USERNAME") <> "Nikolay" Then 'если логин пользователя не Nikolay  
     Worksheets("Лист1").Visible = False 'скрываем Лист1 
     Worksheets(3).Visible = xlVeryHidden 'делаем 3-й лист суперскрытым 
  Else 
      For i = 1 To Worksheets.Count 'в противном случае 
        Worksheets(i).Visible = True 'проходим в цикле по всем листам 
      Next i 'и делаем их видимыми 
  End If 
End Sub

Теперь все листы будут видны только пользователю с именем (логином) Nikolay, а для всех остальных из трех листов книги будет виден только второй. Простор для применения этой функции широкий — пользуйтесь ;)

Ссылки по теме

  • Как сделать лист в книге Excel суперскрытым
  • Что такое макросы, куда и как вставлять код макросов на VBA

При помощи функции Environ() можно получить значение переменной окружения Windows

Этот макрос создаст новую книгу, и выведет в неё список из 31 переменной,
с примерами вызова функции для получения каждого из параметров:

Sub ВывестиПеременныеОкружения()
    On Error Resume Next
    Dim sh As Worksheet, param$
    Application.ScreenUpdating = False: Set sh = Workbooks.Add.Worksheets(1)
    With sh.Range("a1:d1")
        .Value = Array("Номер параметра", "Параметр", "Пример вызова", "Результат (на моём компьютере)")
        For i = 1 To 31
            param$ = Split(Environ(i), "=")(0)
            .Offset(i).Value = Array(i, param$, "env$ = Environ(""" & param$ & """)", Environ(param$))
        Next
    End With
End Sub

В результате работы макроса, получается следующая таблица:

Номер параметра Параметр Пример вызова Результат (на моём компьютере)
1 ALLUSERSPROFILE env$ = Environ(«ALLUSERSPROFILE») C:Documents and SettingsAll Users
2 APPDATA env$ = Environ(«APPDATA») C:Documents and SettingsAdminApplication Data
3 CLIENTNAME env$ = Environ(«CLIENTNAME») Console
4 CommonProgramFiles env$ = Environ(«CommonProgramFiles») C:Program FilesCommon Files
5 COMPUTERNAME env$ = Environ(«COMPUTERNAME») MYCOMPUTERNAME
6 ComSpec env$ = Environ(«ComSpec») C:WINDOWSsystem32cmd.exe
7 EMAIL env$ = Environ(«EMAIL») C:Documents and SettingsAdminApplication DataThe Bat!
8 FP_NO_HOST_CHECK env$ = Environ(«FP_NO_HOST_CHECK») NO
9 HOMEDRIVE env$ = Environ(«HOMEDRIVE») C:
10 HOMEPATH env$ = Environ(«HOMEPATH») Documents and SettingsAdmin
11 LOGONSERVER env$ = Environ(«LOGONSERVER») \MYCOMPUTERNAME
12 NUMBER_OF_PROCESSORS env$ = Environ(«NUMBER_OF_PROCESSORS») 2
13 OS env$ = Environ(«OS») Windows_NT
14 Path env$ = Environ(«Path») C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem
15 PATHEXT env$ = Environ(«PATHEXT») .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
16 PROCESSOR_ARCHITECTURE env$ = Environ(«PROCESSOR_ARCHITECTURE») x86
17 PROCESSOR_IDENTIFIER env$ = Environ(«PROCESSOR_IDENTIFIER») x86 Family 15 Model 107 Stepping 2, AuthenticAMD
18 PROCESSOR_LEVEL env$ = Environ(«PROCESSOR_LEVEL») 15
19 PROCESSOR_REVISION env$ = Environ(«PROCESSOR_REVISION») 6b02
20 ProgramFiles env$ = Environ(«ProgramFiles») C:Program Files
21 RML env$ = Environ(«RML») C:/Rml
22 SESSIONNAME env$ = Environ(«SESSIONNAME») Console
23 SystemDrive env$ = Environ(«SystemDrive») C:
24 SystemRoot env$ = Environ(«SystemRoot») C:WINDOWS
25 TEMP env$ = Environ(«TEMP») C:DOCUME~1AdminLOCALS~1Temp
26 TMP env$ = Environ(«TMP») C:DOCUME~1AdminLOCALS~1Temp
27 USERDOMAIN env$ = Environ(«USERDOMAIN») MYCOMPUTERNAME
28 USERNAME env$ = Environ(«USERNAME») Игорь
29 USERPROFILE env$ = Environ(«USERPROFILE») C:Documents and SettingsAdmin
30 WecVersionForRosebud.1294 env$ = Environ(«WecVersionForRosebud.1294») 4
31 windir env$ = Environ(«windir») C:WINDOWS
  • 23993 просмотра

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.

I just need to get the name of the current user so I can access the app data folder within their folders….
I have to do this in VBA so yeah…help please.

Lance Roberts's user avatar

Lance Roberts

22.2k32 gold badges112 silver badges129 bronze badges

asked Jun 6, 2011 at 17:07

if_zero_equals_one's user avatar

0

I believe it’s something like

Environ("Username")

answered Jun 6, 2011 at 17:12

lucks's user avatar

1

You do not need user name to know which folder is app data folder.

You need to use the SHGetFolderPath function with the CSIDL_APPDATA value.

Private Declare Function SHGetFolderPath Lib "shell32.dll" Alias "SHGetFolderPathA" (ByVal hwnd As Long, ByVal csidl As Long, ByVal hToken As Long, ByVal dwFlags As Long, ByVal pszPath As String) As Long
Private Const CSIDL_APPDATA As Long = &H1A
Private Const MAX_PATH As Long = 260

Dim s As String
s = String$(MAX_PATH, 0)

SHGetFolderPath 0, CSIDL_APPDATA, 0, 0, s

MsgBox Left$(s, InStr(1, s, vbNullChar))

answered Jun 6, 2011 at 17:15

GSerg's user avatar

GSergGSerg

75.3k17 gold badges160 silver badges340 bronze badges

1

Similar to accepted answer (Environ(«username»), there is an environment variable available for the App Data folder, so you can get it using:

Environ("APPDATA")

FYI, here is a good link for showing the full list of Environ Variables. There are a few that are windows universal, and some that can be registered as being application specific.

answered Jul 21, 2020 at 0:07

ainwood's user avatar

ainwoodainwood

9927 silver badges17 bronze badges

0

Excel VBA Macro to Get Username

Using Excel VBA, get username who is currently logged in & active, get author name who edited the Excel workbook, Ms Office Username, Network userid etc.,

Here are different kind of Username properties & corresponding command.

Before using them, read further in detail.

Purpose VBA Command
1. MsOffice/Excel username Application.username
2. Windows Active Logged in Username Environ(“Username”)
3. Windows API apiGetUserName
4. Network Username WScript.Network
5. VBA Username from Windows Registry CreateObject(“wscript.shell”).
RegRead(“HKEY_CURRENT_USERSoftwareMicrosoft
OfficeCommonUserInfoUserName”)
6. Get the Author name or
Username who edited an Excel workbook
ThisWorkbook.BuiltinDocumentProperties(“Author”)

Well that’s piece of cake if you know bit of VBA already. But, What if I say there are more ways!!!

Would You be interested in knowing them as well?

Lets find out.

Different Method to Find Windows UserName

Let’s see the easiest & most used one first.

  1. System Environment Variables – Windows login user
  2. Application.username – MS Office user name
  3. Windows API ‘apiGetUserName’ Function
  4. Network UserName
  5. Username from Windows Registry key

In some cases, if the easiest one did not work out, follow the next possible method.

1. Insert Windows Username in Excel Cell

There is no built in function to get username to a worksheet cell. This has to be done by defining a user defined function.

To do this, press Alt+ F11, go to VB editor, insert a new module & enter this code.

Function GetUserName() As String
    GetUserName = Environ$("username") 
    'or
    'GetUserName = Application.UserName
End Function

Then open the worksheet, then insert this formula “=GetUserName()” and press “Enter” key.

Now, the cell will execute the function and display the Windows logged in username in the cell.

2. VBA Application.Username – Excel User

Excel VBA Get Username Settings in Menu

Excel VBA Get Username Settings in Menu

Well this is the easiest of all the method and does not require any references to be added to any library or DLL.

You can manually change this user name from this menu option: File – Options – General as in this image.

Just copy-paste this code to Excel or Word VB Editor and run it.

Sub GetUserName_AppUser()
    Dim strUserName As String
    
    'Use the Application Object to get the Username
    strUserName = Application.UserName
    MsgBox "Current Logged In UserName is:" & strUserName
End Sub

This Excel macro code will display the current Windows username, who is also executing this Excel or Word App.

3. Excel VBA Get Username from System Environment Variables

Open Command prompt and type ‘Set’ and press Enter. This command will display list of all the Environment variables and values stored in it. In this list, we have an Environment variable “USERNAME” and it will have the active logged in username for that session.

We can write macro to read this Environment Variable and get the user id.

Sub GetUserName_Environ()
    Dim idx As Integer
    'To Directly the value of a Environment Variable with its Name
    MsgBox VBA.Interaction.Environ$("UserName")
    
    'To get all the List of Environment Variables
    For idx = 1 To 255
        strEnvironVal = VBA.Interaction.Environ$(idx)
        ThisWorkbook.Sheets(1).Cells(idx, 1) = strEnvironVal
    Next idx
    
End Sub

Note: This VBA macro can also be used to read all the Environment variables from system for that login session.

4. Using Windows API ‘apiGetUserName’ Function

Microsoft provides many other variants of this function. So, you can choose to use this function or any other available

APIs based on your need. To use this API, declare the function before calling the function.

'For 32-bit office installation
'Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
'    "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

'For 64-bit office installation
Private Declare PtrSafe Function apiGetUserName Lib "advapi32.dll" _
    Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As LongPtr) As Long

Sub Get_UserName_WINAPI()
    'Declare Variables
    Dim Returned_Val_Length As Variant
    Dim API_Return_Status As Variant
    Dim Returned_UserName As String
    
    'Define Space for Variables
    Returned_UserName = String$(254, 0)
    Returned_Val_Length = 255
    
    'Call the API and get the User Details
    API_Return_Status = apiGetUserName(Returned_UserName, Returned_Val_Length)
    
    'Remove unwanted details from Return value and get only Username
    Returned_UserName = Mid(Trim(Returned_UserName), 1, Returned_Val_Length - 1)
End Sub

5. Network UserName in Excel VBA

The WScript Object is used here to get the Network Username for the current logged in user.

Create an instance for the object Wscript.Network and use it to fetch the User and Computer Details as explained below.

Sub GetUserName_Environ()
    Dim ObjWshNw As Object
    Set ObjWshNw = CreateObject("WScript.Network")
    
    MsgBox ObjWshNw.UserName
    MsgBox ObjWshNw.ComputerName
    MsgBox ObjWshNw.UserDomain
End Sub

All these combination of codes, fetch current Windows user name details to Excel.

Also Read: How to Password Protect Office Excel, PPT and Word Document?

5.1. From Windows Registry

Windows system stores numerous detail in its registry. Details like Operating system features, parameters, installed software, users, etc.,

This code fetches the user info from registry within Excel.

Function getUsernameWindows() As String
    getUsernameWindows = CreateObject("wscript.shell").RegRead("HKEY_CURRENT_USERSoftwareMicrosoftOfficeCommonUserInfoUserName")
End Function

We will be in need of these code tricks when, We share any Office document with other users and we need to collect the user details whoever is accessing it or restrict users from using this document based on their login id.

Read Also:

  • Get list of Tasks running in System from Task Manager.

External References

  • Windows API detail from Microsoft Support Website.
  • Fetching detail from Environment Variable.
  • Network User details from WScript.Network.

Return to VBA Code Examples

Environ Description

Returns the value of an operating system environment variable.

Simple Environ Examples

Sub Environ_Example()
    MsgBox Environ("UserName")
End Sub

This will returns the current user name logged in.

Sub Environ_Example()
    MsgBox Environ("ComputerName")
End Sub

This will returns the computer name.

Environ Syntax

In the VBA Editor, you can type  “Environ(” to see the syntax for the Environ Function:

The Environ function contains an argument:

Expression:  Name of an environment variable (string) or Numeric expression(1 to 255) corresponding to the numeric order of the environment string in the environment-string table.

Examples of Excel VBA Environ Function

MsgBox Environ(1)

Result: “ALLUSERSPROFILE=C:ProgramData”

MsgBox Environ(0)

Result: Run-time Error ‘5’

MsgBox Environ(256)

Result: Run-time Error ‘5’

MsgBox Environ("AllUsersProfile")

Result: “C:ProgramData”

To see all environment variables that is defined on your computer, you can use the following code.

Sub ListAllEnvironVariables()
    Dim strEnviron As String
    Dim VarSplit As Variant
    Dim i As Integer, nRow As Integer
    
    nRow = 1
    Range("A1").Value = "Index"
    Range("B1").Value = "Environment Variable Name"
    Range("C1").Value = "Environment Variable Value"
    Range("A:C").Columns.AutoFit
    Range("A1:C1").Font.Bold = True
    nRow = 2
    
    For i = 1 To 255
        strEnviron = Environ(i)
        If strEnviron <> "" Then
            VarSplit = Split(strEnviron, "=")
            Range("A" & nRow).Value = i
            Range("B" & nRow).Value = VarSplit(0)
            Range("C" & nRow).Value = VarSplit(1)
            nRow = nRow + 1
        End If
    Next
End Sub

Then, you can see all environment variables as following.

The result may vary by system. Because there are some custom environment variables besides the default environment variables.

For any string that doesn’t exist on the list of environment variables, it will return empty string(“”).

MsgBox Environ("MyEnviron")

Result: “”

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
vba save as

Learn More!

Понравилась статья? Поделить с друзьями:
  • Entering data into excel
  • Enums in excel vba
  • Entry word part of speech
  • Entering data in excel worksheet
  • Entry word in the dictionary example