• ベストアンサー

ダイアログボックスに自動的にセルの値を入れるには

エクセルのマクロを実行したときに、「番号を入れてください」のダイアログボックスが出てくるのですが、その値がB1セルの値だとわかっているので自動的にB1セルの値を入れるようにするマクロ(VBEコード)がわかる方教えてください

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 いくつか、直さないといけない部分がありますね。 ご自身がおつくりになったものですか?ご質問の内容とコードには差があります。 ただし、変数の宣言のない人の解答の場合は、いきなりではなく、少し距離を置いて、コードをみたほうがよいことが多いようです。 Dim Cr1 As Variant Dim c As Variant 'またはRange 型 Dim i As Long '----------------- Dim rng As Range '私が後でつけたもの Cr1 = Application.InputBox("番号をを入れてください", Type:=2)   ↓ Default 値を入れてあげればよいでしょうね。 Cr1 = Application.InputBox("番号をを入れてください", Default:=Range("B1").Value, Type:=2) ただ、シートの違いの問題があるなら、表記は、シートを入れたコンテナ型にしてください。 例: Worksheets("Sheet1").Range("B1").Value それから、最初に戻りまして、  With Range("A1:K154")   If .Count = 1 Then ' ←ありえませんので、     ↓   If WorksheetFunction.Count(.Cells) =1 Then ' または、CountA だと思います。   そうでなければ、Range("A1").CurrentRegion.Count だと思います。 ここは、いきなり、SpecialCells で取らないほうがよいです。 For Each c In .Range(Cells(2, 6), Cells(2, 6).End(xlDown)). _ SpecialCells(xlCellTypeVisible) エラーが発生する可能性がありますから、エラートラップを入れます。   ↓ On Error Resume Next   Set rng = .Range(Cells(2, 6), Cells(2, 6).End(xlDown)).SpecialCells(xlCellTypeVisible) On Error GoTo 0 For Each c In rng ただし、Cells(2, 6) ~ でみると、データ自体が2行目から入っていてと、オートフィルタの1行目がタイトル行のようです。 そうすると、もし、その同じシートのB1セルに予め値を代入するスタイルは、あまりバランスが良くありません。データ-オートフィルタ全体を、少し行を下に下げて、その上で、B1 セルを使ったほうがよいのですね。ただ、もし、そこに、テキストボックス(コントロールツール)を置けば、そのテキストボックスのイベントで、そのまま出力してしまえばよいので、まったく対話形式が必要なくなります。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

#4 のmshr1962 さんへ 一応、この発言は、回答者どうしのやり取りは、規約に関わるかもしれませんが、少し、書かせていただきます。 >ただType:=2(文字列)でいいのですか?初めからType:=3(数値)の方が楽なような気がしますが 通常は、文字列が正しいです。というか、やむをえない選択です。 >Type:=3(数値) 3は、文字型と同じ仕様だと思います。 たぶん、3というのは、1 or 2 になるのですが、事実上、文字列と同じはずです。 数値でしたら、Type:=1 です。 0 数式 1 数値 2 文字列 (テキスト) 4 論理値 (True または False) 8 セル参照 (Range オブジェクト) 16 #N/A などのエラー値 64 数値配列 そのType が、数値の1という条件でお話させていただくと、 目的の値が取れない場合が大雑把には、3つあります。 1つ目は、空の場合=単にOK を押してしまった場合。 2つ目は、キャンセルを押した場合。 3つ目は、文字を入力してしまった場合。(例外的) その場合、Type を数値にすると、 まず、1つ目の空の場合、実行時エラーに極めて近い、ダイアログが出てきて、そこで、製作者の意図としない、エラーダイアログとマクロの流れが止まってしまいます。 2つ目のキャンセルを押した場合、 戻り値は、一応、False が取れますので、Vartype で取れます。しかし、戻り値の変数は、Variant型に限ります。 3つ目は、一応、文字列を入れると、一般的なエラーメッセージが返ります。 その後で、Resume する方法やいろいろあるとは思います。 ですから、1つ目さえなければ、Type:=1 の数値にしますが、それがあるばかりに、そこを数値に出来ません。 文字列にすると、戻り値の変数を Variant 型にする限りは、コード内で、この3つをクリアします。 私の知っているのは、このぐらいです。他にも、InputBox 関数で、レガシー機能を使うなんていう人もいますが、ちょっと、そこまでは必要にないように思います。 もちろん、自分が作り直すつもりなら、別のコードにはなりますから、私の#3の発言の中で、質問に直接関わりない部分は、余計なことかもしれません。

okkouta
質問者

お礼

高度な回答ありがとうございます。 「回答者どうしのやり取りは、規約に関わるかもしれませんが」ということですがお互いの技術・知識向上になるのであればいいことだと思いますよ。 ほんとマクロを自分で組める人がうらやましい。

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.4

#1です。 >If .Count = 1 Then セル数のカウントなので11列×154行=1694になります。 #3の方の方法でデータのあるセルのカウントとしても、 オートフィルタ用なら項目用の先頭行ははずすべきでは? >Cr1 = Application.InputBox("番号をを入れてください", Type:=2) このデフォルト値は#3の方の回答で正解です。 ただType:=2(文字列)でいいのですか?初めからType:=3(数値)の方が楽なような気がしますが >ElseIf CLng(Cr1) < 1 Or CLng(Cr1) > 18 Then 1~18と限定なら先のINPUTBOX命令のタイトルを "1~18の番号を入力してください"とした方がいいのでは? その上でこちらのメッセージは MsgBox "範囲外の番号です。入力し直してください", vbInformation とすれば2回聞いてくるということにはなりません。 それともここのElseIFの所を消去して、INPUTBOX命令の所に直接戻るかですね。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

こういうことでしょうか? Sub test() mycell = Application.InputBox("セルを選択してください。") MsgBox mycell End Sub

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.1

>「番号を入れてください」のダイアログボックスが出てくるのですが 上記だけでは状況が判りません。 1.フォームを表示させているなら、そのフォームのオープン時のイベントで テキストボックスにB1の値を設定すればいいです。 2.特定のセルに対しての、「番号を入れてください」なら メッセージボックスの変わりに、そのセルにB1のセルの内容をセットすればいいです。 3.INPUTの命令なら、変数にB1のセルの内容をセットすればいいです。 現状のマクロ(VBE)の内容を提示されれば確実な内容がわかると思いますが...

okkouta
質問者

補足

With Range("A1:K154") If .Count = 1 Then MsgBox "オートフィルタは作れません.", vbCritical Exit Sub End If ' Do Cr1 = Application.InputBox("番号をを入れてください", Type:=2) If VarType(Cr1) = vbBoolean Or Cr1 = "" Then Exit Sub ElseIf CLng(Cr1) < 1 Or CLng(Cr1) > 18 Then MsgBox "番号を入れてください", vbInformation End If Loop Until CLng(Cr1) > 0 And CLng(Cr1) < 19 .AutoFilter _ Field:=5, _ Criteria1:="=" & Cr1 & "-*", _ Operator:=xlOr, _ Criteria2:="=" & "*-" & Cr1 For Each c In .Range(Cells(2, 6), Cells(2, 6).End(xlDown)). _ SpecialCells(xlCellTypeVisible) ThisWorkbook.Sheets("タキシード").Cells(14, 23 + i * 2).Value = c.Value If i = 17 Then Exit For i = i + 1 Next End With というコードです。 ちなみに2回聞いてきますが、1回で済ますにはどの部分をカットすればいいでしょうか?

関連するQ&A