
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件)
- 最新から表示
- 回答順に表示
No.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 へ変更してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「エクセルファイルが開いてい...
-
動かなくなってしまった古いVBA...
-
VBからExcelファイルを開くとき...
-
VBAでフォルダ内のhtmlファイル...
-
サブフォルダ含むフォルダ内の...
-
ファイルを開く時間測定のスク...
-
vbaサブフォルダーをワイルドカ...
-
vbs ブック共有を解除
-
タイムスタンプの更新の方法2
-
Accessのウインドウサイズの固定
-
VBAでCSVファイルを読み込もう...
-
【VBAマクロ初心者】Excel VBA...
-
VBAによるファイル名リスト作成
-
webブラウザからローカルファイ...
-
ファイルへのハイパーリンクで...
-
FileDialog オブジェクトでファ...
-
エクセルのVBAで開いている...
-
Wordのフッタでパスを含む...
-
コモンダイアログでフォルダを...
-
フォルダの中にファイルが存在...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
動かなくなってしまった古いVBA...
-
「エクセルファイルが開いてい...
-
FileDialog オブジェクトでファ...
-
vbaサブフォルダーをワイルドカ...
-
VBAでフォルダ内のhtmlファイル...
-
エクセルのVBAで開いている...
-
VB6でUTF-8ファイルの読取りを
-
excel マクロ PDF化の際のエラ...
-
Accessのウインドウサイズの固定
-
タイムスタンプの更新の方法2
-
vbs ブック共有を解除
-
ffftpでファイル取得が0バイト...
-
EXCEL VBAを使ったファイル解析...
-
サブフォルダ含むフォルダ内の...
-
ExcelVBA 文字コード変換
-
VBAでのファイル名と更新日(作...
-
AccessからOLEオブジェクト型の...
-
「AccessViolationException」...
-
フォルダ階層・ファイル名・ペ...
-
Filesearchオブジェクトを使用...
おすすめ情報