過去ログ

                                Page      59
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼PCのスペック表  TA 02/9/4(水) 20:04
   ┣Re:PCのスペック表  こうちゃん 02/9/6(金) 9:49
   ┃  ┗Re:PCのスペック表  TA 02/9/6(金) 10:16
   ┃     ┣Re:PCのスペック表  こうちゃん 02/9/6(金) 13:53
   ┃     ┃  ┗Re:PCのスペック表  TA 02/9/6(金) 22:36
   ┃     ┗Re:PCのスペック表  JuJu 02/9/6(金) 18:39
   ┃        ┣Re:PCのスペック表  TA 02/9/6(金) 22:39
   ┃        ┗Re:PCのスペック表  TA 02/9/10(火) 12:33
   ┃           ┗Re:PCのスペック表  JuJu 02/9/10(火) 17:42
   ┗Re:PCのスペック表  TA 02/9/7(土) 14:47
      ┗Re:PCのスペック表  禰宜 02/9/8(日) 15:01

 ───────────────────────────────────────
 ■題名 : PCのスペック表
 ■名前 : TA <takashi.aw@comeon.cx>
 ■日付 : 02/9/4(水) 20:04
 -------------------------------------------------------------------------
   PCのスペック表を作りたいのですが
スペックを知りたいPCでエクセルファイルを開けば
@デバイスマネージャーのエクセル版ができてしまう!!
それを作りたいと思っております
Excel VBA からCPU などの情報(CPUの種類や速度、ハードディスク名称等など)
を取得する方法がわかりません

ご協力していただけないでしょうか?
 ───────────────────────────────────────  ■題名 : Re:PCのスペック表  ■名前 : こうちゃん <nakajima19@hotmail.com>  ■日付 : 02/9/6(金) 9:49  -------------------------------------------------------------------------
   TA さん、こんにちは

>PCのスペック表を作りたいのですが
>スペックを知りたいPCでエクセルファイルを開けば
>@デバイスマネージャーのエクセル版ができてしまう!!
>それを作りたいと思っております
>Excel VBA からCPU などの情報(CPUの種類や速度、ハードディスク名称等など)
>を取得する方法がわかりません
>
>ご協力していただけないでしょうか?

レスがつかないようなので・・・

ご希望の内容が具体的でないのでレスがつけづらいのだと思います。
「何」と「何」が必要なのかおしえてください。

ただし、「@デバイスマネージャーのエクセル版」だと WindowsのAPI ゴリゴリ使って、一部は自作DLL作って・・・てな感じになるかもしれませんね。

まあ、OSのバージョンだとかドライブの情報なら比較的簡単かもしれませんが・・^^;

とりあえず、「ここまで作ったんですが」とか「○○と××」を知る方法はとか、具体的に質問してくださいね。

#答えでなくてごめんなさいね。
 ───────────────────────────────────────  ■題名 : Re:PCのスペック表  ■名前 : TA <takashi.aw@comeon.cx>  ■日付 : 02/9/6(金) 10:16  -------------------------------------------------------------------------
   >とりあえず、「ここまで作ったんですが」とか「○○と××」を知る方法はとか、具体的に質問してくださいね。

わがまま身勝手な質問にお答えいただいてまことに申しえ分けありません

ここまで・・・

なんですが

簡単にいうと

セルにデバイスマネージャーの各機器情報を取り入れたいのです

呼び出すコマンドが一切不明な状況です

お助けのほうをよろしくお願いいたします
 ───────────────────────────────────────  ■題名 : Re:PCのスペック表  ■名前 : こうちゃん <nakajima19@hotmail.com>  ■日付 : 02/9/6(金) 13:53  -------------------------------------------------------------------------
   TA さん、こんにちは

>>とりあえず、「ここまで作ったんですが」とか「○○と××」を知る方法はとか、具体的に質問してくださいね。
具体的にお願いします。どこから手をつけていいかわからない状態なら、例をあげて質問するといいですね。
例えばA列にドライブ名を、B列に容量を列挙したいとか・・

あと、この手の質問はプラットフォームが重要な場合がありますので、環境(OSやExcelのバージョン等)を明確にしましょう。

>簡単にいうと
>セルにデバイスマネージャーの各機器情報を取り入れたいのです
>呼び出すコマンドが一切不明な状況です

簡単に言われちゃわかりません^^:
知識不足でもうしわけないですが、デバイスマネージャーとはなんですか?


とはいえ、とりあえずTAさんの要望がわかりませんので、とっかかりとして・・
PCのすべてのドライブのタイプとハードディスクの容量をFSOで調べるサンプル上げときます。
標準モジュールで実行してみてください。

Sub test()

  Dim d    As Variant
  Dim DType  As String
  Dim DTtl  As String
  Dim DSpc  As String
  Dim fso   As Object
  Dim i As Integer
  
  Set fso = CreateObject("Scripting.FilesystemObject")
  
  Cells(1, 1).Value = "ドライブ文字"
  Cells(1, 2).Value = "ドライブタイプ"
  Cells(1, 3).Value = "総容量"
  Cells(1, 4).Value = "空き容量"
  
  i = 1
  For Each d In fso.Drives
    DTtl = ""
    DSpc = ""
    Select Case d.Drivetype
      Case 0: DType = "不明"
      Case 1: DType = "リムーバブルディスク"
      Case 2
        DType = "ハードディスク"
        DTtl = Format(d.TotalSize / (1024# * 1024#), "#.#") & "MB"
        DSpc = Format(d.AvailableSpace / (1024# * 1024#), "#.#") & "MB"
      Case 3: DType = "ネットワークドライブ"
      Case 4: DType = "CD-ROM"
      Case 5: DType = "RAMディスク"
    End Select
  
    i = i + 1
  
    Cells(i, 1).Value = d.DriveLetter
    Cells(i, 2).Value = DType
    Cells(i, 3).Value = DTtl
    Cells(i, 4).Value = DSpc
  
  Next

  MsgBox i - 1 & "個のドライブが見つかりました"

End Sub
 ───────────────────────────────────────  ■題名 : Re:PCのスペック表  ■名前 : TA <takashi.aw@comeon.cx>  ■日付 : 02/9/6(金) 22:36  -------------------------------------------------------------------------
   丁寧なご回答ありがとうございます

だんだんと煮詰まってきた感じがします(泣)

>例えばA列にドライブ名を、B列に容量を列挙したいとか・・

そうなんですこんな感じで・・・・

>あと、この手の質問はプラットフォームが重要な場合がありますので、環境(OSやExcelのバージョン等)を明確にしましょう。

OSについては2000,XP
エクセルでは2000,2002

で実行できるようにしたいのですが

ここをみてください



http://afinsuper.hoops.jp/ee/vba.stm

これで結構わかっていただけると思います

よろしくお願いいたします
 ───────────────────────────────────────  ■題名 : Re:PCのスペック表  ■名前 : JuJu <juju-bbs@su-u.com>  ■日付 : 02/9/6(金) 18:39  -------------------------------------------------------------------------
   TAさん、こうちゃん、こんにちはぁ

>セルにデバイスマネージャーの各機器情報を取り入れたいのです
>呼び出すコマンドが一切不明な状況です

デバイスマネージャの情報ならレジストリから抜き出せると思ったのですが、
95系(95,98,Me)では有効になっているデバイスの取得がうまくいかないです。
もう少し考えてみます。

ではではぁ

'---- 8= ---- 8< ---- 8= ---- 8< ---- 8= ---- 8< ---- 8= ---- 8< ---- 8=
' レジストリ関連API定義
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long
Private Type FILETIME
  dwLowDateTime As Long
  dwHighDateTime As Long
End Type
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const REG_SZ = 1
Private Const REG_EXPAND_SZ = 2

' レジストリから、キー値を取得する
Public Function GetRegValue(ByVal hKey As Long, ByVal strSubKey As String, ByVal strValueName As String) As String
  Dim hReg As Long
  Dim lngSize As Long
  Dim lngType As Long
  Dim lngPos1 As Long, lngPos2 As Long
  Dim strFuncResult As String

  strFuncResult = ""
  '' レジストリを開く
  If RegOpenKeyEx(hKey, strSubKey, 0&, KEY_QUERY_VALUE, hReg) = 0& Then
    '' サイズ,型の取得
    If RegQueryValueEx(hReg, strValueName, 0&, lngType, ByVal 0&, lngSize) = 0& Then
      If lngSize > 0 Then
        '' キー値用のバッファ
        strFuncResult = Space$(lngSize - 1)
        '' レジストリ値の取得
        If RegQueryValueEx(hReg, strValueName, 0&, lngType, ByVal strFuncResult, lngSize) = 0& Then
          If lngType = REG_EXPAND_SZ Then
            '' 環境変数を展開する
            Do While strFuncResult Like "*%*%*"
              lngPos1 = InStr(strFuncResult, "%")
              lngPos2 = InStr(lngPos1 + 1, strFuncResult, "%")
              strFuncResult = Left$(strFuncResult, lngPos1 - 1) _
                     & Environ$(Mid$(strFuncResult, lngPos1 + 1, lngPos2 - lngPos1 - 1)) _
                     & Mid$(strFuncResult, lngPos2 + 1)
            Loop
          End If
        End If
      End If
    End If
    '' レジストリを閉じる
    RegCloseKey hReg
  End If
  GetRegValue = strFuncResult
End Function

' レジストリから、サブキーを列挙する
Public Function GetRegEnumKey(ByVal hKey As Long, ByVal strSubKey As String) As Variant
  Dim hReg As Long
  Dim strRegKey As String, lngRegSize As Long
  Dim lngIndex As Long
  Dim udtFileTime As FILETIME
  Dim astrFuncResult() As String

  '' レジストリを開く
  If RegOpenKeyEx(hKey, strSubKey, 0&, KEY_ENUMERATE_SUB_KEYS, hReg) = 0& Then
    lngIndex = 0
    Do
      '' バッファの初期化
      lngRegSize = 256
      strRegKey = Space(lngRegSize)
      '' サブキーの取得
      If RegEnumKeyEx(hReg, lngIndex, strRegKey, lngRegSize, 0&, vbNullString, 0&, udtFileTime) <> 0& Then Exit Do
      ReDim Preserve astrFuncResult(lngIndex)
      astrFuncResult(lngIndex) = Left$(strRegKey, lngRegSize)
      lngIndex = lngIndex + 1
    Loop
    '' レジストリを閉じる
    RegCloseKey hReg
  End If
  GetRegEnumKey = IIf(lngIndex > 0, astrFuncResult, Empty)
End Function

Sub Macro1()
  Dim strSubKey1 As String, strSubKey2 As String
  Dim varKeys1 As Variant, varKeys2 As Variant, varKeys3 As Variant
  Dim i1 As Long, i2 As Long, i3 As Long
  Dim strDriver As String
  Dim strDeviceDesc As String
  Dim strName As String
  Dim colEnum As New Collection
  Dim lngRow As Long
  Dim blnNT As Boolean

  '' OSの判断
  blnNT = Application.OperatingSystem Like "Windows*NT*"
  If blnNT Then
    strSubKey1 = "SYSTEM\CurrentControlSet\Enum"
    strSubKey2 = "SYSTEM\CurrentControlSet\Control\Class"
  Else
    strSubKey1 = "Enum"
    strSubKey2 = "SYSTEM\CurrentControlSet\Services\Class"
  End If

  '' 別名一覧の取得
  varKeys1 = GetRegEnumKey(HKEY_LOCAL_MACHINE, strSubKey1)
  If Not IsEmpty(varKeys1) Then
    For i1 = LBound(varKeys1) To UBound(varKeys1)
      varKeys2 = GetRegEnumKey(HKEY_LOCAL_MACHINE, strSubKey1 & "\" & varKeys1(i1))
      If Not IsEmpty(varKeys2) Then
        For i2 = LBound(varKeys2) To UBound(varKeys2)
          varKeys3 = GetRegEnumKey(HKEY_LOCAL_MACHINE, strSubKey1 & "\" & varKeys1(i1) & "\" & varKeys2(i2))
          If Not IsEmpty(varKeys3) Then
            For i3 = LBound(varKeys3) To UBound(varKeys3)
              If (Len(GetRegValue(HKEY_LOCAL_MACHINE, strSubKey1 & "\" & varKeys1(i1) & "\" & varKeys2(i2) & "\" & varKeys3(i3) & "\Control", "DeviceReference")) > 0) Or Not blnNT Then
                strDriver = GetRegValue(HKEY_LOCAL_MACHINE, strSubKey1 & "\" & varKeys1(i1) & "\" & varKeys2(i2) & "\" & varKeys3(i3), "Driver")
                strDeviceDesc = GetRegValue(HKEY_LOCAL_MACHINE, strSubKey1 & "\" & varKeys1(i1) & "\" & varKeys2(i2) & "\" & varKeys3(i3), "DeviceDesc")
                strName = GetRegValue(HKEY_LOCAL_MACHINE, strSubKey1 & "\" & varKeys1(i1) & "\" & varKeys2(i2) & "\" & varKeys3(i3), "FriendlyName")
                On Error Resume Next
                  colEnum.Add IIf(Len(strName) > 0, strName, strDeviceDesc), strDriver
                On Error GoTo 0
              End If
            Next
          End If
        Next
      End If
    Next
  End If

  '' デバイス一覧の取得
  lngRow = 1
  varKeys1 = GetRegEnumKey(HKEY_LOCAL_MACHINE, strSubKey2)
  If Not IsEmpty(varKeys1) Then
    For i1 = LBound(varKeys1) To UBound(varKeys1)
      strName = GetRegValue(HKEY_LOCAL_MACHINE, strSubKey2 & "\" & varKeys1(i1), "")
      If Len(strName) > 0 Then
        ActiveSheet.Cells(lngRow, 1) = strName
        lngRow = lngRow + 1
        varKeys2 = GetRegEnumKey(HKEY_LOCAL_MACHINE, strSubKey2 & "\" & varKeys1(i1))
        If Not IsEmpty(varKeys2) Then
          For i2 = LBound(varKeys2) To UBound(varKeys2)
            If IsNumeric(varKeys2(i2)) Then
              '' 別名を取得
              strName = ""
              On Error Resume Next
                strName = colEnum(varKeys1(i1) & "\" & varKeys2(i2))
              On Error GoTo 0
              If Len(strName) > 0 Then
                ActiveSheet.Cells(lngRow, 2) = strName
                lngRow = lngRow + 1
              End If
            End If
          Next
        End If
      End If
    Next
  End If
End Sub
 ───────────────────────────────────────  ■題名 : Re:PCのスペック表  ■名前 : TA <takashi.aw@comeon.cx>  ■日付 : 02/9/6(金) 22:39  -------------------------------------------------------------------------
   ご迷惑ばかりおかけしまして

申し訳ありません

どうにかなりそうになってきました

ここ↓をみてください(わかりにくいかもしれません)

http://afinsuper.hoops.jp/ee/vba.stm

お手数ですが

よろしくお願いいたします
 ───────────────────────────────────────  ■題名 : Re:PCのスペック表  ■名前 : TA <takashi.aw@comeon.cx>  ■日付 : 02/9/10(火) 12:33  -------------------------------------------------------------------------
   皆様、ご協力いただいてありがとうございます

時間があいてしまいまして大変失礼いたします

JuJuさん ありがとうございました

JuJuさんのもので各機器の情報は取り出せたのですが
肝心の固有名称って言うやつ・・・・

CPU ならば 
Pentium 4など

機器型番もB列に出力したいのですが・・

ご協力いただけないでしょうか?
 ───────────────────────────────────────  ■題名 : Re:PCのスペック表  ■名前 : JuJu <juju-bbs@su-u.com>  ■日付 : 02/9/10(火) 17:42  -------------------------------------------------------------------------
   TAさん、禰宜さん、こんにちはぁ

>肝心の固有名称って言うやつ・・・・
>機器型番もB列に出力したいのですが・・

固有名称?機器型番?
って例えばどんなのですか?

>CPU ならば 
>Pentium 4など

VendorIdentifier と Identifier を表示してみました。
(2000,XP限定)
http://www.atmarkit.co.jp/fpc/pcmainterepair/pcmr001/pcmr002.html
を参考にしてCPU名に変換してみてね。

ではではぁ

'---- 8= ---- 8< ---- 8= ---- 8< ---- 8= ---- 8< ---- 8= ---- 8< ---- 8=
' レジストリ関連API定義
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long
Private Type FILETIME
  dwLowDateTime As Long
  dwHighDateTime As Long
End Type
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const REG_SZ = 1
Private Const REG_EXPAND_SZ = 2
Private Const REG_DWORD = 4

' レジストリから、キー値を取得する
Public Function GetRegValue(ByVal hKey As Long, ByVal strSubKey As String, ByVal strValueName As String) As Variant
  Dim hReg As Long
  Dim lngSize As Long
  Dim lngType As Long
  Dim lngPos1 As Long, lngPos2 As Long
  Dim strBuffer As String, lngBuffer As Long
  Dim varFuncResult As Variant

  varFuncResult = Empty
  '' レジストリを開く
  If RegOpenKeyEx(hKey, strSubKey, 0&, KEY_QUERY_VALUE, hReg) = 0& Then
    '' サイズ,型の取得
    If RegQueryValueEx(hReg, strValueName, 0&, lngType, ByVal 0&, lngSize) = 0& Then
      If lngSize > 0 Then
        Select Case lngType
          Case REG_SZ
            '' キー値用のバッファ
            strBuffer = Space$(lngSize - 1)
            '' レジストリ値の取得
            If RegQueryValueEx(hReg, strValueName, 0&, lngType, ByVal strBuffer, lngSize) = 0& Then
              varFuncResult = strBuffer
            End If
          Case REG_EXPAND_SZ
            '' キー値用のバッファ
            strBuffer = Space$(lngSize - 1)
            '' レジストリ値の取得
            If RegQueryValueEx(hReg, strValueName, 0&, lngType, ByVal strBuffer, lngSize) = 0& Then
              If lngType = REG_EXPAND_SZ Then
                '' 環境変数を展開する
                Do While strBuffer Like "*%*%*"
                  lngPos1 = InStr(strBuffer, "%")
                  lngPos2 = InStr(lngPos1 + 1, strBuffer, "%")
                  strBuffer = Left$(strBuffer, lngPos1 - 1) _
                       & Environ$(Mid$(strBuffer, lngPos1 + 1, lngPos2 - lngPos1 - 1)) _
                       & Mid$(strBuffer, lngPos2 + 1)
                Loop
              End If
              varFuncResult = strBuffer
            End If
          Case REG_DWORD
            If RegQueryValueEx(hReg, strValueName, 0&, lngType, lngBuffer, lngSize) = 0& Then
              varFuncResult = lngBuffer
            End If
        End Select
      End If
    End If
    '' レジストリを閉じる
    RegCloseKey hReg
  End If
  GetRegValue = varFuncResult
End Function

Sub Macro1()

  ActiveSheet.Cells(1, 1) = GetRegValue(HKEY_LOCAL_MACHINE, "HARDWARE\DESCRIPTION\System\CentralProcessor\0", "VendorIdentifier")
  ActiveSheet.Cells(2, 1) = GetRegValue(HKEY_LOCAL_MACHINE, "HARDWARE\DESCRIPTION\System\CentralProcessor\0", "Identifier")
  ActiveSheet.Cells(3, 1) = GetRegValue(HKEY_LOCAL_MACHINE, "HARDWARE\DESCRIPTION\System\CentralProcessor\0", "~MHz")
End Sub
 ───────────────────────────────────────  ■題名 : Re:PCのスペック表  ■名前 : TA <takashi.aw@comeon.cx>  ■日付 : 02/9/7(土) 14:47  -------------------------------------------------------------------------
   ▼TA さん:
>PCのスペック表を作りたいのですが
>スペックを知りたいPCでエクセルファイルを開けば
>@デバイスマネージャーのエクセル版ができてしまう!!
>それを作りたいと思っております
>Excel VBA からCPU などの情報(CPUの種類や速度、ハードディスク名称等など)
>を取得する方法がわかりません
>
>ご協力していただけないでしょうか?

引き続きこちらを参照いただきましてご回答のほうを
おねがいいたします

http://afinsuper.hoops.jp/ee/vba.stm
 ───────────────────────────────────────  ■題名 : Re:PCのスペック表  ■名前 : 禰宜 <mune109@hotmail.com>  ■日付 : 02/9/8(日) 15:01  -------------------------------------------------------------------------
   失礼いたします。

基本的にはレジストリから情報を取得する形になりますよね。
該当するキーから値を取ってきて表示です。
NT系と9X系で微妙に違いはありますが、方法は
JuJuさんがご提示のような感じです。

どのあたりが不明点なのでしょうか。
ここまで出来ているという感じのコードがあれば、
アップしてもらえるとレスも付きやすいと思いますよ。

失礼いたしました。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 59