こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCEL VBA コピー貼り付け時のチェック

お世話になります。田中と申します。

VBAの練習で下記の操作を実現したいと思っておりますが、どうしたらよいのか分りません。

A.xlsというブックがあります。

A.xlsの[データ]というシートにボタンをおいてそのボタンをクリックしたら以下のような動作をしたいのです。

このA.xlsの[データ]シートのA1~L20までをコピーして、C:\Users\田中\DesktopにあるB.xlsというブックの[シート1]という名称の単にシートに貼り付けしたいのです。

ただし貼り付け時に他のユーザーがB.xlsを開いている場合は、貼り付け処理を中止したいのですが、そのようなユーザーに開かれているかどうかVBAでチェックする方法はありますでしょうか?
どなたかお知恵をお借りできますでしょうか。
よろしくお願い致します。

環境 Windows7 Excel2013

投稿日時 - 2015-09-14 14:44:43

QNo.9047585

すぐに回答ほしいです

質問者が選んだベストアンサー

「VBAの練習」との事なので、No1にてご質問のチェック方法のみの記述としましたが、コピー貼付の部分も含めた回答を補足として上げさせていただきます。
不要であれば以下は無視してください。




今回のコードは、コピー元となるAブックにVBAコードを記述する場合となります。
(Aブックがほかに有る場合はAブックを開く処理を加える必要が有ります)

>[シート1]という名称の単にシートに貼り付けしたいのです。
どのセルに張り付けるのか記載されていないため、
同じセル(基点をA1セルとして)貼り付けています。

不明な点がありましたら補足願います。
参考まで。

■VBAコード

Sub Sample()
  'ダイアログ表示を無効化
  Application.DisplayAlerts = False
  'Bブックのファイルを開く(利用可能時の通知非表示)
  Workbooks.Open Filename:="C:\Users\田中\Desktop\B.xls", Notify:=False
  'ダイアログ表示を有効化
  Application.DisplayAlerts = True
  '読み取り専用で開いているかチェック
  If ActiveWorkbook.ReadOnly Then
  '▼読み取り専用の場合に実行
    '誰かが開いている場合、メッセージを表示
    MsgBox "読み取り専用のため中止します"
    '開いたBブックを閉じる
    ActiveWorkbook.Close
  Else
  '▼読み取り専用でない場合に実行
    'このマクロコードが記述されているAブックの選択中のシートのA1:L20をコピーし、
    'Bブックのシート1のセルA1を基点にして貼り付ける
    ThisWorkbook.ActiveSheet.Range("A1:L20").Copy Worksheets("シート1").Range("A1")
    'Bブックを上書き保存(不要であれば削除)
    ActiveWorkbook.Save
    'Bブックを閉じる(不要であれば削除)
    ActiveWorkbook.Close
  End If
End Sub

投稿日時 - 2015-09-14 20:18:03

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

1つのファイルを共有して開いた場合は、あとから開いた方が読み取り専用で開かれます。
ワークブックオブジェクトのReadOnlyプロパティの値で読み取り専用であるかが判断可能です。これを利用すれば、そのファイルがほかのユーザーが既に開いているか判断することが出来ます。

末尾に「★」を付けている箇所でBブックのパスを指定してください。
また同一行の「Notify:=False」にて、ファイルが使用可能になった際の通知を無効化しています。
この場合、開く際に誰かが開いていると確認のダイアログが表示されてしまうため、
前後に「Application.DisplayAlerts = False/True」でダイアログを無効化しています。

誰かが開いていた場合は、メッセージを表示した後に読み取り専用で開いたブックを閉じる処理にしています。
「'ここにAブックからBブックへのコピー処理を記述」の箇所へ、コピーする処理を記述してください。

■VBAコード

Sub Sample()
  Application.DisplayAlerts = False
  Workbooks.Open Filename:="Bブックのファイルパス", Notify:=False '★
  Application.DisplayAlerts = True
  If ActiveWorkbook.ReadOnly Then
    MsgBox "読み取り専用のため中止します"
    ActiveWorkbook.Close
  Else
    'ここにAブックからBブックへのコピー処理を記述
  End If
End Sub

投稿日時 - 2015-09-14 15:13:54

お礼

eden3616 さん、早速のご連絡ありがとうございます!

ご教授いただきましたロジックで完璧に出来ました!!
すごいです!
このたびは本当にありがとうございました!!

投稿日時 - 2015-09-14 20:41:25

あなたにオススメの質問