เคยต้องการรู้รายละเอียด CPU หรือหน่วยความจำของคอมพิวเตอร์ หมายเลขซีเรียลหรือรุ่น หรือเวอร์ชันซอฟต์แวร์ที่ติดตั้ง แต่ไม่แน่ใจว่าจะดูที่ไหน? ด้วยเพียงเล็กน้อยโค้ดง่ายๆ ใน Excel คุณสามารถดึงไลบรารีข้อมูล Windows PC ทั้งหมดของคุณได้
聽起來 好得 不可置信? 呵呵, 這 是 Windows, 如果 你 知道 如何 使用 它
你 可能 需要 把 手 弄髒 一點, 但 在 這 篇 文章 中 我們 將 提供 你 所有 需要 的 代碼, 和 如何 把 它 放 進 Excel 並 使 它 工作 一旦 你 完成, 你 將 有 一個 Excel 試算表, 每次 你 打開 它, 都 告訴 你 一切 你 曾經 想 知道 的 關於 你 的 電腦 系統
請注意 這 只 能 與 Excel 桌面版 一起 工作, 你 可以 通過 Office 免費 試用 獲得
WMI 的 魔力 (The Magic of WMI)
在 任何 運行 微軟 作業 系統 的 電腦 上, 你 都 有 存取 一組 強大 的 擴展 稱為 Windows Management Instrumentation (WMI), 它 提供 了 一個 非常 強大 和 廣泛 的 方法 來 存取 關於 你 的 電腦, 作業 系統, 和 已安裝 軟體 的 信息 和 規格
最重要的是, WMI 可以 從 像 VBA 這樣 的 編程 語言 存取, 可用 在 幾乎 所有 的 Microsoft Office 產品 中
設置 你的 自動化 試算表
首先, 創建 你 的 新 Excel 活頁簿 並 命名 為類似 MyComputerInfo.xlsm (啟用巨集) 打開 它, 跳過 Sheet1, 並 重新命名 接下來 的 11 個 工作表 如下:
- Network (網路)
- LogicalDisk (邏輯磁碟)
- Processor (處理器)
- Physical Memory (實體記憶體)
- Video Controller (視訊控制器)
- OnBoardDevices (板載裝置)
- Operating System (作業系統)
- Printer (印表機)
- Software (軟體)
- Accounts (帳戶)
- Services (服務)
這些 將 容納 你 所有 的 電腦 詳細資訊, 並 將 在 每次 你 打開 這個 Excel 試算表 時 更新
接下來, 去 Developer 選單項目 和 在 Controls 部分 點擊 View Code
如果 你 不 看到 Developer 選單項目, 點擊 File > Options > Customize Ribbon, 更改 Choose commands from 下拉選單 到 All Tabs, 選擇 Developer 並 按 Add>> 按鈕 將 它 添加 到 Customized Ribbon 那邊 確保 那邊 的 Developer 核取方塊 被 選中 一旦 你 添加 它
一旦 你 在 VBA 代碼 編輯器 內部, 你 所要 做 的 就是 將 下面 的 腳本 添加 到 一個 模組 這些 腳本 將 做 所有 的 重活 你 不 需要 自己 寫 這 代碼, 只需 複製 和 貼上 它們 如 下面 所示
一旦 你 完成 複製 和 貼上 使用 下一 部分 的 代碼, 你 所要 做 的 就是 添加 一點 更多 代碼 來 載入 你 的 工作表, 你 就 完成 了
好, 準備好 複製 和 貼上 了嗎? 讓 我們 開始
建構 你的 WMI 模組
這 代碼 的 靈感 來自 一個 很棒 的 Google Sites 資源 稱為 Beyond Excel 所示 範例 是 一個 名為 WMI() 的 子程序, 它 將 你 所有 的 電腦 網路 信息 傳遞 到 Excel 編程 環境 的 除錯 區域
當然, 那 對 我們 沒什麼 好處, 所以 我 修改 了 代碼 以 將 所有 細節 輸出 到 你 在 這 指南 第一 步 創建 的 工作表 之一
在 編碼 導航 區域, 你 也 將 看到 一個 稱為 Modules 的 部分 和 一個 名為 Module1 的 組件 在 它 底下 雙擊 這個 以 打開 它 如果 你 不 看到 Modules 資料夾, 展開 Insert 從 選單 並 選擇 Module
這 區域 是 所有 子程序 所在 的 地方, 它們 將 使用 WMI 提取 你 電腦 的 所有 重要 信息, 並 將 它 載入 你 創建 的 工作表
將 以下 行 放 在 代碼 視窗 的 最頂部 獨自 一行
Public oWMISrvEx As Object 'SWbemServicesEx
Public oWMIObjSet As Object 'SWbemServicesObjectSet
Public oWMIObjEx As Object 'SWbemObjectEx
Public oWMIProp As Object 'SWbemProperty
Public sWQL As String 'WQL Statement
Public n
它 應該 看起來 像 這樣 當 你 完成 時:
貼上 以下 代碼 到 Module1 在 你 剛 創建 的 行 之下:
Sub NetworkWMI()
sWQL = "Select * From Win32_NetworkAdapterConfiguration"
Set oWMISrvEx = GetObject("winmgmts:root/CIMV2")
Set oWMIObjSet = oWMISrvEx.ExecQuery(sWQL)
intRow = 2
strRow = Str(intRow)
ThisWorkbook.Sheets("Network").Range("A1").Value = "Name"
ThisWorkbook.Sheets("Network").Cells(1, 1).Font.Bold = True
ThisWorkbook.Sheets("Network").Range("B1").Value = "Value"
ThisWorkbook.Sheets("Network").Cells(1, 2).Font.Bold = True
For Each oWMIObjEx In oWMIObjSet
For Each oWMIProp In oWMIObjEx.Properties_
If Not IsNull(oWMIProp.Value) Then
If IsArray(oWMIProp.Value) Then
For n = LBound(oWMIProp.Value) To UBound(oWMIProp.Value)
Debug.Print oWMIProp.Name & "(" & n & ")", oWMIProp.Value(n)
ThisWorkbook.Sheets("Network").Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).Value = oWMIProp.Value(n)
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).HorizontalAlignment = xlLeft
intRow = intRow + 1
strRow = Str(intRow)
Next
Else
ThisWorkbook.Sheets("Network").Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).Value = oWMIProp.Value
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).HorizontalAlignment = xlLeft
intRow = intRow + 1
strRow = Str(intRow)
End If
End If
Next
'End If
Next
End Sub
現在, 你 要 為 你 在 這 指南 第一 部分 創建 的 每個 工作表 創建 一個 與 此 相同 的 函數, 只有 少數 差異
例如, 接下來 你 將 複製 以上 NetworkWMI() 的 代碼, 貼上 在 那個 代碼 的 末尾, 然後 將 "NetworkWMI()" 替換 為 "LogicalDiskWMI()"
只有 幾 個 部分 你 需要 更改 以便 這 代碼 填入 正確 的 工作表
更改 這個:
sWQL = "Select * From Win32_NetworkAdapterConfiguration"
成 這個:
sWQL = "Select * From Win32_LogicalDisk"
更改 這 四 行:
ThisWorkbook.Sheets("Network").Range("A1").Value = "Name"
ThisWorkbook.Sheets("Network").Cells(1, 1).Font.Bold = True
ThisWorkbook.Sheets("Network").Range("B1").Value = "Value"
ThisWorkbook.Sheets("Network").Cells(1, 2).Font.Bold = True
成 這個:
ThisWorkbook.Sheets("LogicalDisk").Range("A1").Value = "Name"
ThisWorkbook.Sheets("LogicalDisk").Cells(1, 1).Font.Bold = True
ThisWorkbook.Sheets("LogicalDisk").Range("B1").Value = "Value"
ThisWorkbook.Sheets("LogicalDisk").Cells(1, 2).Font.Bold = True
更改 這 兩 行:
ThisWorkbook.Sheets("Network").Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).Value = oWMIProp.Value(n)
成 這個:
ThisWorkbook.Sheets("LogicalDisk").Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets("LogicalDisk").Range("B" & Trim(strRow)).Value = oWMIProp.Value(n)
和 這 三 行:
ThisWorkbook.Sheets("Network").Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).Value = oWMIProp.Value
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).HorizontalAlignment = xlLeft
成 這個:
ThisWorkbook.Sheets("LogicalDisk").Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets("LogicalDisk").Range("B" & Trim(strRow)).Value = oWMIProp.Value
ThisWorkbook.Sheets("LogicalDisk").Range("B" & Trim(strRow)).HorizontalAlignment = xlLeft
現在, 你 差不多 完成 了!
重複 上述 對於 你 活頁簿 中 的 每個 標籤 函數 將 如下:
- "ProcessorWMI()" 給 "Processor" 工作表
- "PhysicalMemWMI()" 給 "Physical Memory" 工作表
- "VideoControlWMI()" 給 "Video Controller" 工作表
- "OnBoardWMI()" 給 "OnBoardDevices" 工作表
- "PrinterWMI()" 給 "Printer" 工作表
- "OperatingWMI()" 給 "Operating System" 工作表
- "SoftwareWMI()" 給 "Software" 工作表
- "ServicesWMI()" 給 "Services" 工作表
特殊 的 "Win32_" 物件 你 需要 使用 來 存取 這些 關於 你 電腦 的 信息 如下:
- Win32_NetworkAdapterConfiguration - 所有 你的 網路 設定
- Win32_LogicalDisk - 磁碟 容量 和 可用 空間
- Win32_Processor - CPU 規格
- Win32_PhysicalMemoryArray - RAM/已安裝 記憶體 大小
- Win32_VideoController - 顯示 適配器 和 設定
- Win32_OnBoardDevice - 主機板 裝置
- Win32_OperatingSystem - Windows 版本 和 序號
- WIn32_Printer - 已安裝 印表機
- Win32_Product - 已安裝 軟體
- Win32_BaseService - 列出 在 任何 電腦 上 運行 (或 停止) 的 服務 連同 服務 的 路徑 和 檔案名
完成 複製/貼上 和 調整 每個 那些 函數 在 代碼 的 Module1 區域 當 你 完成, 移動 到 這 指南 的 下一 部分
記住 要 在 VB 視圖 儲存 你的 代碼! 如果 你 最初 用 .xls 檔案 類型 儲存 你的 活頁簿, Excel 現在 會 要求 你 使用 啟用巨集 的 檔案 類型, 如 .xlsm
自動 載入 活頁簿
現在 你 有 所有 那些 強大 的 函數 創建 完成, 剩下 的 就是 在 每次 打開 活頁簿 時 運行 它們 做 這個 真的 很 容易
在 左側 物件 瀏覽器, 在 Microsoft Excel Objects 下, 你 應該 看到 ThisWorkbook 雙擊 那個 物件 以 打開 它
在 代碼 區域 的 頂部, 有 兩個 下拉 方塊, 將 左邊 的 改為 Workbook 和 右邊 的 改為 Open
你 將 看到 一個 自動 為 你 生成 的 函數 稱為 Private Sub Workbook_Open()
在 這裡, 輸入 以下 代碼行 使 函數 看起來 像 這樣:
Private Sub Workbook_Open()
NetworkWMI
LogicalDiskWMI
ProcessorWMI
PhysicalMemWMI
VideoControlWMI
OnBoardWMI
PrinterWMI
SoftwareWMI
OperatingWMI
ServicesWMI
End Sub
現在, 每次 你 打開 活頁簿, 你 新 創建 的 每個 函數 將 會 被 呼叫, 從 電腦 提取 所有 數據, 並 載入 到 適當 的 工作表
要 看 它 實際 運作, 儲存 代碼, 關閉 代碼 視窗, 儲存 活頁簿, 並 關閉 它 重新 打開 你 剛 關閉 的 檔案, 你 將 發現 每個 單獨 的 工作表 都 容納 關於 你 電腦 的 大量 數據
因為 活頁簿 包含 巨集, 可能 因 安全 原因 被 停用, 你 可能 必須 點擊 頂部 的 Enable Content 以 使 數據 被 收集
警告 - 它 收集 大量 數據, 所以 預期 等待 幾 分鐘 它 才能 載入 當 你 第一 次 打開 檔案
收集 電腦 信息
使用 WMI 進行 此項 令人 驚嘆 的 一點 是 上面 的 數據 只是 冰山一角 有 數百 個 更多 的 WMI 類 可用, 包含 關於 你 電腦 系統 方方面面 的 信息
如果 你 有 冒險 精神 和 想 更進一步, 你 可以 將 活頁簿 的 第一 個 工作表 變成 儀表板, 並 使用 其他 工作表 的 數據 來 餵養 那個 儀表板
底線 是 使用 這個 新 工具, 你 將 能夠 收集 和 顯示 比 大多數 IT 專家 甚至 意識到 可用 關於 電腦 系統 的 信息 更多, 並 你 將 能夠 在 那些 同樣 專家 花費 時間 在 控制面板 和 管理 區域 挖掘 這些 細節 的 幾分之一 時間 內 完成
你 看到 自己 建立 和 使用 這樣 的 工具 嗎? 你 是 VBA 程式設計師 並 使用 過 WMI 類 嗎? 在 下面 的 評論 部分 分享 你 自己的 經驗 和 想法!
Image Credits: Adriano Castelli via Shutterstock.com, Mclek via Shutterstock