Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3192 / 13646 ツリー ←次へ | 前へ→

【63597】SelectionChangeが2回作動となってしまう ぴかる 09/11/20(金) 14:57 質問[未読]
【63598】Re:SelectionChangeが2回作動となってしま... Jaka 09/11/20(金) 15:18 発言[未読]
【63602】Re:SelectionChangeが2回作動となってしま... ぴかる 09/11/20(金) 16:12 発言[未読]
【63608】Re:SelectionChangeが2回作動となってしま... ぴかる 09/11/20(金) 18:11 発言[未読]
【63642】Re:SelectionChangeが2回作動となってしま... Jaka 09/11/24(火) 10:06 発言[未読]
【63644】Re:SelectionChangeが2回作動となってしま... SS 09/11/24(火) 12:09 発言[未読]
【63643】Re:SelectionChangeが2回作動となってしま... seg 09/11/24(火) 11:17 発言[未読]
【63645】アドバイスありがとうございます ぴかる 09/11/24(火) 13:23 お礼[未読]
【63648】Re:アドバイスありがとうございます ぴかる 09/11/25(水) 11:00 発言[未読]
【63649】Re:アドバイスありがとうございます SS 09/11/25(水) 12:53 発言[未読]
【63650】Re:アドバイスありがとうございます ぴかる 09/11/25(水) 14:28 発言[未読]
【63652】Re:アドバイスありがとうございます seg 09/11/25(水) 15:57 発言[未読]
【63653】申し訳ございませんでした。 ぴかる 09/11/25(水) 16:15 お礼[未読]
【63655】Re:申し訳ございませんでした。 ぴかる 09/11/25(水) 16:39 発言[未読]
【63656】Re:申し訳ございませんでした。 seg 09/11/25(水) 17:07 発言[未読]
【63657】スッキリしました。 ぴかる 09/11/25(水) 17:20 お礼[未読]
【63658】Re:スッキリしました。 SS 09/11/25(水) 18:05 発言[未読]
【63659】Re:スッキリしました。 ぴかる 09/11/25(水) 18:14 お礼[未読]

【63597】SelectionChangeが2回作動となってしまう
質問  ぴかる  - 09/11/20(金) 14:57 -

引用なし
パスワード
   15行目以降、アクティブセル表示位置が変わらぬ様、以下のマクロを作成しました。Changeイベントにて、セルをジャンプさせたりもしています。このChangeイベントにて任意セルへ行った際、SelectionChangeイベントが2回作動してしまい困っています。対処方法がございましたら、よろしくお願い致します。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

  With Target
    ActiveWindow.ScrollRow = 1
    If .Row > 15 Then
      ActiveWindow.SmallScroll Down:=.Row - 15
    End If
  End With

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)

  With Target
    If .Row = 45 Then
      Cells(58, .Column).Select
    ElseIf .Row = 58 And Cells(46, .Column).Value = "" Then
      Cells(47, .Column).Select
    ElseIf .Row = 57 Then
      Cells(46, .Column).Select
    ElseIf .Row = 46 Then
      Cells(59, .Column).Select
    End If
  End With
  
End Sub

【63598】Re:SelectionChangeが2回作動となってし...
発言  Jaka  - 09/11/20(金) 15:18 -

引用なし
パスワード
   イベントの抑制。

application.
と書き込むと、プロパティやら何やらの候補が出てくるから、
探してみてください。
その内思い出すと思います。

【63602】Re:SelectionChangeが2回作動となってし...
発言  ぴかる  - 09/11/20(金) 16:12 -

引用なし
パスワード
   Jakaさん、こんにちは。

>イベントの抑制。
>
>application.
>と書き込むと、プロパティやら何やらの候補が出てくるから、
>探してみてください。
>その内思い出すと思います。
いつもアドバイスありがとうございます。
多分、↓ですよよね。
Application.EnableEvents = False
私もこれを使おうと考えたのですが、
↓にて復活させる方法が?でして・・・
Application.EnableEvents = True

もう少し知恵を絞ってみますね。的外れでした?

【63608】Re:SelectionChangeが2回作動となってし...
発言  ぴかる  - 09/11/20(金) 18:11 -

引用なし
パスワード
   色々とトライしてみましたが、イベント抑制出来ませんでした。もうパニック状態・・・

そんでもって、カウンタを使って制御してみました。
何とか頑張って自分のやりたい事は出来ました。

イベント抑制等の別のやり方がありましたら、お教えよろしくお願い致します。
確認は、来週火曜となってしまいますが。

Dim C As Integer
Dim Frg As Boolean
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

  With Target
    If .Row > 15 And C = 0 Then
      ActiveWindow.ScrollRow = 1
      ActiveWindow.SmallScroll Down:=.Row - 15
      If Frg = True Then
        C = C + 1
      End If
    End If
  End With

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
  
  Frg = False
  C = 0
  With Target
    If .Row = 45 Then
      Frg = True
      Cells(58, .Column).Select
    ElseIf .Row = 58 And Cells(46, .Column).Value = "" Then
      Frg = True
      Cells(47, .Column).Select
    ElseIf .Row = 57 Then
      Frg = True
      Cells(46, .Column).Select
    ElseIf .Row = 46 Then
      Frg = True
      Cells(59, .Column).Select
    End If
  End With
  
End Sub

【63642】Re:SelectionChangeが2回作動となってし...
発言  Jaka  - 09/11/24(火) 10:06 -

引用なし
パスワード
   すみません。
何をやっているのかわかりませんでした。

>多分、↓ですよよね。
>Application.EnableEvents = False
>私もこれを使おうと考えたのですが、
>↓にて復活させる方法が?でして・・・
>Application.EnableEvents = True
ヘルプ見た?

>Dim C As Integer
>Dim Frg As Boolean
これってグローバル変数のつもりなのかな?
だったら、標準モジュールじゃなきゃ。

【63643】Re:SelectionChangeが2回作動となってし...
発言  seg  - 09/11/24(火) 11:17 -

引用なし
パスワード
   ▼ぴかる さん:
何がしたいのか、要求が見えないのですが
表示位置を固定させたいのでしょうか。

SelectionChange:
セルを選択しただけでイベントが発生

Change:
セル値が変化したらイベントが発生

既存のプログラム上で、セルを選択せず(既に選択されている)に
値を書き込むと。
セルが選択されたイベントと、セル値が書き換えられたイベントの
2つがキューに入ります。
流れは、こんな感じ

1.書き換えイベント発生
2.選択イベントは待機
3.書き換えイベントプロシージャ内でセルを選択
4.セルを選択したので、選択イベントが発生
5.書き換えイベントが終了し、待機していた2.の選択イベントが発生

となり、2回呼ばれる事になります。

既に答えが出ていますが、イベント無効化により2回を1回にできます。
しかし、2回呼ばれている選択イベントに入るTargetの値は別物だと
認識し、最適なプログラムを作成ください。
2.で待機してるTargetと4.で発生するTargetは別物。

Application.EnableEvents = False ' イベント無効化
Application.EnableEvents = True ' イベント有効化

【63644】Re:SelectionChangeが2回作動となってし...
発言  SS  - 09/11/24(火) 12:09 -

引用なし
パスワード
   一応これで希望の内容は実現できると思いますが
あまりスマートではないですね。
もしイメージと違うようなら入力方法もお教えいただけると
他の方から根本的な解決が得られるかもしれませんよ。

Option Explicit
Public R As Long
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Application.EnableEvents = False
  With Target
    If .Row <> R And R <> 0 Then
      Cells(R, .Column).Select
    Else
      R = .Row
    End If
  End With
  ActiveWindow.ScrollRow = 1
  If R > 15 Then
    ActiveWindow.SmallScroll Down:=R - 15
  End If
  R = 0
  MsgBox "a"
  Application.EnableEvents = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim tmp As Long
  With Target
  tmp = .Row
    If tmp = 45 Then
      R = 58
    ElseIf tmp = 58 And Cells(46, .Column).Value = "" Then
      R = 47
    ElseIf tmp = 57 Then
      R = 46
    ElseIf tmp = 46 Then
      R = 59
    End If
  End With
End Sub

【63645】アドバイスありがとうございます
お礼  ぴかる  - 09/11/24(火) 13:23 -

引用なし
パスワード
   Jakaさん、segさん、SSさん、こんにちは。

色々と貴重なアドバイスありがとうございます。只今、実務中でして内容確認は後程となってしまいます。また報告の方は、きちんとさせて頂きますね。

【63648】Re:アドバイスありがとうございます
発言  ぴかる  - 09/11/25(水) 11:00 -

引用なし
パスワード
   お世話になります。色々と皆様のアドバイスを基にトライしてみましたが、なかなかいいアイデアが浮かびません。フローチャートが描けない状態です。自分がどうの様にしたいのか伝わっていない様ですので、動作説明の方をさせて頂きます。

1.入力後のセル移動は、下方向に設定
2.16行目以降は、アクティブセルを画面の真ん中ぐらいの表示位置に固定
3.ある行位置からは、任意行位置にジャンプ
   45→58 58→47 57→46 46→59

3.の際、Application.EnableEvents = Falseを使って、2回目のelectionChangeを無効にする事は出来たのですが、それ以降のイベントを有効にするトリガが浮かばない状態で困っています。
始めに質問させて頂いた時から、ここが???でして・・・

【63649】Re:アドバイスありがとうございます
発言  SS  - 09/11/25(水) 12:53 -

引用なし
パスワード
   ▼ぴかる さん:
こんにちは、上で私の提示したもの試されましたか?
見た目はともかく、仰っている内容は実現できていると思うのですが。
動作上どこに問題があるか分かれば対応できるかも知れません。
もし3.の時点でスクロールをしたくないというのであれば

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  With Target
    If .Row <> R And R <> 0 Then
      Application.EnableEvents = False
      Cells(R, .Column).Select
      Application.EnableEvents = True
    Else
      R = .Row
      ActiveWindow.ScrollRow = 1
      If R > 15 Then
        ActiveWindow.SmallScroll Down:=R - 15
      End If
    End If
  End With
  R = 0
End Sub
でIf文内で動作条件を分ければ良いのではないでしょうか。
>3.の際、Application.EnableEvents = Falseを使って、2回目のelectionChangeを無効にする事は出来たのですが、それ以降のイベントを有効にするトリガが浮かばない状態で困っています。
セル移動によるキャンセル直後にApplication.EnableEvents = Trueで良いのではないでしょうか

>お世話になります。色々と皆様のアドバイスを基にトライしてみましたが、なかなかいいアイデアが浮かびません。フローチャートが描けない状態です。自分がどうの様にしたいのか伝わっていない様ですので、動作説明の方をさせて頂きます。
>
>1.入力後のセル移動は、下方向に設定
>2.16行目以降は、アクティブセルを画面の真ん中ぐらいの表示位置に固定
>3.ある行位置からは、任意行位置にジャンプ
>   45→58 58→47 57→46 46→59
>
>3.の際、Application.EnableEvents = Falseを使って、2回目のelectionChangeを無効にする事は出来たのですが、それ以降のイベントを有効にするトリガが浮かばない状態で困っています。
>始めに質問させて頂いた時から、ここが???でして・・・

【63650】Re:アドバイスありがとうございます
発言  ぴかる  - 09/11/25(水) 14:28 -

引用なし
パスワード
   SSさん、こんにちは。

色々とご検討ありがとうございます。もちろん試させて頂いております。
データ入力した際、1つ下のセルへの移動となりませんでした。
やりたい事は、
1.上から下へデータ入力
2.16行目以降は、表示位置を固定
3.任意セルとなった際も、2.と同じ位置に表示
です。
至らぬ事ばかりで、申し訳ございません。

【63652】Re:アドバイスありがとうございます
発言  seg  - 09/11/25(水) 15:57 -

引用なし
パスワード
   ▼ぴかる さん:

これをコピペして実行し、何が足りないのかを
詳しく発言してください。


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim currentCell As Range
  Set currentCell = ActiveCell
  
  If (Target.Row > 15) Then
    With ActiveWindow
      .ScrollRow = currentCell.Row - 15
    End With
  End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
  Application.ScreenUpdating = False
  With Target
    If .Row = 45 Then
      Cells(58, .Column).Select
    ElseIf .Row = 58 And Cells(46, .Column).Value = "" Then
      Cells(47, .Column).Select
    ElseIf .Row = 57 Then
      Cells(46, .Column).Select
    ElseIf .Row = 46 Then
      Cells(59, .Column).Select
    End If
  End With
  Application.ScreenUpdating = True
End Sub

【63653】申し訳ございませんでした。
お礼  ぴかる  - 09/11/25(水) 16:15 -

引用なし
パスワード
   SSさん、segさん、ご覧になってた皆さん、誠に申し訳ございませんでした。

お二方のお答えでOKでした。SSさんの始めのお答えもOKでした。
違うファイルにて、セルの移動が解除となったままでした。
自分のミスばかりで申し訳なかったです。本当にありがとうございました。
今から、じっくりと解読させて頂きます。

以後、こういう事のない様に気をつけていきたいと思います。
失礼致しました。

【63655】Re:申し訳ございませんでした。
発言  ぴかる  - 09/11/25(水) 16:39 -

引用なし
パスワード
   segさんのものを参考にこういうのを作ってみました。
一応、思い通りに動きます。こんな使い方でいいかは?ですが・・・
SSさんのものも今、解読中です。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

  With ActiveCell
    ActiveWindow.ScrollRow = 1
    If .Row > 15 Then
      ActiveWindow.SmallScroll Down:=.Row - 15
    End If
  End With

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
  
  With Target
    If .Row = 45 Then
      Cells(58, .Column).Select
    ElseIf .Row = 58 And Cells(46, .Column).Value = "" Then
      Cells(47, .Column).Select
    ElseIf .Row = 57 Then
      Cells(46, .Column).Select
    ElseIf .Row = 46 Then
      Cells(59, .Column).Select
    End If
  End With
  
End Sub

【63656】Re:申し訳ございませんでした。
発言  seg  - 09/11/25(水) 17:07 -

引用なし
パスワード
   ▼ぴかる さん:

目的を達成できてよかったですね^^

目的を達成できれば、それで良いのですが
可読性・保守性・柔軟性
を満たしているコードを心がけましょう^^

【63657】スッキリしました。
お礼  ぴかる  - 09/11/25(水) 17:20 -

引用なし
パスワード
   ▼seg さん:
>▼ぴかる さん:
>
>目的を達成できてよかったですね^^
>
>目的を達成できれば、それで良いのですが
>可読性・保守性・柔軟性
>を満たしているコードを心がけましょう^^
単純な動きながら、今回非常に悩みました。とても1人では解決出来ませんでした。大変勉強になりました。segさんの仰る考えを大事にして行きたいと思います。また数年前の様に回答の方にも出来る限り参加させて頂こうと思います。
皆さん、ありがとうございました。

【63658】Re:スッキリしました。
発言  SS  - 09/11/25(水) 18:05 -

引用なし
パスワード
   ▼ぴかる さん:
こんにちは、私もEnableEvents = Falseの状態でエラーストップした場合の
復旧が面倒くさかったので乱用は控えたほうが良いかもですね。
解決策についてはちょっとした変更で解決できてしまいましたね。(^^;)
seg さんのScreenUpdating を利用する方法も気が付かなかったですし
目的の実現方法は色々あるのですね。
ただちょっと気になるのがSelectionChangeが2回作動しているという点が
未解決(運用上問題ないですが)ということです。
この辺り良い解決法は、ないのですかね。

>▼seg さん:
>>▼ぴかる さん:
>>
>>目的を達成できてよかったですね^^
>>
>>目的を達成できれば、それで良いのですが
>>可読性・保守性・柔軟性
>>を満たしているコードを心がけましょう^^
>単純な動きながら、今回非常に悩みました。とても1人では解決出来ませんでした。大変勉強になりました。segさんの仰る考えを大事にして行きたいと思います。また数年前の様に回答の方にも出来る限り参加させて頂こうと思います。
>皆さん、ありがとうございました。

【63659】Re:スッキリしました。
お礼  ぴかる  - 09/11/25(水) 18:14 -

引用なし
パスワード
   ▼SS さん:
ご迷惑をお掛けしましたが、本当にありがとうございました。
未解決の箇所もありますが、何分日常業務に差し支えがあるので、
また時間がある時にでも、別案を考えてみたいと思います。
今後とも、よろしくお願い致します。

>▼ぴかる さん:
>こんにちは、私もEnableEvents = Falseの状態でエラーストップした場合の
>復旧が面倒くさかったので乱用は控えたほうが良いかもですね。
>解決策についてはちょっとした変更で解決できてしまいましたね。(^^;)
>seg さんのScreenUpdating を利用する方法も気が付かなかったですし
>目的の実現方法は色々あるのですね。
>ただちょっと気になるのがSelectionChangeが2回作動しているという点が
>未解決(運用上問題ないですが)ということです。
>この辺り良い解決法は、ないのですかね。
>
>>▼seg さん:
>>>▼ぴかる さん:
>>>
>>>目的を達成できてよかったですね^^
>>>
>>>目的を達成できれば、それで良いのですが
>>>可読性・保守性・柔軟性
>>>を満たしているコードを心がけましょう^^
>>単純な動きながら、今回非常に悩みました。とても1人では解決出来ませんでした。大変勉強になりました。segさんの仰る考えを大事にして行きたいと思います。また数年前の様に回答の方にも出来る限り参加させて頂こうと思います。
>>皆さん、ありがとうございました。

3192 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free