[[20170218152800]] 『セルの値が変化したらシート名変更■Worksheet_Ch』(マリオ) ページの最後に飛ぶ

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

 

『セルの値が変化したらシート名変更■Worksheet_Change』(マリオ)

 元トピは、こちら
 『自動化したシート名の表示形式を変更する方法』(たろう) 
[[20170218000635]]

 【やりたいこと】
 Sheet1のA1セルに「平成29年2月18日」と入力したら、シート名を「0218」に変更させる。
 次に、A1に「a」と入力したら、「その名前には変更できません」と表示されるのでOKボタンを押す。、
 A1セルの値を元に戻させる。
 次に、A1に「1」と入力したら、「その名前には変更できません」と表示されるのでOKボタンを押す。
 A1セルの値を元に戻させる。

 【知りたいこと】
 下記のSample1では、やりたいことができるのですが、
 Sample2では、できません。何故Sample2は、Sample1と動作が違うのか知りたい!
 ※Sample1とSample2の相違は、コード内で★印が付いたとこだけです。

 ■■■■■■ Sample1の説明 ■■■■■■■■■■■■■■■■■■■
 buf.xlsmのSheet1(ワークシートのコード記述欄)に次のコードを記述後に、
 上記【やりたいこと】をやってみると、その通りになります。

 Option Explicit

 '■(1)または■(2)のときに、「buf=1/0」で意図的にエラーを作って、「ERR:」に飛ばす

 Private Sub Worksheet_Change(ByVal target As Excel.Range)
     On Error GoTo ERR:
     If target.Cells(1, 1).Address = "$A$1" Then
        Application.EnableEvents = False
        Dim buf '★
        If IsDate(target) = False Then '■(1)
           Application.Undo
           buf = 1 / 0 '★
        Else
           If Year(target) < 2017 Then '■(2)
              Application.Undo
              buf = 1 / 0 '★
           End If
        End If
        Me.Name = Format(target, "mmdd")
     End If
     target.Cells(1, 1).Select
     Application.EnableEvents = True
     Exit Sub
ERR:
  MsgBox "その名前には変更出来ません。", vbCritical + vbOKOnly, "ERROR"
  Resume Next
 End Sub
 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
 _
 _
 ■■■■■■ Sample2の説明 ■■■■■■■■■■■■■■■■■■■
 go_to_ERR.xlsmのSheet1(ワークシートのコード記述欄)に次のコードを記述後に、
 上記【やりたいこと】をやってみると、
 Sheet1のA1セルに「平成29年2月18日」と入力したら、シート名は「0218」に変更されます。
 ですが、 
 A1セルに「a」を入力すると、「その名前には変更できません」と表示され、
 OKボタンを押すと、もう一度「その名前には変更できません」と表示される。
 OKボタンを押すと、A1セルには、「平成29年2月18日」と表示されているが、
 A1セルに、もう一度「a」を入力すると、A1の表示が「a」になり、シート名は、「0218」
 のまま。A1セルに「2017/2/19」と入力すると、
 A1セルには、「平成29年2月19日」と表示されるが、シート名は「0218」のままで、
 「0219」には変更されない。

 Option Explicit

 '■(1)または■(2)のときに、「GoTo ERR」で、「ERR:」に飛ばす

 Private Sub Worksheet_Change(ByVal target As Excel.Range)
     On Error GoTo ERR:
     If target.Cells(1, 1).Address = "$A$1" Then
        Application.EnableEvents = False
        If IsDate(target) = False Then '■(1)
           Application.Undo
           GoTo ERR '★
        Else
           If Year(target) < 2017 Then '■(2)
              Application.Undo
              GoTo ERR '★
           End If
        End If
        Me.Name = Format(target, "mmdd")
     End If
     target.Cells(1, 1).Select
     Application.EnableEvents = True
     Exit Sub
ERR:
  MsgBox "その名前には変更出来ません。", vbCritical + vbOKOnly, "ERROR"
  Resume Next
 End Sub
 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 このようにマリオさんのトピとして質問を投げかけられたほうがすっきりしますね。

 私自身は、GoTo記述をしないので、Resume の動き、あまり詳しくないのですが
 両方のコードの先頭にブレークポイントを設定して、a や b をいれて F8 を押しながら実行していきますと
 Sample1 と Sample2 では、Resume Next の後の実行コードが異なっていますよね。
 Sample1 では エラーが発生した If句のEnd If の下、Sample2 では MsgBox にいきます。

 で、Sample2 では、そのあとの Resume Next でその下のEnd Sub にいって 結局 Application.EnableEvents は
 True に戻らず False のままになるという おまけつきですね。

 Sample1 と Sample2 の違いは エラーが発生して On Error GoTo ERR に従ってとんでいったのか

 エラー発生していないのに GoTo ERR で強制的にとんでいったのかの違いですね。

 (通常 エラー発生していないのに Resume Next をかけると エラーになってしまうと理解してたんですが)

 エラー発生していないときの ReSume Next の動きについては、よくわからないので

  いずれにしても 詳しくないので専門家さんからの回答をお待ちください。

( β) 2017/02/18(土) 16:09


 ご提示のコードは精読しておりません。

 Sample2は、要するにこれと同じですよね?

 Sub aa()
     On Error GoTo ERR
     GoTo ERR     
     Exit Sub     
 ERR:
     Debug.Print "その名前には変更出来ません。"
     Resume Next
 End Sub

 この現象が理解できるか、出来ないか、じゃないですか?

 他所で同じような議論があり、チオチモリンさん(専門家なのかも)
 が色々と「On Error」絡みの解説されていました。

 【on error が効かない】
http://excelfactory.net/excelboard/excelvba/excel.cgi?mode=all&namber=180132&rev=0

(半平太) 2017/02/18(土) 16:16


 1つ発見(マリオさんの質問の答えにはなりませんが)

 標準モジュールの Test1 を実行するとエラー発生していないので、Resume Next が エラーになりますが
 Test2 つまり、先頭に On Error GoTo Err が記述されていると、エラーにはならないんですね!

 Sub Test1()
    GoTo err
err:
    Range("A1").Value = 1
    Resume Next
 End Sub

 Sub Test2()
    On Error GoTo err
err:
    Range("A1").Value = 1
    Resume Next
 End Sub

( β) 2017/02/18(土) 16:18


こっちのほうが理解しやすいかもしれません。

 Sub Test3()
    On Error GoTo ERR
ERR:
    MsgBox ERR.Number
    Range("A1").Value = Range("A1").Value + 1
    Resume Next
 End Sub

(マナ) 2017/02/18(土) 21:40


 βさん、半平太さん、マナさん

 コメント頂きまして、ありがとうございます。
 じっくり、確認作業しております。
 回答に、もうしばらくお時間かかりそうです。
(マリオ) 2017/02/20(月) 20:17

出遅れましたが、後付け解説なぞ。

On Error Goto 文は、Goto ではない、という事を理解してください。GoToは単なる行ジャンプ命令ですが、On Error Goto はエラー割り込み命令なのです。今風の言語で書くと、Catch、Try の使い方に相当します。 Catchで記述したエラー割り込みルーチンに、GoToで無理矢理飛び込んではいけませんよね。

なので、On Error Goto の飛び先を、普通のGoToで利用してはいけません。割り込み処理のカウントが一致しなくなってしまいますから、何度も繰り返すとスタック関係のエラーでハングアップしてしまう可能性があります。

普通のGoTo文でエラー時ラベルに飛ばすのは論外。わざとエラーを起こしてエラー時割り込みルーチンで表示させるのは、正常なのにエラー処理を使うという、汚い方法だと思いますよ。
(???) 2017/02/21(火) 12:02


 >βさん
 >両方のコードの先頭にブレークポイントを設定して、a や b をいれて F8 を押しながら実行していきますと
 >Sample1 と Sample2 では、Resume Next の後の実行コードが異なっていますよね。

 いきなり、つまずいています。ブレークポイント操作で!
 stopステートメントとDebugは、よくやるのですが、
 ブレークってやらないんですよね(ウォッチ式もやらないな〜)。

 先頭行で、F9(またはデバックtabのブレークポイントの設定/解除)ボタンを押すと、
 行が茶色く塗りつぶされて、左側に茶色の●が表示されます。そこから、
 どんな操作をするんでしょうか?教えてください。わかりません。
 _
 _
 >半平太 さん
 コメントありがとうございます。
 On Error は、いつもは、下記のような使い方しかしません。
 Resume Nextは、使わないんですよね。いつも。
 ************************************************************
    On Error GoTo myError
       ■エラーがおきそうな行
    On Error GoTo 0

myError:

   ■後処理を記述している行(End Subの直前に記述)
End Sub
  ************************************************************
 _
 _
 >マナ さん
 わかりやすいですね。ありがとうございます。
 A1に日付(2017/2/21)を入れておいて、マナさんのtest3を実行すると、
 0→20と2回msgboxが表示されますね。
 ■エラー番号について
http://officetanaka.net/Excel/vba/error/execution_error/index.htm
 0:エラーじゃありません
 20:エラーが発生していないときに Resume を実行することはできません
 ですね。
 「Resume Next」を「On Error GoTo 0」と記述すると、0と1回だけmsgboxで表示されますね。

 エラーでない状態でResume Nextの行に来てしまったらエラーになり、 ERR:に戻って、
 msgboxを表示したのですね(2回目は、20のエラー番号)。
 _
 _
 ??? さん
 >On Error Goto の飛び先を、普通のGoToで利用してはいけません
 はい、そんな記述はダメと、とりあえずは覚えておけばいいんですかね。

 今回のSample1とSample2はともに「Resume Next」を使ったコードで、下記の★(1),★(2),★(3),★(4)をセットでつかってますね。
 ******************************************
  Sub test4
     On Error GoTo ERR:'★(1)
        ■処理1   
     Exit Sub'★(2)
ERR:'★(3)
    ■処理2
     Resume Next'★(4)
 End Sub
  ******************************************

  >わざとエラーを起こしてエラー時割り込みルーチンで表示させるのは、
  >正常なのにエラー処理を使うという、汚い方法だと思いますよ。
  そうですね(^^♪ 汚い姑息なやり方ですね。
  下記のSample3では、上記test4の★(1),★(2),★(3),★(4)を記述せずに、記述してみました。
 この場合のオーバーフロー対策は、どう記述したらいいんでしょうかね???
 A1セルに「7777777」と7を7回入力したら、オーバーフローしてしまいます。
 大きすぎる日付と判断されるみたいで。
 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
 'Sample3
 Private Sub Worksheet_Change(ByVal Target As Range)
     Dim msg As String, z As Variant

     If Target.Cells(1, 1).Address = "$A$1" Then
        If IsDate(Target) = False Then
           On Error GoTo step1 'オーバーフロー対策
           z = Target.Value
           On Error GoTo 0
           msg = "日付ではありません" & vbCrLf & _
                 "(入力値: " & z & ")"
           GoTo step1 '★
        Else
           If Year(Target) < 2017 Then
              z = Target.Value
              msg = "2017年以前の日付です" & vbCrLf & _
                    "(入力値: " & z & ")"
              GoTo step1 '★
            End If
        End If

        Dim x As String
        x = Format(Target, "mmdd")
        Dim sh As Worksheet
        For Each sh In ThisWorkbook.Sheets
            If sh.Name <> ActiveSheet.Name Then
               If sh.Name = x Then
                  msg = "他のシートですでに使用されている名前です"
                  GoTo step1'★
               End If
            End If
        Next sh
        Me.Name = Format(Target, "mmdd")
        Target.Cells(1, 1).Select
     End If

     Exit Sub
step1: '★
     Application.EnableEvents = False
     Application.Undo
     Application.EnableEvents = True
     MsgBox "その名前には変更出来ません。" & vbCrLf & vbCrLf & _
            msg, vbCritical + vbOKOnly, "ERROR"
 End Sub
 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

 とりあえず、Sample3の書き方ができたので、よしとします。
 皆様、ありがとうございました。
 βさん、ブレークポイントの操作だけ教えてください。
 (あわせて、ウォッチ式についても、教えて頂けると助かります。)
 今回の例とは別のサンプル使用でもよいので。
  別のトピックを設けた方がいいですかね?
 【ブレークポイントとウォッチ式の使い方】で!  

(マリオ) 2017/02/21(火) 19:24


 >>ブレークポイントの操作
 >>ウォッチ式

 いやぁ、教えるというほどのものではないです。

 茶色のポイント、これは Stop と同じで、実行中、コードがそこに来たら止まりますので
 あとはステップ実行するなり、ローカルウィンドウを見るなり、イミディエイトウィンドウで
 様々な確認をするなり、といったものです。

 ブレークポイントが指定コードに到達すれば無条件に止まるというのに対し ウォッチ式は
 たとえば、ループの中で i という変数が100になったら止まるといった指定をしておくといったものです。

 私がもたもたとコメントするより、『VBA デバッグ方法』あたりで出てくるページ、どれも、わかりやすく
 図解されているものが多いので参照願います。

 追記です。(2/22 6:16)

 >両方のコードの先頭にブレークポイントを設定して、a や b をいれて F8 を押しながら実行していきますと

 文章が中途半端でしたね。

 両方のコードの先頭にブレークポイントを設定して、a や b をいれて『から マクロを実行し、とまったら』 F8 を押しながら実行

 ということです。

( β) 2017/02/21(火) 22:22


 ところで

 >この場合のオーバーフロー対策は、どう記述したらいいんでしょうかね???
 >A1セルに「7777777」と7を7回入力したら、オーバーフローしてしまいます。
 >大きすぎる日付と判断されるみたいで。

 オーバーフローしますか??

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim z As Variant
    MsgBox IsDate(Target)
    z = Target.Value

 End Sub

 こんなコードで 7777777 といれても問題ないですが??

 それとは別に、アップされたコードはマリオさんの機能検証のためのコードですけど
 もし、本番コードであれば、この形はとりたくないですね。

 つまり、If Target.Cells(1, 1).Address = "$A$1" Then

 複数セル入力時(領域クリアやコピペ等)これだと、何もされないで
 終了します。

 A1 は日付であることが要求されるシート仕様であれば、何もされない結果
 A1 が abc であっても、そのまま入力されてしまう可能性があり、
 シートのセルの値としての整合性がくずれてしまいますから。

( β) 2017/02/22(水) 08:48


>ブレークポイントの操作だけ教えてください。
> (あわせて、ウォッチ式についても、教えて頂けると助かります。)

参考URL>
http://www.ken3.org/vba/excel-help.html

on error 〜 の参考コード>
うまく言葉にならないけど、出口を2つ設ければいいんじゃないかな。。。
(つまり、Resumeしない。)

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim sProm As String
    If Target.Address(False, False) <> "A1" Then Exit Sub

    sProm = "その値は正しくありません。"
    If IsDate(Target.Text) Then
        sProm = "既にそのシート名は存在しています。"
        On Error GoTo WayOut
        Me.Name = Format(Target.Value, "mmdd")
        Exit Sub
    End If

WayOut:

    MsgBox sProm, vbCritical
    Application.EnableEvents = False
    Application.Undo
    Application.EnableEvents = True
End Sub

セルに入力するならエクセル君が勝手に日付として判断して
表示形式を変えてしまうから、
敢えて、セルの表示形式を「日付」にするか、
「文字列」にするかして、表示された文字列が、
日付に変換可能かで条件分岐してみました。

あと、エクセルの標準機能の「データの入力規則」で、
入力値を日付にしてしまうのも有効かもしれませんね。試してないけど。。。

(まっつわん) 2017/02/22(水) 09:13


マリオさんのコード例だと、ValueでなくValue2プロパティを利用する事で、日付型なのにあり得ない値のせいでオーバーフローしてしまう現象を回避すべきかと思います。(滅多にValue2は使わないのですが、今回のように日付型判定が問題になる場合に使えます)

あと、Goto step1 も無くして、代わりにサブプロシジャとした方がすっきりするかと思いますよ。(msg変数が引数に変わる)
(???) 2017/02/22(水) 09:57


書き忘れ。別のセルに値を書いておいて、範囲コピーしてからA1セルを含む範囲にペーストする事を想定していないように見えました。

あとデバッグ方法について補足なぞ。

ブレークポイントはワンクリックで設定できて便利ですが、ループ変数が特定の値になったとき…、とかは面倒ですよね。 なので私は、以下のような1行を追加して実行する事が多いです。

        If i = 100 Then Stop

ウォッチ式は、変数の変化を見るためというより、オブジェクトのプロパティ構造を調べたい場合によく使います。
変数を見るならば、イミディエイトウィンドウで、以下のように打ち込むほうが楽に感じるもので。

 for z=0 to 99:?idim(z):next
(???) 2017/02/22(水) 10:07

 To ???さん

 後学のために、教えてください。

 イミディエイトウィンドウに、ちょこちょこっとコードを打ち込んで確認するということは
 まるまる確認コードをプロシジャとして書く必要がないので、私も重宝していますが、私が申し上げたのは

 たとえば、行番号を i にいれたループ処理があって、結果が、行番号 100 のものに関しておかしなものになる。
 コードはあれやこれやとやっているので、どこにバグがあるのか、追いかけづらい。

 そういったときに i = 100 を設定して 式の値が True のときに止まるようにしておいて
 とまった時点でゆっくりとローカルウィンドウを見て、様々な関係する変数の値を確かめて
 バグをつぶす といったことをやっているのですが、お書きになられた

 for z=0 to 99:?idim(z):next

 といったものを打ち込むと、そういったことができるということでしょうか?

 (もちろん、コードの適切な場所に i が 100 なら Stop と直接書きこむこともありますが)

 もう1つ、教えてください。

 オブジェクトのプロパティ構造については、私は今まで、プロシジャ内の適切な場所にふつうにブレークポイントを設けて
 とまったら、ローカルウィンドウで調べていましたけど、ウォッチ式を使うと、より簡単に調べることができるということでしょうか?

( β) 2017/02/22(水) 11:10


ウォッチで止めてももちろんOKです。ローカルウィンドウは、設定しなくとも変数を列挙し、ツリー表示できて便利です。
が、私の場合、画面が狭いので、これらを出しっ放しではソースが見られないのですよ。なので、CTRL+Gで必要なときにはすぐ表示できるイミディエイトウィンドウをよく使っているし、条件で止める場合はそれすら使っていない、という訳です。

ウォッチでオブジェクトを見るのは、ローカルウィンドウに変数が多数並んでいる中から探したり、いま何を見たいのだっけ?、とかならないためですね。 変数名のメモ代わり? まぁ、スムースにデバッグできれば、慣れた方法でよろしいかと思います。
(???) 2017/02/22(水) 12:02


 >βさん
 ローカルウィンドウって便利ですね!使ってませんでした。
 ブレークポイントを設定後に、プログラムを実行して、ローカルウィンドウで確認ですね!
 ステップ実行は、あまり使わないかも。次のサイト見てみましたが。
http://www.239-programing.com/excel-vba/basic/basic023.html
 _
 _
 >a や b をいれて

 この場合、A1セルに「a や b」の値を入れて(から、)ってことですよね。
 _
 _
 >こんなコードで 7777777 といれても問題ないですが??

 A1の表示形式が、次のようになっているときは、
 MsgBoxでFalseと表示された後に、オーバーフローしてしまいます。
 短い日付形式のときも同じ。
 *****************************
 [$-411]ggge"年"m"月"d"日"
 *****************************
 _
 _
 >もし、本番コードであれば、この形はとりたくないですね。
 そうですね。変更することにしました。
 **********************************************
 If Target.Cells(1, 1).Address = "$A$1" Then
 〜
 End If
 **********************************************
 の2行を削除した後に、次の2行を、始めのDim宣言の前に追加することにしました。領域クリアやコピペ等に対応するため。
 *********************************************
 If Target.Count > 1 Then Exit Sub
 If Target.Address <> "$A$1" Then Exit Sub
 **********************************************
  ちなみに、Target.Cells(1, 1).Select の行は削除しました。
(マリオ) 2017/02/22(水) 15:18

 ??? さん
 >マリオさんのコード例だと、ValueでなくValue2プロパティを利用する事で、
 >日付型なのにあり得ない値のせいでオーバーフローしてしまう現象を回避すべきかと思います。
 >(滅多にValue2は使わないのですが、今回のように日付型判定が問題になる場合に使えます) 

 うわぁ、Target.ValueをTaget.Value2にするのですね!!!
 ******************************************
           On Error GoTo step1 'オーバーフロー対策
           z = Target.Value
           On Error GoTo 0
 ******************************************
 を次のように記述したら、オーバーフローしなくなりました。
 ******************************************
            z = Target.Value2
 ******************************************

 >以下のような1行を追加して実行する事が多いです。 
 >If i = 100 Then Stop
 Stopに、条件文つけて記述したことなかったです。Forループ内では便利ですね。

 >ウォッチ式は、変数の変化を見るためというより、オブジェクトのプロパティ構造を調べたい場合によく使います。 
 オブジェクトを一切使用してないときは、ウォッチ式はあまり役に立たないのかな?

 >イミディエイトウィンドウで、以下のように打ち込むほうが楽に感じるもので。 
 >for z=0 to 99:?idim(z):next
 ハテナです、???さん(^^♪
 イミディエイトウィンドウに打ち込むって、どういうことでしょうか?
 コードに、Debug ■と書いて、イミディエイトウィンドウで確認する
 使い方しかしたことないのですが?
 ********************
 for z=0 to 99
  ?idim(z)
 next z
 ********************
 のことでしょうか???「?idim(z)」は、何を表しているのでしょうか?

(マリオ) 2017/02/22(水) 15:18


 >まっつわん さん
 >「データの入力規則」で、入力値を日付にしてしまうのも有効かもしれませんね。

 そうですね。つまらないコード書くより、よっぽどいいですね。
 日付(2017/1/1〜9999/1/1)のデータの入力規則をA1セルに設定してみました。
 これなら、次のSample4で十分ですね。On Error使わずに済みます。
 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
 Option Explicit

 'Sample4

  Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Target.Address <> "$A$1" Then Exit Sub

    Dim sh As Worksheet, msg As String
    For Each sh In ThisWorkbook.Sheets
        If sh.Name <> ActiveSheet.Name Then
           If sh.Name = Format(Target, "mmdd") Then
              msg = "他のシートですでに使用されている名前です"
              Call Err終了(msg)'★
           End If
        End If
    Next sh
    Me.Name = Format(Target, "mmdd") '★シート名を変更
 End Sub

 Private Sub Err終了(ByVal msg As String)
     Application.EnableEvents = False
     Application.Undo
     Application.EnableEvents = True
     MsgBox "その名前には変更出来ません。" & vbCrLf & _
            msg, vbCritical + vbOKOnly, "ERROR"
     Application.CutCopyMode = False'★コピペしていたら解除
     End '★終了
 End Sub
 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

(マリオ) 2017/02/22(水) 15:19


 表示書式とオーバーフローの件、了解。

 >イミディエイトウィンドウに打ち込むって、どういうことでしょうか?

 ?調べたいもの

 と打ち込むということでしょうね。

 私がよく使っているのは

 ?Application.EnableEvets  なんか。

 for z=0 to 99:?idim(z):next は、よくわかりませんが、for z=0 to 99:?z:next なんて打ち込むと
 変数 z の値がどどどどっと表示されますね。

( β) 2017/02/22(水) 15:41


idimは私がよく使う整数配列変数名だというだけです。見たい配列変数とか指定してみてください。

? は、イミディエイトウィンドウ上では Debug.Print 命令の短縮形として使えます。過去のBasic言語でも、? は Print命令の短縮形として使えたので、これに習った実装なのでしょう。 ループ変数は、メインのプロシジャでは使わないものを使います。iとか指定すると、プロシジャ内の変数値が変わっちゃいますので。 で、単純変数や定数の値を見るときに使うだけでなく、マルチステートメントも使えてしまうので、配列内をまとめて列挙、なんて事もできますよ〜、という事です。 配列が大きい場合、途中から途中まで表示とかも可能。
(???) 2017/02/22(水) 17:01


「データの入力規則」で、入力値を日付にしてしまうのも有効かもしれませんね。

むー試してみたら、
不正値を入れるたびにイベントの発生が溜まって、
制御が難しいですねー

まぁ、何回イベントが発生しようが結果が得られればいいなら、
気にすることはないのかも知れませんが。。。

(まっつわん) 2017/02/22(水) 17:14


 >βさん
 >私がよく使っているのは
 >?Application.EnableEvets  なんか。

 「?Application.EnableEvets  なんか。」
 とありますが、「なんか。」って例えば、どんなことを書くんでしょうか?

 「イミディエイトウィンドウ」内に直接、
 「?Application.EnableEvets」と記述して、Enterキーを押すと、
 次のようになりますね。
 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
 実行時エラー '438';
 オブジェクトは、このプロパティまたはメソッドをサポートしていません。
 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

 >for z=0 to 99:?z:next なんて打ち込むと
 >変数 z の値がどどどどっと表示されますね。

 そうですね。0〜99までの数字が、改行されて表示されました。
 こんな使い方があるのですね。イミディエイトウィンドウ

 例えば、

 Sub test()
    Dim x As Long
    x = 123
    Debug.Print x
    Stop'★
    x = 456
 End Sub

 を実行した後、イミディエイトウィンドウを開いたら、
 「123」と表示される。
 次行に、「x?」と打ち込んでから、Enterキーを押すと、
 「123」と表示されるのですね。

(マリオ) 2017/02/22(水) 18:07


 >???さん
 >idimは私がよく使う整数配列変数名だというだけです。見たい配列変数とか指定してみてください。 
 >ループ変数は、メインのプロシジャでは使わないものを使います。
 >iとか指定すると、プロシジャ内の変数値が変わっちゃいますので。 

 了解しました。
(マリオ) 2017/02/22(水) 18:20

 >まっつわん
 イベントの発生が溜まっていることは、何処で確認できるのでしょうか?
(マリオ) 2017/02/22(水) 18:21

あれ、書いたつもりがプレビューで満足しちゃったかな^^;

セルに不正な値を入れてから、日付を入れて確定させてマクロ起動するんですが、
セルに入力中はマクロは起動出来ないので、
Enterキー押した回数、マクロの起動待ちになってるみたいです。

> Private Sub Worksheet_Change(ByVal Target As Range)
にブレークポイントおいておいて、
ステップ実行で、
End Sub
まで行ったら終わるはずが、また
Private Sub Worksheet_Change(ByVal Target As Range)
が始まります。
そういう現象が2〜3回繰り返されることが確認出来ると思います。

繰り返されたところで、セルの値が変わるわけではないので、
何回やっても問題ないかも知れませんが、
不正値を入力後、気が変わって、空白にしてセルを移動したときに、
空白のシート名は付けれないのでエラーになると思います。
まぁ、空白の時は空白で例外処理を書けばいいのですが、
複数個起動したイベントを制御したいと思うと結構むずかしいなと。。。

(まっつわん) 2017/02/22(水) 19:28


 >まっつわん

 あまり気にならないから、いいかも。コメントいただきまして、ありがとうございます。
(マリオ) 2017/02/23(木) 19:45

コメント返信:

[ 一覧(最新更新順) ]


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