- ベストアンサー
コード入力してセルを選択するマクロ
お読み頂きありがとうございます。 A列にコードが並んでいて、先頭行には横に1~31の日付を表す数字が入っているEXCELシートがあります。コードは5桁で重複はありません。 この表でコード(ex.12345)と日付(ex.20)を指定することでそのコードと日付が交差する位置のセルを選択するマクロが作れるでしょうか。 例えば、マクロを実行するとコードと日付を入力するウインドを開いてコードと日付をそれぞれ入れる、あるいはコードと日付を組み合わせて(1234520)のように入力するとコード12345の20日に該当するセルを選択するようにしたいのですが。 当方、VBAの知識はほとんどない素人です。難しい解答が付いたらお礼も書けなくて困るな、と思いながら質問を書いている状態です。どうぞよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 簡単なコメントを入れときます。 VBAヘルプがインストールされているなら InputBox 等の単語内にカーソルを置き、F1キーを押すと該当のヘルプが見れます。 Sub Test() Dim fs, myDay As Integer 'InputBoxでコードと日にちを指定して変数に代入(Type:=1は数値) fs = Application.InputBox("CD+日", "指定", Type:=1) 'キャンセルや閉じるの場合はここで終了 If fs = False Then Exit Sub '変数fs が 6桁未満だとここで終了 If Len(fs) < 6 Then Exit Sub 'mid関数で6桁以降をmyDayに切り分け。CIntは無くても動く myDay = CInt(Mid(fs, 6, Len(fs))) 'Left関数でfsを先頭から5桁に置き換え。CIntは無くても動く fs = CInt(Left(fs, 5)) 'A列をA1からfsで検索。r は、発見→そのRange、無い→Nothingになる Set r = Columns(1).Find(what:=fs, after:=Range("A1"), LookAt:=xlWhole) '見つからない時はここで終了 If r Is Nothing Then Exit Sub '見つかったセル r の Offset(行,列)を選択 r.Offset(0, myDay).Select End Sub #3さんでは無いけど、#3は下記のようにするとOKでしょう。 Find の lookat:=xlWhole は、編集-検索で「完全に一致する~」にチェックが無い状態で実行すると誤動作しますので追記してます。(1を指定しても10を選ぶ) dt = CDate(InputBox("日付")) を dt = InputBox("日付") に i = Range(Cells(2, "A"), Cells(d, "A")).Find(cd).Row を i = Range(Cells(2, "A"), Cells(d, "A")).Find(cd, lookat:=xlWhole).Row に j = Range("B1:AJ1").Find(dt).Column を j = Range("B1:AJ1").Find(dt, lookat:=xlWhole).Column に MsgBox Cells(i, j) を Cells(i, j).Select に
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
VBAでの回答も良いが、 関数でできる問題と思います。 INDEX関数、MATCH関数の組合せでできる。 昨日の質問 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2163818 と実質同じではないですか。 私の回答など見てください。 VBAでは Sub test01() On Error GoTo err cd = InputBox("コード") dt = CDate(InputBox("日付")) d = Range("A65536").End(xlUp).Row i = Range(Cells(2, "A"), Cells(d, "A")).Find(cd).Row j = Range("B1:AJ1").Find(dt).Column MsgBox Cells(i, j) Exit Sub err: MsgBox "見つかりません" End Sub で良さそうです。 ただ MsgBox Cells(i, j) は表示するだけなので、改造するには、VBAの知識が要りますので 使えるかな。
お礼
ご回答ありがとうございます。 昨日の質問と回答についてはよく理解できます。ただ今回はその位置のセルにあるデータを抽出したい、知りたいというのが目的ではなく、あくまで該当するセルを選択するまでを目的としています。 回答に記述していただいたマクロは私の表ではうまく動きませんでした。(見つかりません、のメッセージボックスが出てきてしまう) おそらくマクロの中に書かれているセルあるいはセル範囲が私の表と一致しないのだろうと思いますが、記述の内容がちゃんと理解できないので私の力では修正できませんでした(T_T) それとおっしゃるとおり、メッセージボックスでのセル位置の表示では今回の目的が達成できず、「改造する知識」にはまったく欠けております(^^;
- takachan7272
- ベストアンサー率29% (179/616)
こんな方法もありますね。 1日から9日までは0を付けて、入力値は7桁としました。 Sub macro1() Dim コード, 日付 As Integer 値 = InputBox(prompt:="値を入力して下さい", _ Title:="テスト") If Len(値) <> 7 Then MsgBox "7桁の数値で入力して下さい" End If コード = Val(Left(値, 5)) 日付 = Val(Right(値, 2)) Application.WorksheetFunction.Index(Range("B2:AF65536"), _ Application.WorksheetFunction.Match(コード, Range("A2:A65536"), False), _ Application.WorksheetFunction.Match(日付, Range("B1:AF1"), False)).Activate End Sub ---------------------------------------------- promptは記述したメッセージが表示されます。 TtitleはInputBoxのタイトルとして表示されます。 デフォルト値の表示や、InputBoxの表示位置の指定も可能です。
お礼
真夜中と言うより明け方(!)にご回答をいただいてますね。 こちらに書いていただいたマクロついては、多少(普通にEXCEL上で使用する)関数について知識があったので理解しやすかったです。というか、マクロ上では関数はこうやって使うのかぁ、という感じですね。(そういうレベルです) 色々経験をつんで勉強して、早くNo.1さん、No.2さんのようになりたいものです。ご親切にどうもありがとうございました。
- papayuka
- ベストアンサー率45% (1388/3066)
こんな感じでしょうか? 1234520と打ちます。 Sub Test() Dim fs, myDay As Integer fs = Application.InputBox("CD+日", "指定", Type:=1) If fs = False Then Exit Sub If Len(fs) < 6 Then Exit Sub myDay = CInt(Mid(fs, 6, Len(fs))) fs = CInt(Left(fs, 5)) Set r = Columns(1).Find(what:=fs, after:=Range("A1"), LookAt:=xlWhole) If r Is Nothing Then Exit Sub r.Offset(0, myDay).Select End Sub
お礼
真夜中にこんなマクロを書いていただきまして本当にありがとうございます。 現在の私のレベルですと5行目までは何が書かれているのか理解できますが、myDay = CInt(Mid(fs, 6, Len(fs)))以下はほとんどチンプンカンプンです。本やネットで調べながら少しずつ理解して、成長して行こう(^^;と思います。 ご親切ありがとうございました。
お礼
2度目のご回答ありがとうございます。 何せホントの初心者で、せっかくつけていただいたコメントも100%理解はできないのですが、少し霧が晴れたような感じです。また、No.3さんのマクロの書き換えもご指示のとおりでうまく動きました。 この場をお借りして他のお二方にも再度お礼を申し上げます。ご親切に本当に感謝しています。ポイントを2つの回答にだけしかつけられないのが誠に心苦しいです。ありがとうございました。