Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4747 / 13644 ツリー ←次へ | 前へ→

【54624】コンピューターの説明 たいくん 08/3/24(月) 22:44 質問[未読]
【54626】Re:コンピューターの説明 n 08/3/24(月) 23:48 発言[未読]
【54642】Re:コンピューターの説明 n 08/3/25(火) 11:28 回答[未読]
【54680】Re:コンピューターの説明 たいくん 08/3/26(水) 1:11 お礼[未読]
【54681】Re:コンピューターの説明 n 08/3/26(水) 1:33 発言[未読]
【54687】Re:コンピューターの説明 n 08/3/26(水) 11:26 発言[未読]
【54732】Re:コンピューターの説明 ひらめくん 08/3/27(木) 22:18 質問[未読]
【54734】Re:コンピューターの説明 ひらめくん 08/3/28(金) 0:41 発言[未読]
【54634】Re:コンピューターの説明 VBWASURETA 08/3/25(火) 10:20 発言[未読]
【54679】Re:コンピューターの説明 たいくん 08/3/26(水) 0:50 お礼[未読]

【54624】コンピューターの説明
質問  たいくん  - 08/3/24(月) 22:44 -

引用なし
パスワード
   マクロ初心者のたいくんと申します。
サーバー内に有るファイルを、各PCから開き不特定多数の人が書き込みを行うのですが、ファイルを開いたままにしている人がいると、他の人が書き込み出来ない為、ファイルをどのPCで開いているかを調べたいのです。
フルコンピューター名は取得出来るのですが、それではどこに有るPCか判らないのでコンピューターの説明部分(PCの設置場所が入力されている為)を取得する事は可能でしょうか?
ファイルを開く時にセルA1に取得したデーターを書き込み、自動保存する様にして他の人が開いた時読み取り専用(読み取り専用の時は処理しない)ならばセルA1を見ればどのPCか判る様になる。
どなたかご教授願います。

【54626】Re:コンピューターの説明
発言  n  - 08/3/24(月) 23:48 -

引用なし
パスワード
   こんにちは。
Excelの標準機能で、使用中のファイルを開こうとすると
「使用中のファイル:xxx.xlsは編集のためロックされています。使用者はyyyです。」と出ますね。
このyyyはApplication.UserNameなので、Application.UserNameをユニークな名前で再設定してあげれば
それが近道だと思います。
他サイトですが類似スレッド。
://excelfactory.net/excelboard/excelvba/cfs.cgi?word=106235&logs=.%2Fvbadat%2Fexcelqa.dat

【54634】Re:コンピューターの説明
発言  VBWASURETA  - 08/3/25(火) 10:20 -

引用なし
パスワード
   おはようございます。

多分コンピュータ名取得はAPIかなと思いますが。
一応説明もAPIで取得する方法があるにはありますが
ソースを理解していないと多分Excel vbaとして使うのは
難しいかも知れません。
以下のところにサンプルがあります。

//www.vbstation.net/spec/S2_1.htm

ソースはVBのものなので、そこから抜粋して必要箇所だけを
使うことになります。

後、NT系だけらしいのでOSには注意が必要です。
多分XPは大丈夫と思います。
このAPIがSystem32内とエディタで見る限り関数が公開されてました。

【54642】Re:コンピューターの説明
回答  n  - 08/3/25(火) 11:28 -

引用なし
パスワード
   一応、『コンピューターの説明』について
WMI(Windows Management Instrumentation)が利用できる環境なら
://www.wmifun.net/
こちらを参考に。

Sub try()
  Dim Loc As Object 'SWbemLocator
  Dim Svc As Object 'SWbemObjectSet
  Dim sv As Object

  On Error GoTo errHndr
  Set Loc = CreateObject("WbemScripting.SWbemLocator")
  Set Svc = Loc.ConnectServer.ExecQuery("Select * From Win32_OperatingSystem")
  For Each sv In Svc
    Debug.Print sv.CSName, sv.Description
  Next
errHndr:
  If Err.Number <> 0 Then Debug.Print Err.Number, Err.Description
  Set sv = Nothing
  Set Svc = Nothing
  Set Loc = Nothing
End Sub

【54679】Re:コンピューターの説明
お礼  たいくん  - 08/3/26(水) 0:50 -

引用なし
パスワード
   VBWASURETAさん

初心者の私には難しい様です。
又、OSもXPと2000が有るので駄目ですね。

回答有り難う御座いました。

【54680】Re:コンピューターの説明
お礼  たいくん  - 08/3/26(水) 1:11 -

引用なし
パスワード
   nさん

回答有り難う御座います。

取得したいのは、Application.UserNameで取得出来るデーターではなくシステムのプロパティのコンピューターの説明部分に記載されているデーターを取得したいのです。説明が不十分で申し訳有りません。

参考のページ見ましたが、やはり初心者の私には難しい様です。
一応マクロを走らせて見ましたが、コンパイルエラー ユーザー定義型は定義されていません。とエラーが出ます。
当方の環境では動作しないのでしょうか?
ちなみにOSはXPと2000、エクセルは97と2000です。

Private Sub Command1_Click()

Dim OsSet As SWbemObjectSet←ここでエラーがでます。
Dim Os As SWbemObject
Dim Locator As SWbemLocator
Dim Service As SWbemServices
Dim Ret As String

Set Locator = New WbemScripting.SWbemLocator
Set Service = Locator.ConnectServer
Set OsSet = Service.ExecQuery("Select * From Win32_OperatingSystem")

For Each Os In OsSet

  Ret = "コンピュータ名:" & Os.CSName & vbCrLf & _
    "コンピュータの説明:" & Os.Description

Next

MsgBox "コンピュータ名と説明です。 " & vbCrLf & vbCrLf & Ret

Set OsSet = Nothing
Set Os = Nothing
Set Service = Nothing
Set Locator = Nothing

End Sub

【54681】Re:コンピューターの説明
発言  n  - 08/3/26(水) 1:33 -

引用なし
パスワード
   >取得したいのは、Application.UserNameで取得出来るデーターではなくシステムのプロパティのコンピューターの説明部分に記載されているデーターを取得したいのです。
充分理解した上でレスしてます。
『Application.UserNameを設定し直すほうが近道ですよ』って。
>Sub try()
を提示しているにも関わらず理解頂けてないようなので尚更だと思うのですけどね。

【54687】Re:コンピューターの説明
発言  n  - 08/3/26(水) 11:26 -

引用なし
パスワード
   補足)
■目的が、コンピュータの説明を取得したい『だけ』なら Sub try()を試してみる。

■目的が、ある共有使用xlsファイルを使用したい時『誰が』使用中か知る事なら
>ファイルを開く時にセルA1に取得したデーターを書き込み、自動保存する様にして他の人が開いた時読み取り専用(読み取り専用の時は処理しない)ならばセルA1を見ればどのPCか判る様になる。
という面倒な事をしなくても、Excelの標準機能『使用中のメッセージ』を利用すれば良い。

■『使用中のメッセージ』に表示される使用者はApplication.UserNameである。
これはVBAからでも設定可能。
『誰が』使用中か識別できるようなUserNameを設定すれば良い。
各自、手動で設定してもらっても良いし、
一度、Openイベントを記述したxlsファイルをメール配信して
CreateObject("Wscript.Network").UserNameから取れるNetworkUserNameなどを
Application.UserNameに再セットしても良いし。
(もちろん「コンピュータの説明」でも、『誰が』使用中か識別できれば何でも良い)

【54732】Re:コンピューターの説明
質問  ひらめくん  - 08/3/27(木) 22:18 -

引用なし
パスワード
   ・ファイルというのはExcel形式(*.xls)のファイルでしょうか?
 Noならばあきらめてください。
 Yesならば次へ進む
・該当Excel形式ファイルを開いてください。
・シートの追加でシート名「Sheet1」のシートを新規作成してください。
・マクロを有効にしますか?と表示されたらEを押してください。
・Excelメニューでツール/マクロでセキュリティを選び
 マクロを動かせるように「中」に変えましょう。
・Alt+F11を押してVBEを開いてください。
・Ctrl+Rを押してプロジェクト画面を開き、
 Thisworkbookを選んでダブルクリックしてください。
・F7キーを押してコード画面が表示された状態で、
 次のコードをコピペして貼り付けてください
Private Sub Workbook_Open()
Dim WshNet As Object
Dim msg As String
Set WshNet = CreateObject("WScript.Network")
msg = "OpenDate/Time=" & Now() & _
 ",Domain=" & WshNet.UserDomain & _
 ",Computer=" & WshNet.ComputerName & _
 ",User=" & WshNet.USERNAME
ThisWorkbook.Worksheets("Sheet1").Range("A1").Value = msg
ThisWorkbook.Save
Set WshNet = Nothing
End Sub
・Ctrl+Sを押して上書き保存してください。
・Alt+QでExcel画面に戻ってください。
・Alt+F4を押してExcelを終了して上書き保存してください。
・もう一度該当Excel形式ファイルを開いてください。
・セル位置A1に開いた日時/ドメイン名/コンピュータ名/ユーザ名
 が表示されるはずです。正しく動きましたか?
−−−−−−−−−−−−−−−−−
*コンピュータ説明やExcel使用者は使ってない/変更禁止」という事もあったので、みなさんのご指摘の通りVBScript系WshNetworkオブジェクトを使うのが、一番手軽でよい気がします。
*自分的には通産省さん指導でコンピュータにGPS搭載を義務付けて、「どこにあるか」すぐ分かれば盗難防止や不正アクセス防止に役立つと思うので、GPS用APIをExcelVBAやJava等から使えたらなあーと思っています。まあ、逆にGPS通信で外部に情報が漏れたらまずいですが、「悪い所を見える化」できる方が良いのでは。
ぜひ、「たいくん」さんには頑張って実現していただきたいです。

【54734】Re:コンピューターの説明
発言  ひらめくん  - 08/3/28(金) 0:41 -

引用なし
パスワード
   これならどうですか?
Excelファイル開いてAlt+F11でVBEの標準モジュールに貼り付けて、実行!

Sub win32compsys2()
Dim strComputer: Dim objWMIService
Dim colItems: Dim objItem
Dim msg As Variant
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_ComputerSystem", , 48)
For Each objItem In colItems
  msg = msg & Chr(10) & "Domain: " & objItem.Domain
  msg = msg & Chr(10) & "Caption: " & objItem.Caption
  msg = msg & Chr(10) & "NameFormat: " & objItem.NameFormat
  msg = msg & Chr(10) & "Name: " & objItem.Name
  msg = msg & Chr(10) & "UserName: " & objItem.USERNAME
  msg = msg & Chr(10) & "PrimaryOwnerName: " & objItem.PrimaryOwnerName
  msg = msg & Chr(10) & "Description: " & objItem.Description
  msg = msg & Chr(10) & "Manufacturer: " & objItem.Manufacturer
  msg = msg & Chr(10) & "Model: " & objItem.Model
  msg = msg & Chr(10) & "SystemType: " & objItem.SystemType
Next
MsgBox msg
End Sub

4747 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free