プロが教える店舗&オフィスのセキュリティ対策術

こんばんは
>見出し(日付)をドロップダウンリストで選ぶと
>シートはB3でウインドウ枠の固定をしています。
日付けは(3行目)1/1のように入力されたセルです

VBAで処理する方法です
対象のシートモジュールに下記を書き込みA1セルのリストを変更してください
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("A1")) Is Nothing Then
   Dim r As Range
   Set r = Rows(3).Find(Range("A1"))
   If Not r Is Nothing Then Application.Goto r, True
  End If
End Sub

上記の処理で、リストをB1に変更する場合はどうしたら良いのでしょうか?

教えて!goo グレード

A 回答 (4件)

>それから同じ行に、リストと移動セルがある場合に、上手く行かないのは同じもの(日付)が2つ在るからでしょうか?


そうかもしれませんね。ご質問に示されているコードで説明すると
Findメソッドの検索範囲はRows(3) 3行目すべてなので3行目にリストを設置した場合そのようになる可能性があります。

また、Findメソッドのオプションは前回の設定を引き継ぎますので
Find(Range("A1"))と省略せずに設定する必要があります。

参考サイトで確認するとか、
マクロの記録で リボンの検索・・オプションを設定して検索できる事を確認し、記録を終了し、記録されたコードを参考に書き直すのが良いと思います。

>その場合セル範囲を指定(Range(”B2:AB2”))とかにしておけば良いのでしょうか?度々の質問になりますが、お願いいたします。

A2セルにリストを設置した場合、そのような方法で回避できると思います

また、Findメソッドの引数にはAfter 開始セルの指定があるので
これを使う方法もあります。
https://excel-ubara.com/excelvba4/EXCEL225.html

回答としてFindメソッドで実行する方法を書きましたが
Forループで探す方法もあります。
範囲が狭く限定的かつターゲットが1つの場合、ならこのような考え方も 

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ListCell As Range
Set ListCell = Range("A2")
If Not Intersect(Target, ListCell) Is Nothing Then
Dim r As Range
For Each r In Range("B2:AB2")
If ListCell.Value = r.Value Then Exit For
Next
If Not r Is Nothing Then Application.Goto r, True
End If
End Sub

A2にリストB2以降の2行目を対象にループ 見つけたらループを抜ける
抜けた時の r 変数のオブジェクトにApplication.Goto
見つからない場合は r 変数は Nothingなので処理されない
比較が .Value = なので 日付の扱いに注意する
    • good
    • 1
この回答へのお礼

大変勉強になりました、ありがとうございます。

お礼日時:2022/01/24 09:30

#1です 追記します


>マクロは始めたばかりで初心者です

とありましたので、Dim ListCell As Rangeについて
安易にListCellと変数名を設定しましたが、予約語や関数名で使用する可能性の低い名前にした方が良いです。
私は好みませんが、VBAでは2バイト文字を変数名にすることも可能です

基本的な事などで 参考サイトでご確認ください
http://officetanaka.net/excel/vba/variable/06.htm
    • good
    • 0

こんにちは



>上記の処理で、リストをB1に変更する場合はどうしたら良いのでしょうか?
意図がよくわかりませんけれど・・
コード中の「"A1"」の部分を、「"B1"」に変更すれば良いのでは?
    • good
    • 0

こんにちは


https://oshiete.goo.ne.jp/qa/12765874.html 回答したものです
説明を付けますが、自身でも調べてみてくださいね。

Private Sub Worksheet_Change(ByVal Target As Range)
セルの値が変更時に処理が行われます
戻り値はTarget As Range Target変数にRangeセル範囲がセットされます
範囲なので1つのセルの場合も複数のセルの場合もあります。
参考:https://vbabeginner.net/worksheet_change/

If Not Intersect(Target, Range("A1")) Is Nothing Then
Intersect 異なるセル範囲の交差範囲を取得します
Is Nothing 範囲が無い時、Notで否定しているので交差している時となります
Dim r As Range
Dim r As Range 変数宣言 Rangeオブジェクト型 セル範囲です
Set は オブジェクト型変数を設定する時の命令

Set r = Rows(3).Find(Range("A1"))
Rows(3).Find(Range("A1")) 省略していますがFindは探す
Rows(3) 3行目にA1セルの値が無いか探して変数rにセットします

If Not r Is Nothing Then Application.Goto r, True
r Is Nothing 変数 rにセットされているか Notで否定しているので
変数rにセットされていれば、(言い方を変えると見つかった時は)

参考:https://docs.microsoft.com/ja-jp/office/vba/api/ …
Application.Goto r, True rに移動する Trueはスクロールするです 一番左上に表示されますが、ウィンドウの固定を設定しているのでB3になると思います。
End If
End Sub

もうお分かりですね
A1セルのリストの場所を変えるのですから、A1を指定している箇所
すべてを変えます。
複数ある場合はメンテナンスなどが判り難い事がありますので
これもRangeオブジェクト型変数にセットすると1か所の変更で良くなります

まだ、Findに関しては問題が生じる可能性がありますので
VBA Find 日付を探す などで グーグル先生に聞くと
自身での理解が深まると思います。

一応、変数に入れたイベントプロシージャを書きます

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ListCell As Range
Set ListCell = Range("B1")
If Not Intersect(Target, ListCell) Is Nothing Then
Dim r As Range
Set r = Rows(3).Find(ListCell)
If Not r Is Nothing Then Application.Goto r, True
End If
End Sub
    • good
    • 0
この回答へのお礼

解説ありがとございました、すごく勉強になりました。
今まで基本的なものがないまま、ネット上の物を使って作っていました。けれど上手く行かず困っていました。読み解きに時間はかかりますが、調べながら進めていきます。
それから同じ行に、リストと移動セルがある場合に、上手く行かないのは同じもの(日付)が2つ在るからでしょうか?その場合セル範囲を指定(Range(”B2:AB2”))とかにしておけば良いのでしょうか?度々の質問になりますが、お願いいたします。

お礼日時:2022/01/20 16:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング