Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2010)
コピペができなくなる
投稿日時: 18/06/26 15:19:49
投稿者: ラングドシャ

お願いいたします。
 

Private Sub Workbook_Activate()

Application.MoveAfterReturn = True
Application.MoveAfterReturnDirection = xlToRight

End Sub

 
このコードで、エンターでの右移動を可能にしています。
ところが、このコードがあると他のブックからのコピペができなくなります。
他のブックでコピーし、このブックで貼り付けようとすると貼り付けメニューが
グレーアウトします。
コードをコメントにすると、貼り付けできます。
 
コードを使いつつ、貼り付けできるにようする方法はないでしょうか?
よろしくお願いいたします。

回答
投稿日時: 18/06/26 16:19:20
投稿者: WinArrow
投稿者のウェブサイトに移動

確かに
掲示のコードでは、コピペが効かなくなりますね・・・
 
>Application.MoveAfterReturn = True
は必要なんですか?

回答
投稿日時: 18/06/26 16:28:20
投稿者: WinArrow
投稿者のウェブサイトに移動

補足
 
必要なんですか?
は、デフォルトで「True」になっているはず・・・・という意味

投稿日時: 18/06/26 16:50:57
投稿者: ラングドシャ

WinArrow様
 
ありがとうございます。
コピペできなくなるのです。原因が全く分からず投稿させていただきました。
 
>Application.MoveAfterReturn = True
に関しては、参考にしたサイトに載っていた通り使っていました。
ご指摘いただいた通り、なくても問題なく動作しました。

回答
投稿日時: 18/06/26 21:11:49
投稿者: simple

横から失礼。
>コピペできなくなるのです。原因が全く分からず投稿させていただきました。
仕様ということなんでしょうね。
こればっかりは、制作側がそう考えた、ということでしょうから仕方がない。
 
コピーした状態であるかどうかは、
Application.CutCopyMode で判断できます。
 
ですから、その状態の時は何もせずに抜けるなら

   If Application.CutCopyMode Then Exit Sub
などを冒頭に入れておけば、貼付ができるでしょう。
 
今回は関係ないですが、逆に、その状態のときにだけ何かしたいなら
   If Application.CutCopyMode Then 
     'なにかをする
   End If
などとします。今後、応用する機会があるかもしれません。

回答
投稿日時: 18/06/26 21:25:18
投稿者: WinArrow
投稿者のウェブサイトに移動

デフォルトで
Application.MoveAfterReturn = True
状態のところに
Application.MoveAfterReturn = True
とすると、コピペができなくなる
 
これは、バグ?ではないでしょうか?
 
仕様とは思えないが、如何でしょう?

回答
投稿日時: 18/06/26 22:53:22
投稿者: simple

仕様かバグか決めるのはむずかしいかもしれませんね。
バグかもしれません。
ユーザーがどうこうできませんね、と言い換えさせていただきます。
 
# 既に入力されているのと同じ値を入力してもイベントプロシージャが動作しますよね。
# そんなこともありますから、値の同一性は余り根拠にならないかもしれません。
# まったく関係無い話かもしれませんが。
#
# 私のは2010ですが、他のバージョンはどうなんでしょう。
# バージョンによらず安定して同じ振る舞いなんでしょうか。

回答
投稿日時: 18/06/27 08:49:29
投稿者: mattuwan44

同じく2010なので新しい情報はないのですが、
コピーモードのときオプションをいじろうとすると、
コピーモードがキャンセルされますね。
回避策としては、コピーモードのときはオプションの変更をしないで、
貼り付けた後にオプションの変更をする感じになるでしょうか?
 
Option Explicit
 
Dim mflg As Boolean
 
Private Sub Workbook_Activate()
    If Application.CutCopyMode Then
        mflg = True
    Else
        Move2Right
    End If
End Sub
 
Private Sub Workbook_Deactivate()
    Application.MoveAfterReturnDirection = xlDown
End Sub
 
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If mflg Then
        Move2Right
        mflg = False
    End If
End Sub
 
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If Application.CutCopyMode = False Then
        If mflg Then
            Move2Right
            mflg = False
        End If
    End If
End Sub
 
Private Sub Move2Right()
    Application.MoveAfterReturn = True
    Application.MoveAfterReturnDirection = xlToRight
End Sub
 
※コピーモードで、ブックを移ってから、コピーをキャンセルすると、
エンターキー押下で1回だけ下に行きます^^;
他にも考慮すべき点があるかも知れませんが、ぱっと思いつかないので^^;
この辺を参考にエクセルを制御してみてはいかがでしょうか?(アイデアの枯渇でギブアップ><)
 
まぁ、右移動はTABキー押下、
下移動はEnterキー押下ですれば、
いちいちオプションをいじる必要もなくなるのですが^^;
 
 

回答
投稿日時: 18/06/27 09:59:29
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

コピーモードのときオプションをいじろうとすると、
コピーモードがキャンセルされますね。

 
Excelのオプションの中には、
処理中に変更するとそれまでの状態を保証されないプロパテイがある・・・・ということですね。
 
なるほど、納得です。

投稿日時: 18/06/27 13:34:59
投稿者: ラングドシャ

simple様
WinArrow様
mattuwan44様
 
ありがとうございました。
仕様かバグか・・・?といったところなんですね〜
どうしようもないですね。
 
simple様 こういった場合、どのように考えるのがいいのか教えてくださり
ありがとうございます。
コピーモードであれば抜ける、というifをつけるとうまく貼り付けできました。
 
mattuwan44様 サンプルコードありがとうございました。いろいろな場面を
考慮してくださってありがとうございます。
 
これにて解決といたします。
ありがとうございました。