プロが教える店舗&オフィスのセキュリティ対策術

教えてください。
シートが非アクティブになった時、他のシートへ手動コピーするためのマクロですが
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Dim r As Range
If Application.CutCopyMode Then
【【Set r = Windows(ThisWorkbook.Name)ActiveSheet.Selection】】
【【  】】内がタイトルのようなエラーになってしまいます。
あと、「コンパイルエラー 修正候補:ステートメントの最後」のエラーも出ます。
直し方をおしえていただけないでしょうか。
よろしくお願いいたします。

質問者からの補足コメント

  • No.1様へ。
    回答ありがとうございます。
    Selection はここでは使えなかったんですね。知らなかったです。
    コードを貼り付けて変数 r の宣言を Variantにしてみたのですが、
    シートのコピーした内容を、他シート/ブックへ貼付けれませんでした。
    他に何か手段があれば教えていただけないでしょうか。
    よろしくお願いいたします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/05/04 23:30
  • No.2様。
    回答ありがとうございます。
    そもそも、この状況で「Windows(ThisWorkbook.Name).ActiveSheet.Selection」は使えなかったのですね。
    >後は何をするかです。
    >・別シートに丸々上書きするのであれば
    シート丸ごとではなく、随時必要な部分を他シート/ブックへコピー&貼り付けしたいです。
    ただ、ブックイベントで自動計算、手動計算の切り替えを行っているからか、貼り付ける頃にはコピー元の四角い破線が消えているのです。
    何かいい方法はありませんでしょうか。
    よろしくお願いいたします。

    No.2の回答に寄せられた補足コメントです。 補足日時:2022/05/04 23:57
  • No.3様へ。
    回答ありがとうございます。
    >プログラムなのに手動でですか??
    はい、コピ&ペーストは決まったパターンで行うのではなく、必要な時に必要な範囲をコピーするだけなので。
    該当ブックは手動計算&再計算で使用しているのですが、他ブックを開くと勝手に手動計算が反映されてしまい困ってました。そこで、該当ブックが非アクティブになる時に自動計算に戻すようにしているのですが、今度は該当ブックから他ブック、開いているシートから他シートに切り替えるとコピー元の点線囲みが消え、ペースト出来ないのです。いい方法があれば教えてください。
    よろしくお願いいたします。

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/05/05 17:10

A 回答 (5件)

>>随時必要な部分を他シート/ブックへコピー&貼り付けしたいです。


プログラムなのに手動でですか??

手動なら、そこで一旦停止させ、手入力後に再開。

自動なら毎回プログラムに手を入れる。
別ブックを起動する処理も要ります。
同一ブックの別シートなら、起動処理は不要。

と、色々有って、どうしたいかです。
この回答への補足あり
    • good
    • 0

こんにちは


ざっくりしか読まずに回答します
処理の詳細、手順がどの様なものか検討が必要かもしれませんが

ユーザーフォームにVBAを書き
.Show vbModeless でロードして使う でどうでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>.Show vbModeless でロードして使う
使い方が良くわからなかったです。
これって、vbaで自動計算や再計算してもコピーモードを継続できるでしょうか。

お礼日時:2022/05/09 15:46

>>いい方法があれば・・・・・。



1個のVBAでやろうとしてる事に無理が有るのでは無いですか?
VBAは途中で中断しても当該ブックに触れません。

VBAを2個作れば良いのでは?

1個目のVBAで必要な処理して終了
この後手作業
2個目のVBAで続きの処理を実行?

2個目実行用のボタンを設置するとか・・・。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>VBAを2個作れば良いのでは?
これは、思いつかなかったです、すごいです。
ただ、他の人もたくさん使用しますので、あまり運用を変えたくないのです。
2個目実行用のボタンを設置以外でできれば良いのですが。
とりあえず、「Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)」をPrivate Sub Workbook_Activate()」を使ってみます。
何度も回答ありがとうございました。

お礼日時:2022/05/09 15:41

Windows(ThisWorkbook.Name)ActiveSheet.Selection



Windows(ThisWorkbook.Name).ActiveSheet.Selection

これで文法エラーは無くなりますが、実行出来ないと思います。

Set R = Windows(ThisWorkbook.Name)ActiveSheetとやれば、Rはアクティブシートそのものになりますが、後は何をするかです。

・別シートに丸々上書きするのであれば


Dim R As Worksheet
Set R = Windows(ThisWorkbook.Name).ActiveSheet
R.Cells.Copy Worksheets("Sheet2").Range("A1")

とか、

・ブックの最後へ退避コピーするので有れば
R.Copy After := Worksheets(Worksheets.Count)

が、要るのでは??
この回答への補足あり
    • good
    • 0

こんにちは



全体像がまったくわかりませんけれど、ご提示の1行だけで見るなら・・

コンパイルエラーは、大抵は構文ミスなので・・
>Set r = Windows(ThisWorkbook.Name)ActiveSheet.Selection
   ↓ ↓
 Set r = Windows(ThisWorkbook.Name).ActiveSheet.Selection
でも一応は通りますけれど、いずれにしろ実行時エラーになるものと想像します。

とは言え、コンパイルエラーを修正せずに、ご質問にある実行時エラーがでることはないはずと思いますけれど??
SheetDeactivateイベントはアクティブでなくなった時に発生しますので、「ActiveSheet」も「Selection」も質問者様の思っている内容とは、実際には、異なる実態を意味しているものと想像します。
また、そもそもですが Selection は Application オブジェクトのプロパティなので、Worksheetのプロパティとしては存在しません。
https://docs.microsoft.com/ja-jp/office/vba/api/ …


さて・・・、
もしも、なさりたいことが『元のシート上の選択範囲を取得したい』のだとするなら、Selectionを参照するしかありませんけれど、そのためには元のシートを表示しなければならないですね。
少々面倒にはなりますが、以下のようにすることで、取得することは可能と思います。

Dim sh1, r

Set sh1 = ActiveSheet
Application.EnableEvents = False
Application.ScreenUpdating = False
Sh.Activate
Set r = Selection
sh1.Activate
Application.ScreenUpdating = True
Application.EnableEvents = True

※ 上記で取得できる「選択範囲」は必ずしもセル範囲とは限りません。
 (何らかの別のオブジェクトを選択していたりする可能性もあるので・・)
 ですので、その後の処理を行う前に、必ず選択範囲の内容を確認してから処理をしないと、またエラーの原因となり得ますのでご注意ください。
※ EnableEvents = False 中にエラーを発生させると面倒なので、変数 r の宣言は Variant 型にしておく方が無難ではないかと思います。
(Rangeで宣言してしまうと、セルではないものが選択されていた時に「型が一致しません」のエラーが発生します)
この回答への補足あり
    • good
    • 1

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


人気Q&Aランキング