重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

vbsでドラッグアンドドロップしたExcelファイルのブック共有解除
  ActiveWorkbook.UnprotectSharing
ActiveWorkbook.ExclusiveAccess
を行いたいのですがうまくいきません
ご教示いただけますと幸いです。

▼ VBScriptを使ってExcelファイルを開き、共有を解除

' エラーハンドリングを有効にする
On Error Resume Next

' Excelアプリケーションオブジェクトを作成する
Set objExcel = CreateObject("Excel.Application")

' Excelアプリケーションの警告を表示しないように設定
objExcel.DisplayAlerts = False

' コマンドライン引数(ドラッグアンドドロップ)からファイルパスを取得
Set objArgs = WScript.Arguments
If objArgs.Count = 0 Then
' Excelアプリケーションを終了し、オブジェクトを解放
objExcel.Quit
Set objExcel = Nothing
WScript.Quit
End If

filePath = objArgs(0)

' ファイルが存在するか確認
If CreateObject("Scripting.FileSystemObject").FileExists(filePath) Then
' Excelファイルを開く
  ' 共有を解除
Set objWorkbook = objExcel.Workbooks.Open(filePath)
ActiveWorkbook.UnprotectSharing

' ワークブックを閉じる
objWorkbook.Close False
End If
' Excelアプリケーションを完全に終了する
objExcel.Quit
Set objWorkbook = Nothing
Set objExcel = Nothing

' エラーハンドリングを解除
On Error GoTo 0

A 回答 (2件)

もう既に解決していらっしゃればご参考程度に。



On Error ステートメントは使い方がとても難しいです。
On Error Resume Next は発生したエラーを隠して気付かなくさせ、On Error GoTo 0 は終了コードを正常終了に変えてしまい Windows のイベントログにもエラー履歴が残らなくなります。このエラーを隠してしまう挙動によって、開発者はデバッグで混乱してしまうと思います。

Workbook.UnprotectSharing メソッド
Workbook.ExclusiveAccess メソッド
この Excel の2つのメソッドは、2つとも記述しないと実行されないことは知られている通りです。ただ、ご質問中のコードではエクセルのアプリケーションウィンドウが非表示の設定(明示的に記述しない場合はウィンドウ非表示になります)であるのに、Workbook オブジェクトの指定が ActiveWorkbook なのでエラーが発生します。ですが、On Error Resume Next があるため気付けていらっしゃらないかもしれません。

On Error Resume Next をエラーハンドリングの用途で書く場合は、少なくともエラーの内容を拾って表示させ、Windows がエラー履歴を残せる様に振る舞う必要があるのではないかと思います。場合によってはエラーによる後始末の内容までも記述しなければならないケースもあると思います。
[引用元]
On Error ステートメント | Microsoft Learn - 解説より
https://learn.microsoft.com/ja-jp/previous-versi …

ですが、実はエラー回避のために On Error Resume Next と記述する必要性はほぼ無く、エラーになる条件を調べておいてコードを工夫すればほとんどのケースでエラーを事前に回避させることが可能になっています。
例えば、Workbook.ExclusiveAccess メソッドは共有していないブックで実行するとエラーが発生しますが、事前に Workbook.MultiUserEditing プロパティで共有情報を調べておいて、条件分岐を組み合わせる事で共有しているブックに対象を絞って実行させるようにする事でエラーの事前回避ができます。
[引用元]
Workbook.ExclusiveAccess メソッド | Microsoft Learn - 注釈より
https://learn.microsoft.com/ja-jp/office/vba/api …
この実例は Excel VBA の構文ですが、 VBS でのエラー事前回避も同じことが言えます。VBS の場合も、WSH が持つ [~ オブジェクトの ~プロパティ]や、言語が持つ機能の [Is~] 関数などが活躍できると思います。

回答コードは文字数制限で全てを一度には掲載できないため Google ドキュメントにアップロードしました。On Error Resume Next の使用例の一例でも有りますが、同時に上記のエラー事前回避策も取り入れています。
また、私の記述スタイルは構造化プログラミングの考えを取り入れていますのでプロシージャの数が多くなっています。そして、コードの読み易さの向上が目的で行と行の間は空けている箇所が多く、コメントに関してはプロシージャ名や変数名で用途や内容を説明していますので多くは書き入れていません。Q & A サイトではあまり見掛けない Call ステートメントや Class 関連には何をする構文なのかをコメントしています。

回答コードのアップロード先 - Google ドキュメント
https://docs.google.com/document/d/1ubOAPdFNnOlX …

Google ドキュメントで表示されたコードを一番上から一番下まで選択してコピーし、メモ帳アプリなどに貼り付けてお試しください。なお、メモ帳アプリを使った場合は保存時の文字コードを UTF-8 から ANSI へ変更してください。
    • good
    • 0
この回答へのお礼

ありがとう

お礼日時:2024/08/04 21:04

>On Error Resume Next


まず、これを1行目に書いてあるのを削除すべきです。
でないと、自分のプログラム誤りも握りつぶされて、上手くいかない原因を特定しづらくなるので。

たぶん、エラー発生個所が特定出来たら、プログラムを直すことができると思います。
    • good
    • 1
この回答へのお礼

出来ました!ありがとうございます!!

お礼日時:2024/07/28 13:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!