[[20191007175520]] 『文字列の1文字目によって異なるシートへ移動し、』(MSCL) ページの最後に飛ぶ

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

 

『文字列の1文字目によって異なるシートへ移動し、同じ文字列を探す』(MSCL)

長くてすみません。VBA初心者です。
ある『ボタン』(フォームコントロール)に
4ケタの文字が入力されています。

その文字の、1ケタ目が、Aの時は、Aのシートへ移動し、
そのシートで、4ケタが一致するセルを探す。
その4ケタに一致するセルが無い場合は、MsgBox"見つかりません。"

その文字の、1ケタ目が、Bの時は、Bのシートへ移動、
そのシートで、4ケタが一致するセルを探す。
その4ケタに一致するセルが無い場合は、MsgBox"見つかりません。"

その文字の、1ケタ目が、AでもBでもない場合は、
MsgBox"文字列を確認してください。"

というのを作りたいです。

そもそもの話…『ボタン』ではなく、セルに文字を入れ、関数で、
いけたりするのかも知れません…

しかし、何を思ったのか、4ケタの文字を入力したボタンを作り、
ボタンに入力されている文字を読み込んで作ろうとしました。
ボタンの文字列の読み込みに関しては、うまく動いているようで…
1ケタ目がAの時は、こっちのコード、
1ケタ目がBの時は、こっちのコードでは、うまく動きました(下のコード)。

ところが、これだと、少々面倒な作業が出るため、
つまり、1ケタ目がAのボタンには、A用のマクロを割り当て、
1ケタ目がBのボタンには、B用のマクロを割り当て…
とボタンによって割り当てるマクロを変えなければいけないのです…。
ボタンが500個くらいあるので…今後、追加されたりした場合も想定して…

文字列の1ケタ目で判断してくれたら、
全部のボタンに同じマクロを割り当てるだけだと思い、
作り始めたものの、条件の部分がうまく作れませんでした。
単に、条件文を作るごくごく基本のスキルがないだけと思いますが、
何かよい方法はないでしょうか。(『そもそも』の話でも構いませんので。)

シートが決まっている場合のものをのせます。
(残念ながら、自分で作ったものではありません。ネットで探しました。)

Sub シートAの該当行へ()

    Dim rng As Range
        CBName = ActiveSheet.Buttons(Application.Caller).Text
        Sheets("シートA").Select
    Set rng = Cells.Find(What:=CBName)	'4ケタが一致するセルを探す

  If rng Is Nothing Then
    MsgBox "見つかりませんでした。"

  Else
    Cells(rng.Row, "D").Select		'その行のD列へ移動
  End If

End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


"シート" & Left(CBName,1)

Leftで、1文字目を取り出せばよいです。

(マナ) 2019/10/07(月) 18:17


>そもそもの話…『ボタン』ではなく、セルに文字を入れ、関数で、
>いけたりするのかも知れません…

>ボタンが500個くらいあるので…今後、追加されたりした場合も想定して…

わたしなら、セルをボタンの代わりに使うと思います。

(マナ) 2019/10/07(月) 18:22


探さなくても、一対一の関係なら、
ハイパーリンクを設定しちゃえば、
いいのでわ?
(まっつわん) 2019/10/08(火) 00:04

横からですけど、私も参加で。

■1
↓の段階で設計が変な気がします。
>ある『ボタン』(フォームコントロール)に4ケタの文字が入力されています。

やりたいことって、

 検索値「A123」だったら Aシートのセルから「A123」という内容のセルを探してそこに飛ぶ
 検索値「B456」だったら Bシートのセルから「B456」という内容のセルを探してそこに飛ぶ

みたいなことですよね

それだったら、【検索値を入力する欄】と、【マクロを実行するボタン】を分けませんか?
そのようにすれば、検索値ごとにボタンを作る必要はないので1つのボタンで対応できます。

また、 検索値「A123」だったらAシート、検索値「B456」だったらBシートのように、1桁目?の文字と、シート名に関連性がある場合は、マナさんが指摘されているように、文字列操作でシート名を作れるから、マクロも1つでよいはずです。

さらに、順番が前後しますが、検索欄についても自由に入力するのではなく、候補のなかから選ばせたいということであれば、コンボボックスを使ってみるとか、適当なセルを入力欄にして入力規則で制御するとか手はいくつかあると思います。

■2
参考にされようとしているコードにFindメソッドという命令が使用されています。
一般機能で言うところの「検索」ですから、目の付け所はよいとおもうのですが、現状のままだと存在するに見つからないなんて悩む日が来るかもしれません。
したがって、Findメソッドを使用するのであれば、事前に↓を読むことをおすすめします。

 検索に失敗するとき(Findメソッドの引数省略時に起きる失敗)
https://www.moug.net/tech/exvba/0150111.html

(もこな2) 2019/10/08(火) 04:56


マナさん、まっつわんさん、もこな2さん、
助かりました。どうもありがとうございます。

最終的に、今、作ったモノの修正が少ない、
マナさんの、最初のレスを採用させていただきました。
スムーズに動いています。ありがとうございました。

まっつわんさん、探しに行くシートは、あまり変更しないので、
確かに、ハイパーリンクも、ありですね。少し考え過ぎたかも…です。

もこな2さん、はい、
一度、計算結果を見に行ってほしいのに、見つけてくれなくて、
『〜, LookIn:=xlValues)』に気付くまでに、苦労しました。
他にも色々ありますね。以後、使わせて頂きます。

皆さん、どうもありがとうございました。
(MSCL) 2019/10/09(水) 07:34


ご報告です。
ボタンの配置が面倒になりww、最終的に、ハイパーリンク+VLOOKUPにしました。

シート1A
A列………B列
A123………=RIGHT(CELL("filename",A3),LEN(CELL("filename",A3))-FIND("]",CELL("filename",A3))) & "!" & "R" & ROW() & "C" & COLUMN()-1
(パクリですが、シート名を取り出して、セルの番地を追加しています…)

シート1B
B123………〃

シート2
A列………B列
A123………=HYPERLINK("#" & VLOOKUP(A3,シート1A!$A:$B,2,FALSE),A3)

B234………=HYPERLINK("#" & VLOOKUP(A10,シート1B!$A:$B,2,FALSE),A10)

当初、シート名に()が入っていたので、なかなかうまく動きませんでしたが、
多分、()や+−のような数式に使用する文字をシート名から無くしたので、うまくいったんだと思います…
IF文を追加すれば、式も1つにできそうですが、今回は、ここまでにしました。
マナさん、まっつわんさん、もこな2さん、ありがとうございました。
(MSCL) 2019/10/15(火) 17:33


コメント返信:

[ 一覧(最新更新順) ]


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