重新加载环境变量而不重新启动Excel?

时间:2019-01-14 22:51:41

标签: excel vba environment-variables

我使用函数Environ()从正在运行的Excel实例中获取环境变量。 在系统中定义新变量后,Excel直到重新启动它才知道它。

我的问题是:有什么方法可以获取环境变量的新值而无需重新启动Excel?

测试用例是:

  • Windows搜索/系统/高级系统设置/环境变量
  • 打开Microsoft Excel
  • 用值TESTING定义一个新的用户变量,例如Whatever

enter image description here

  • 运行以下宏:

    Sub test()
    
        MsgBox "TESTING:" & Environ("TESTING")
    
    End Sub
    

...变量为空:

enter image description here

  • 重新启动Microsoft Excel
  • 再次重新运行相同的宏:该变量现在已加载。

enter image description here

2 个答案:

答案 0 :(得分:4)

Sub Test()

    MsgBox CreateObject("WScript.Shell").Environment("system").Item("testing")

End Sub

答案 1 :(得分:2)

您需要继承excel窗口的子类,并拦截从控制面板环境事物和wm_settingchange发送的setx消息。

这是VB.Net-lparam包含一个指向Environment的字符串的指针。由您决定发生了什么变化。

Console.writeline(Marshal.PtrToStringUni(lparam))

返回VB6 / VBA

这里有一些钩子,钩子和winproc的代码。您可以从excel.application hWnd属性中获取Excel的hWnd。

Public Sub Hook()
   lpPrevWndProc = SetWindowLong(EditNote.gRtfHwnd, GWL_WNDPROC, _
   AddressOf gWindowProc)
End Sub

Public Sub Unhook()
   Dim temp As Long
   temp = SetWindowLong(EditNote.gRtfHwnd, GWL_WNDPROC, lpPrevWndProc)
End Sub

Public Function gWindowProc(ByVal hwnd As Long, ByVal Msg As Long, _
                 ByVal wParam As Long, ByVal lParam As Long) As Long
   If Msg = WM_CONTEXTMENU Then
        If EditNote.mnuViewEditContextMenu.Checked Then EditNote.PopupMenu EditNote.mnuEdit
'        gWindowProc = CallWindowProc(lpPrevWndProc, hWnd, Msg, wParam, _
         lParam)
   Else ' Send all other messages to the default message handler
      gWindowProc = CallWindowProc(lpPrevWndProc, hwnd, Msg, wParam, _
         lParam)
   End If
End Function

每个应用程序都会获取其父级环境内存块的副本。一个程序无法访问另一个程序的内存-这是一种方法。仅Windows资源管理器侦听此消息。因此,更新的变量仅在Windows资源管理器和资源管理器启动的任何新程序中可用。注意:CMD不会监听。