[[20060630101935]] 『セルを入力しはじめるイベント』(タニ原) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セルを入力しはじめるイベント』(タニ原)
 マクロでセルにカーソルをもってきて、F2を押したときのイベントは何かとれますでしょうか。
 セルに入力しはじめるイベントするときでもよいのですが、
 Worksheet_Changeイベントでは遅すぎるので、入力開始時のイベントをとりたいです。


 Worksheet_SelectionChange イベントで取得できませんか?
 (seiya)

  (seiya)さんありがとうございます。
 Worksheet_SelectionChange イベントを使っていたのですが、
 セルを移動しないで、もう一度F2を押したときなどは
 SelectionChangeイベントがはしらないようなので
 他に何かないかと思いまして。(タニ原) 

 何をなさりたいのかよくわかりませんが...
 Activeなセル(Target)をもう一度Activeにする、という事ですか?

 KeyDownイベントは無かったような...
 (seiya)

 わかりづらくてごめんなさい。こちらのページを良く拝見してるのですが、
 こちらの投稿を参考に、わたしも同じような悩みがあったので、やってみたいと思ったのですが。

[[20060627165522]]『マクロで保存したあとに、、』(タンバリン)

 こちらの投稿の最後にあったように、BeforeCloseイベントで行うと、
 最後保存したくないときも、必ず保存しないと閉じられないという現象がでてきました。
 私なりに考えてみて、BeforeSaveイベントでシートを保護して、
 SelectionChangeイベントで保護を解除するというアレンジを加えてみたのですが、
 保存したあとに、別のセルに移動したときはこれでうまくいっていたのですが、
 保存した後、今カーソルがあたっているそのセルにまた入力したいと言う時だけ、
 うまくいかない現象が発生したのです(;_;)。(タニ原)


 もし「マクロを有効に開かせたい」が目的ならば、

 1) ダミーシートを作成
 2) BeforeCloseイベントで ダミーシートだけ表示して、他のシートは非表示
 3) Workbook_Open イベントでダミーシートを非表示にして、他を表示

 こんな方法もありますね
 (seiya)

 (seiya)さん、新しい方法教えてくださってありがとうございます。
 2)ではSaveをしないとだめでしょうか。(タニ原)


 Saveする、しない は影響ないでしょう。(seiya)

 (seiya)さんありがとうございます。以下のようなコードを書いたのですが、
 マクロを有効にして、編集をして保存したあと、
 最後に 閉じるときに 保存しますか?ときかれて
 「はい」を選択すると、次にマクロを無効で開くときちんとダミーが出てるのですが、
 「いいえ」を選択すると、次にマクロを無効で開くと、
 本物が表示されてしまうようなのですが。
 やり方が間違っていますでしょうか。(タニ原)

 Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Worksheets("本物").Visible = False
    Worksheets("ダミー").Visible = True

 End Sub

 Private Sub Workbook_Open()

    Worksheets("本物").Visible = True
    Worksheets("ダミー").Visible = False

 End Sub


 試す前に、一度このブックを保存してありますか?
 (seiya)

 はい。一度保存しています。
 本物シートに編集して保存、その後以下のようになります。(タニ原)
 ↓
 >その後、閉じるときに 保存しますか?ときかれて
 >「はい」を選択すると、次にマクロを無効で開くときちんとダミーが出てるのですが、
 >「いいえ」を選択すると、次にマクロを無効で開くと、
 >本物が表示されてしまうようなのですが。


 やはりBeforeSaveにしないといけないようですね....
 (seiya)

 (seiya)さん、ありがとうございます。変なことをきいてしまってすみません。
 Worksheet_SelectionChangeイベントに記載して、
 保存したあと、もしまた同じセルに入力したいときは、
 一旦、別のセルを選択してから入力するよう、ファイル使用者に促して見ます。
 マクロを無効に開かれて、変な風にされるよりはよいので。
 ご面倒なことお願いしてしまいすみませんでした。(タニ原)


 まだ見られてるかどうかわかりませんが、試行錯誤してみました。
 こんなんでいいのかなあ。
 ThisWorkbookに貼り付けてください。
 新規ブックに貼り付けたときの動きは試してないので、既存のブックに貼り付けてください。 

 Option Explicit
 Dim Flg As Boolean
 Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Flg = True Then
        Exit Sub
    End If
    If ThisWorkbook.Saved = False Then
        Select Case MsgBox("'" & ThisWorkbook.Name & "'への変更を保存しますか?", (vbYesNoCancel + vbExclamation))
            Case vbYes
                Call ProtectSave
                Flg = True
                ThisWorkbook.Close False
            Case vbNo
                Flg = True
                ThisWorkbook.Close False
            Case Else
                Cancel = True
        End Select
    End If
 End Sub

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Call ProtectSave
    ActiveSheet.Unprotect
    Cancel = True
 End Sub

 Private Sub Workbook_Open()
   ActiveSheet.Unprotect
 End Sub

 Private Sub ProtectSave()
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    Application.EnableEvents = False
    ThisWorkbook.Save
    Application.EnableEvents = True
 End Sub

 (やっちん)

 (やっちん)さんできました。どうもありがとうございました!
  (seiya)さん、(やっちん)さん 本当にいろいろな案をご検討くださり
 ありがとうございました。とても助かり、また勉強になりました。(タニ原)


 改良しました。
 Option Explicit
 Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If ThisWorkbook.Saved = False Then
        Select Case MsgBox("'" & ThisWorkbook.Name & "'への変更を保存しますか?", (vbYesNoCancel + vbExclamation))
            Case vbYes
                Call ProtectSave
                ThisWorkbook.Saved = True
            Case vbNo
                ThisWorkbook.Saved = True
            Case Else
                Cancel = True
        End Select
    End If
 End Sub

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Call ProtectSave
    ActiveSheet.Unprotect
    ThisWorkbook.Saved = True
    Cancel = True
 End Sub

 Private Sub Workbook_Open()
   ActiveSheet.Unprotect
   ThisWorkbook.Saved = True
 End Sub

 Private Sub ProtectSave()
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    Application.EnableEvents = False
    ThisWorkbook.Save
    Application.EnableEvents = True
 End Sub

 (やっちん)

(やっちん)さん、改良ありがとうございました。
 Flgをやめて Saved プロパティを使用するように変更されたのですね。
 ありがとうございました。(タニ原)


 Flgは苦肉の策だったので(^^;
 ThisWorkbook.Saved = Trueにすると
 保存するかどうかのMSGBOXが表示されないことに気付いたので直しました。
 もう2箇所、ブックのオープンとセーブのみの場合にも
 ThisWorkbook.Saved = Trueにしています。
 (やっちん)


 (やっちん)さん、ありがとうございました。
 おかげで、使用者にマクロを無効で開いて編集されることが
 これでなくなりました。本当にありがとうございました。(タニ原)


 私のコードは保護のときにパスワードの設定まではしてませんが
 その辺りは大丈夫でしょうか?
 タニ原さんがご自分でカスタマイズされてそうな気もしますね(^^
 (やっちん)

(やっちん)さん、細かいところまで配慮ありがとうございます。
 パスワード等の設定も大丈夫です。
 どうもありがとうございました。(タニ原)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.