• ベストアンサー

エクセルvbaのフォームでエラーとなります

ワークシートにIDと名前の対応表があります。 別のシートのA1に検索したいID欄、A2にVLOOKUP関数で結果を表示させています。 VBAの入力フォーム上で、あるIDを入れたときに前途のA1に数値を代入し、A2で得られた結果をフォーム上の欄で取得するようにしています。 この時、表の中に対応する番号と名前があればキチンと結果が出ますが、そもそもデータベースが無ければVBA自体がエラーとなってしまいます。 ワークシート上のVLOOKUPには近似値では困るのでFALSEを指定していますので、該当番号がなければここでの結果は#N/Aとなっています。 フォーム上で該当番号がなければ代わりの文字列、たとえば「なし」などを入力されるようにできるか、最低でもプロセスが中断される事がないようにしたいのですが、どのようにすれば可能でしょうか?

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

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

No.1です。すいません、COUNTIFの式が間違っていました。(ついでにVLOOKUPの範囲にも:が抜けたりかっこが足りなかったり、間違いだらけでした) =IF(COUNTIF(A1,$F1$F10)=0,"なし",VLOOKUP(A1,$F$G10,2,FALSE) でなくて、 =IF(COUNTIF($F1:$F10,A1)=0,"なし",VLOOKUP(A1,$F1:$G10,2,FALSE)) でした。

ytj
質問者

お礼

ありがとうございました! 目から鱗というか、基本的な考えさえ思い浮かばないなんて、どうかしていました。感謝!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

noname#95859
noname#95859
回答No.3

このようにされたらどうでしょう? 前提: フォーム Form1 テキストボックス1:TextBox1 テキストボックス2:TextBox2 変換表:Sheets("Sheet2").Range("A1:B4"). ------------------- (1)Vlookupを使う Private Sub TextBox1_Change() Cells(1, 1).Value = TextBox1.Text If TextBox1.Text <> "" Then If Not IsError(Cells(2, 1).Value) Then TextBox2.Text = Cells(2, 1).Value Else TextBox2.Text = "なし" End If Else TextBox2.Text = "" ’注1 End If end sub 注1:テキストボックス1で、デリートで戻って空白になった時の ”なし”表示を避けるためです。 (2)イベントプロシージャの中だけでやってしまう方法。    (Vlookupは使わない) Private Sub TextBox1_Change() dim myArray as variant ID_asked = TextBox1.Text myArray = Sheets("Sheet2").Range("A1:B4").Value r = UBound(myArray, 1) flag = 0 For ii = 1 To r If ID_asked = myArray(ii, 1) Then name_answer = myArray(ii, 2): flag = 1: Exit For Next If TextBox1.Text <> "" Then If flag = 1 Then TextBox2.Text = name_answer Else TextBox2.Text = "なし" Else TextBox2.Text = "" End If end sub セルの範囲を myArray = Sheets("Sheet2").Range("A1:B4").Value で、バリアント変数に入れることで、メモリ上に配列を持ってくることができます。UBound(myArray, 1)、UBound(myArray, 2)でその大きさを知ることができます。上記では縦方向のUBound(myArray, 1)だけを使っています。 テキストボックス1に入力されたIDをfor loopでサーチして、返すと言うのが(2)の案です。

ytj
質問者

お礼

ありがとうございます。 正直、難解な構文ですが、これを読み解くことでスキルにつながると考えますのでじっくりと取り組んでみたいと思います。 コピペでは、不具合があったときに理解できていなければいけません。 勉強させていただきます。 ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

フォームの方をいじるのではなくて、セルの方で、 =VLOOKUP(A1,$F1$G10,2,FALSE) となっている(範囲は適当です)のを =IF(COUNTIF(A1,$F1$F10)=0,"なし",VLOOKUP(A1,$F$G10,2,FALSE) のように、VLOOKUPで検索する範囲の1列目にA1の値が入ってなかったら、IF分で「なし」を表示するようにしてしまえばいかがでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAエクセルのフォームについて

    お世話になっております。 VBAエクセルのフォームについて教えていただきたいのです。 VBAで入力のフォームを作ったのですが(TEXT BOXが4つ、コマンドボタン1つ、コマンドボタンを押したときに登録される用にしたい) 各シートの集計にしたい為、各シート(31のシートがあります)に入力フォームがあります、その各シートでの入力結果を1つのシートに 集計したいのですが、どの様なコードにしたらようか判りません。 素人のためお手数ですが、なるべく判りやすくお願いします。 よろしくお願いします。

  • エクセルでフォームを作成しています。(VBA)

    エクセルでフォームを作成しています。(VBA) フォームAで作成してあるリストボックスから選択して 取得した番号を フォームBにもってきて、その番号をもとにVLOOKUPで ほかのテキストボックスに値を持ってこようとしている のですがうまくいきません。 フォームAのリストボックスにはsheet1の名簿が 表示されています。 クリックで選択した名簿番号を取得して、フォームBにある 個人のページでその他の詳細を出そうとしています。 名簿番号はフォームBの名簿番号.Textに持ってこれたのですが その名簿番号をVLOOKUPで研究名を出そうとしてもうまくいきません。 コードのどこがだめなのか分かりません。 VBA入門者です。 よろしくお願いいたします。 --------------------- Private Sub 決定_Click() Dim ADR As Variant On Error GoTo ExitER Set ADR = Worksheets("sheet1").Range("A:F") 研究名.Text = Application.WorksheetFunction.VLookup(名簿番号.Text, ADR, 4, False) On Error GoTo 0 Exit Sub ExitER: MsgBox "一致するコードがありません" On Error GoTo 0 End Sub ---------------------

  • エクセルVBAユーザーフォーム

    ユーザーフォームに入力後ワークシートへ転記されるのですが、そのカーソルがワークシート側に行ってしまいます。連続して入力したいのですが、ユーザーフォームにもどるようにするにはどうしたらよいのでしょうか? 教えて下さい。よろしくお願いいたします

  • エクセル vbaでの相談です

    エクセルでの質問です。 販売管理表を作りたいと思います。 sheet1を商品マスター表とし、下記の見出しがあって A1 JANコード(上一桁4からの番号で13桁) B1 商品コード (14桁) C1 商品名 D1 価格 以下A2行以降、A1行の見出しを元に商品詳細があるとします。 sheet2の下記のA1行を見出しとし、A2行から販売実績をユーザーフォームを使って入力していきたいと思います。 A1 JANコード B1 商品コード C1 商品名 D1 価格 E1 販売番号 フォームを作成し、入力窓に JAN、商品コードのいずれかを入力すると、他の入力窓にsheet1の商品マスター表から該当する商品名、価格を自動入力し登録ボタンを押すと、sheet2の該当セルに反映されるということはできますでしょうか? そして異なる商品のまとめ買いの件数も知りたいので、フォーム上で複数アイテム登録できるようにし、販売番号で件数を管理したいのですが、そちらも可能でしょうか? 販売番号も自動で通し番号が入るようにしたいです。わかりにくい文章で申し訳ありません。ご教授の程、よろしくお願い致します。

  • エクセルVBA ユーザーフォームの終了について

    エクセルVBAでユーザーフォームを作成しています。 コマンドボタンにVBAマクロを割り当てしているのですが 思うように動いてくれないので質問します。 コマンドボタンをクリックしたら望む動作 1、ワークシートを選択 2、その後、ユーザーフォームを消す。 と言う動作にしたいのですが、2の ユーザーフォームを消す方法、書き方が分かりません どなたか教えていただけないでしょうか 1の動作は以下のように書いています。その後の書き方を お願いします。 Private Sub CommandButton8_Click() ブック名 = "VBA演習" シート名 = "sheet1" Workbooks(ブック名 & ".xls").Worksheets(シート名).Activate End Sub (ユーザーフォームの名前は"テストフォーム"としてます)

  • VBAのフォームにレコード番号を表示させたい

    VBA素人です。 質問内容も素人で誠に恐縮ですがよろしくお願いいたします。 以下の内容、分かる方が見えたらご教授お願いします。 エクセルVBAで個人情報を登録するユーザーフォームを作成しています。フォームに入力した内容はワークシートに反映されるようになっています。 1行目はタイトルで、2行目以降に個人情報が入ります。 A列にコードとして、数字を1~100まで入力してますが、フォーム側で削除をするとその番号が欠番になってしまいます。 そこで、関数を使いA2のセルからA101にかけて、=ROW(A2)-1、=ROW(A3)-1...と入れました。 ワークシート上で行を削除すると、欠番は発生しないのですが、フォーム側で削除すると、セルに登録されている関数が消え、欠番が発生してしまいます。 そこで、次はアクティブになっている行番号-1にするマクロでやればいいのかなと安易に考え、 Public Sub CODE() Me.laCODE.Caption = ActiveCell.Row - 1 End Sub といったプロシージャをつくりました。 そうすると開いたレコードが全て同じ数値になってしまいました。 色々と思案してみましたが、自力で出来そうにありませんので、お力を借りればと思います。 どんな方法でも結構ですので、フォームにレコード番号を表示させるやり方をご教授ください。

  • EXCEL VBAでユーザーフォームを使ってデータを入力したい。

    EXCEL VBAでユーザーフォームを使ってデータを入力したいと思っています。(ユーザーフォームはできています。) 入力項目が4項目あります。 名前 作業コード 開始時間 終了時間 上記4項目と登録ボタンです。 sheet1にユーザーフォームを表示し sheet2の A1に名前 B1に作業コード C1に開始時間 D1に終了時間が 登録ボタンを押すごとに どんどんデータを記録していきたいのです。 VBA初心者ですのでコードがよくわかりません。 ご教授ください。よろしくお願いいたします。

  • ExcelのVBAについて

    すみません、ご教授下さい。 エクセルVBAで簡単な住所録のようなものを作りたいのですがご教授頂けますでしょうか? 内容としては、シート1に入力フォームがあり、登録ボタンを押すと シート2へ一覧していく形です。 また、シート2に一覧していく際は新しいものが上に挿入され、 入力フォームはクリアされるという形になります。 シート1   A    B 1 顧客ID AAA 2 姓    サンプル 3 名    太郎 4 TEL   080-0000-****  →これ以降も項目を増やします。 シート2     A    B      C     D 1 顧客ID   姓     名    TEL 2  AAA   サンプル 太郎 080-0000-**** ご教授頂けますでしょうか? 何卒宜しくお願い致します。

  • エクセルでデータを蓄積するVBA

    蔵書管理用の一覧表です。 エクセルでデータ入力用のフォームは作ることができたのですがシートに転記するVBAをどのように書けばよいのか分かりません。 データは次々に増えていきます。 A列には番号を入力せずに自動的に番号が増えていくようにしたい。 3番まで入力済みのあとは、自動で「4」と番号が付与されて、下の行に転記されるようにしたい。 VBA初心者です。よろしくお願いします。 A    B      C          D 番号 分類     図書名      冊数 1   文庫本    日本の歴史   3 2   週刊誌    新潮        1 3   月刊誌    月刊ゴルフ    1

  • EXCELのVBAで、あるワークシートでのみ使うユーザーフォームを作り

    EXCELのVBAで、あるワークシートでのみ使うユーザーフォームを作りました。そのワークシート上での定数や、プロシージャや関数をワークシートのモジュールに置いています。そして、その定数や関数などをユーザーフォームのイニシャライズなどで使いたいと思いますが、ユーザーフォームのモジュールはワークシートのモジュールとは別なので、使えません。他への影響を考えると、標準モジュールには、置くのは不適切だと思います。 特定のワークシート上でのみ使うユーザーフォームと、そのワークシートとで、共通の定数や関数などを使う方法は、あるのでしょうか。どのようにすればよいのでしょうか。

専門家に質問してみよう