Excel VBA 質問スレッド No.211 (解決済)

アクティブセルが上下に移動した場合画面を更新するコード

投稿者 : あかは     投稿日時 : 2021/04/07(Wed) 16:48:35     OS : Windows 10     EXCEL : Excel 2016
アクティブセルが上下に移動した場合画面を更新したいので
ググってあちこち見てなんとか下記のコードを組みました。

Dim ps As Long
Dim i As Integer

Private Sub Worksheet_Activate()
ps = ActiveCell.Row
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If ps <> ActiveCell.Row Then
Application.ScreenUpdating = True
ps = ActiveCell.Row
End If

End Sub


もともとは条件付き書式とApplication.ScreenUpdatingをつかってアクティブ行をハイライトするためのコードですが、重すぎて使いづらいので、行を移動した場合のみ画面を更新するようにしました。
一応動くのですが、今まで自力でコードを書いたことが無いので、変な箇所が無いか、より良い方法が無いか教えて下さい。

[返信 1] Re : アクティブセルが上下に移動した場合画面を更新するコード
投稿者 : あかは     投稿日時 : 2021/04/07(Wed) 16:50:41
すみません Dim i As Integer はDebug.printに使った変数の消し忘れです。

[返信 2] Re : アクティブセルが上下に移動した場合画面を更新するコード
投稿者 : ヘンリー     投稿日時 : 2021/04/08(Thu) 19:19:11
>ググってあちこち見てなんとか下記のコードを組みました。
最初は、私も含め、皆さんこんな感じだと思います。

>変な箇所が無いか
動いているので変な個所はありません。

>より良い方法が無いか

・変数の宣言について
基本的には、Dimは、「プロシージャ内のみで使用する変数を宣言する」ときに使います。
上記コードの様に、「モジュールレベルで使用する」場合、Privateを使用します。
(以前調べた時に、この様に書いてあったので、全てPrivateでやってきました)

今回、Dimもモジュールレベルで使用できる事は、勉強になりました。ありがとうございます。

※「VBA Dim Privateの違い」などで調べてみて下さい。


・ActiveCell.Rowを使用していることについて
ps = Target.Rowと書いても良いです。(私はTargetを使う派ですが、賛否あると思います)

Worksheet_SelectionChange(ByVal Target As Range)
このプロシージャは、選ばれたセルがRange型で、且つ「値渡し」として、引き受けています。

SelectionChangeイベント以外でも(自分で作成したプロシージャなど)、
「引数の受け渡し」を使い慣れると、今後VBAをやっていくうえで役に立つかと思います。

※「VBA 引数の受け渡し」について調べてみて下さい。
 ちょっとハードルが高いと思ったら、引数の受け渡しについては、
 自力でコードを何本も書いてからでもよいと思います。


余計なお世話かも…
VBAを自力で書けるようになりたいと思うのであれば、
「このような掲示板の、他の人の質問に回答をするつもりで、自分でコードを書いてみる」
と良いと思います。
これをやろうとすると、「VBAでどのように書くか分からない場合には調べる」という
作業が必須になります。そうすると、「調べることに慣れ、コードを書く訓練ができる」
となります。

私は、この掲示板に、複数回答をしていますが、
ほぼ、何かについて調べながらコードを書いて、動作確認して、回答・解説しています。
(今回も、Dimと、Privateの違いについては、ネットで調べてから回答しています)

つまり、私が回答をしている理由は、VBAの訓練の為なのです。
「分からない時はコードを調べて、自分でコードを書いてみる。
正しく動作したら、自分なりの解説を作成する」の順でやっています。

※私の場合、特に頭が悪いので、「覚える」ができないので、
 実際に会社で使用しているプログラムも、調べながらやっている事がほとんどです。

掲示板は、VBA訓練のネタの宝庫だと思います。
ぜひ試してみて下さい。

[返信 3] Re : アクティブセルが上下に移動した場合画面を更新するコード
投稿者 : あかは     投稿日時 : 2021/04/11(Sun) 09:12:48
ありがとうございます
組んだ時はActiveCellしか知らなかったので、一択でした。
Targetを検索して見ましたが、複数範囲選択時の戻り値がイマイチよく分からなかったので、今回は使いづらいと感じました。
複数セルを対象に操作する場合はTargetが良さそうですね。
変数の宣言はhttp://officetanaka.net/excel/vba/variable/05.htmを参考にしました、一番最初に書いたときは全く分からず、Worksheet_Activate内でPublicで書いていました。

VBAが使えるようになりたいとは思うのですが、会社で必要になるのが2年に1回程度なので、どうしても優先順位が下がってしまい、その場しのぎで対処してしまいます。

余談ですが、会社では測量CADがメインなので外部マクロツールを使う機会が多いですね。
UWSCの更新が止まってしまったのが痛いです。

当掲示板について
返信入力フォーム
お 名 前  :
内  容   :
ステータス  : この質問を解決済みにする

認証コード  :
        キャプチャ画像


( 処理日時 : 2021-04-21 07:44:02 )

Page
Top