|
|
| Excel VBA Macro ・ 行列操作 ・ FAQ |
|
カーソル制御マクロが思いどおりに動かないが?
|
|
|
|
Question 57.2 |
|
 |
 |
|
|
この年になってから、VBAを始めたのでまだ不慣れですが、その中で「すぐに役立つエクセルVBAマクロ集」は大変勉強になります。
質問は、カーソル制御マクロですが、本当は
D36:G36 → L36:M36 → D37:G37 → L37:M37 → B41:C41 → E41:G41 → L41:M41 → E42:G42 → ・・・
のように想定して作ったつもりですが、Enterキーを押下した実際の動きは
D36:G36 → L36:M36 → D37:G37 → L37:M37 → B41:C41 → D37:G37 → L37:M37 → B41:C41 →
のようにループしてしまいます。B41:C41にカーソルがある状態で、そのセルをマウスでクリックすると正常な動きをします。何か対策がありましたら、教えてください。マクロは次のとおりです。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Col As Integer
Dim Row As Integer
Dim ColPos As String
If flg = 1 Then
Exit Sub
End If
Select Case Target.Row
Case 36, 37
Select Case Target.Column
Case 1 To 3
ColPos = "D" & Target.Row
Range(ColPos).Select
Case 4 To 7
Case 8 To 11
ColPos = "L" & Target.Row
Range(ColPos).Select
Case 12, 13
Case 14 To 20
If Target.Row = 36 Then
Range("D37").Select
Else
ActiveWindow.ScrollRow = 39
Range("B41").Select
End If
Case Else
Range("D36").Select
End Select
Case 41 To 47
Select Case Target.Column
Case 1
ColPos = "B" & Target.Row
Range(ColPos).Select
Case 2, 3, 5 To 7
Case 4
ColPos = "E" & Target.Row
Range(ColPos).Select
Case 8 To 11
ColPos = "L" & Target.Row
Range(ColPos).Select
Case 12, 13
Case 14 To 20
If Target.Row = 47 Then
ActiveWindow.ScrollRow = 49
Range("B51").Select
Else
ColPos = "B" & Target.Row + 1
Range(ColPos).Select
End If
Case Else
Range("B41").Select
End Select
End Select
End Sub
|
|
Answer |
Copyright (C) 2003.1.23 永井善王 |
|
|
53才で始められたとのことですが、私宛に質問等なさった方々の層別分析(2001.1〜11月)によりますと、35才以下の方が 33%、36〜45才 37%、それ以上 30%(最高齢 70才代)でして、皆さま頑張っておられるようです。私自身はもう還暦が過ぎ、どうせやるなら楽しく! と心掛けています。
さて、カーソル制御とありますが、1つのセルへデータを入力中にそのセルの中でカーソルが1文字分ずつ移動することを言っているのではなく、1つのセルへ入力が終わったときに次にどのセルを選択するかを制御することを言われていますね。

再現テストをするために、左図のワークシートを作成して、そのコード画面に質問文にあるマクロコードを貼り付け、テスト用のブックを作成しました。
質問文にはExcelの設定状況が示されていませんが [入力後にセルを移動する方向] は [右] ということで、よろしいようですね。
緑色の線で囲んだセル範囲が 2カ所あります。あなたの希望は、上の枠内の左上角から右方向へ、赤色セル→(色なしセルを飛ばして)青色セル→(次行)黄色セル、その後も同様に赤→青→黄色と下の枠の M47セルまで 1つずつ順に選択して、最後に B51セルを選択して終わることですね。
テストの進め方は、マウスでD36セルを選択した後に、[Enter]キーを押しては選択されたセルを確認する作業を繰り返しました。その結果、C41セルの次に選択されたのは (D41セルでなく) 正しい E41セルで、その後も異常なく進んで正常に終了し、不具合が再現できませんでした。
私の操作方法がまずかったかも知れないので、そのブックを ここからダウンロード (YNxv946.xls 27KB) できるようにしておきました。もう一度、お試しくださいませんか。
|
|
|
1.
早速のご回答ありがとうございました。確かに作成していただいたテスト用ブックでは正常のようです。ただし、舌足らずでしたが、下記のように結合セルと自動計算領域(数式)の組合せです。

結合セル A36:C36(タイトル) D36:G36(入力域) H36:K36(タイトル) L36:M36(入力域) A37:C37(タイトル) D37:G37(入力域) H37:K37(タイトル) L37:M37(入力域)
計算領域 A38:C38(タイトル) D38:G38(計算域 =SUM(D36:G37) ) H37:K37(タイトル) L38:M38(計算域 =SUM(L36:M37)) N37:S37(計算域 =D38-L38)
結合セル B41:C41(入力域) E41:G41(入力域) H41:K41(タイトル) L41:M41(入力域)
結合セル B42:C42(入力域) E42:G42(入力域) H42:K42(タイトル) L42:M42(入力域)
・ ・ ・ ・ ・
結合セル B47:C47(入力域) E47:G47(入力域) H47:K47(タイトル) L47:M47(入力域)
計算領域 A48:C48(タイトル) D48:G48(計算域 =SUM(E41:G47) ) H48:K48(タイトル)
L48:M48(計算域 =SUM(L41:M47)) N48:S48(計算域 =D48-L48)
以上、面倒ですが上記の環境です。テスト用ブックのセルを上記のように変更しましたら、現象が再現しましたのでご確認ください。
添付しますので、よろしくお願いいたします。
2.
それから、新たな質問をお許しください。
「すぐに役立つエクセルVBAマクロ集」の中のカレンダーマクロを右クリックイベントで表示するようにしたのですが、実際の日付が指定位置に表示されるのですが、ショートカットメニューが表示されてしまいます。
このショートカットメニューを表示しないようにするには、どうしたらよいのでしょうか? あつかましいのですが、よろしくお願いします。
|
|
Answer |
Copyright (C) 2003.2.5 永井善王 |
|
|
1.
な〜んだ、セルが結合されているのですか。
最初にシートの実物をお送りいただければ良かったのに。回り道してしまいましたね (;_;)
百聞は一見にしかずとか。今回の長い補足文もざっと見ただけでも H37:K37が2回登場しますし、上図で私がグリーンに着色しておいた N37:S37、N47:S47の結合についての説明が見当たらず、B42:C42から下方にB47:C47までの用途が不明で結果的にB列へのカーソル移動はB41への1回だけでよいのか等、疑問点が出てきます。
解析から始めるとお高いですヨ (*^^*)
さて、回答ですが結論から言いますと、私がグリーンに着色したセルの結合を解除すれば解決するようです。なぜそうなるか原因は不明ですが、Excelの仕様のような気がします。
以下の解説は「おまけ」です。
SelectionChangeイベントマクロの中でセル選択のコードを記述する場合の注意事項
あなたのケースでは実害が出ていないようですが、SelectionChangeイベントマクロの中に他のセルを選択するためのコードを記述すると、そのコードが実行されることによって、再び SelectionChangeイベントが発生します。そのため運が悪いと永久ループが発生して、マクロの実行が終わらない事態に陥ってしまいます。
回避策として、EnableEventsプロパティの値を設定してイベントの発生を一時的に止める方法があります。くわしくは 「 アクティブセルが変わったら相対的に選択範囲を変えるには」のページの終わりの方に解説があります。
Select Caseステートメントの構文について
質問文のマクロの中に Case節が 2行連続して書かれているところが、何箇所か見受けられます。
Case 4 To 7 Case 8 To 11
この場合、最初の Case節はあってもなくても同じ (4〜7ならば何もしないという意味) ですが、はっきりさせるために、わざと書かれているのですね。
わかりやすいマクロ
あなたがマクロで行いたかったセル選択順序を整理してみると、下表のようになるかと思います。
|
|
|
|
| |
|
|