• ベストアンサー

エクセルのフォームに値を返す方法について

バーコードリーダでバーコードを読み、それに該当する商品を商品リストから探し出して表示させたいと考えています。 【エクセルのフォームの概要】 (1)バーコードNo用の「textbox1」→txtbox1 (2)商品表示用の「textbox2」→txtbox2 (3)商品リストのA2~E1000までデータが入っていて、商品名はその一覧表の左から3番目です。 見よう見まねで色々検討しているのですが、どうしてもできません。下記のように考えていますが、何も表示されません。ご指導の程宜しくお願い致します。 Dim RangeA As Range Dim Ansform As String Set RangeA = Worksheets("商品リスト").Range("A2:E1000") On Error Resume Next Ansform = Application.WorksheetFunction.VLookup(txtbox1.Value, RangeA, 3, False) txtbox2.Text = Ansform 初めてマクロ(VBA)の世界に入ってきたため、さっぱりわかっていません。突然組みだしてもさっぱり前に進まないので、バーコードリーダーを使った商品管理をエクセルでするような事例がどこかのサイトに出ていましたら教えていただけませんか?(検索をかけてもうまく見つかりません。)

  • mi158
  • お礼率95% (204/213)

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

Sheet1にテキストボックスを2つ貼り付けて実験しました。 Sheet1のシートモジュールのTextBox1のKeyDownイベントに (編集モードでダブルクリックして、GeneralをTextBox1、 DeclalationをKeydounを選ぶ) Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then Dim RangeA As Range Set RangeA = Worksheets("商品リスト").Range("A2:E1000") On Error Resume Next TextBox2.Text = Application.WorksheetFunction.VLookup(Val(TextBox1.Value), RangeA, 3, False) End If End Sub 商品リストのA2:E1000に(B列と第5行以下行は省略) 1234 お菓子 1235 せんべい 1236 あめ テキストボックス1で「1234」を入れてENTERキーを押すと テキストボックス2が「お菓子」と出ました。 ただバーコードリーダーから入るデータが、Enter押しと同じか自身が無いが。 この質問の解決は、ご回答1-3の路線に疑問を持っている。イベントと結び付けないとダメなのでは。 そうであれば、質問者にとっては、VBで熟達しているなら別ですが、手に余る質問と思う。問題として中級以上の質問でしょう。 ーー 追記 UserForm1上にテキストボックスを2つ貼り付けてやってみても 同じコードで同じ結果になりました。

mi158
質問者

お礼

imogasi様 ありがとうございます!! 何とできました!!  バーコードリーダでバーコードを読み込み、その該当商品を表示することができました。 > Sheet1のシートモジュールのTextBox1の > KeyDownイベントに >(編集モードでダブルクリックして、Generalを > TextBox1、DeclalationをKeydounを選ぶ) という部分が何のことかわからなかったのですが、とりあえずimogasi様のプログラムを貼り付け実行したところ、できました!! 頭の中で構想を練っている段階ではとても簡単にできそうな感じだったのですが、実際にやってみるととてつもなく困難なものでした。 「手に余る質問」・・・本当にその通りでした。 でも、皆様のお力をお借りして、一つのハードルをクリアすることができました。 これからもわからないことが多々出てくると思います。その時はまた質問させていただきますので、どうぞ宜しくお願い致します。 ありがとうございました。

その他の回答 (4)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.4

>13桁の数値を入力しているのですが、1桁目までしか読んでいませんでした。 コードがどこに書かれているのか解かりませんが、textbox1.change イベントに書かれているなら、1文字目が送り込まれた時点で反応している可能性があります。 BeforeUpdateなど、別のイベントに書いた方が良いでしょう。 >バーコードリーダでバーコードを読んで、その値に該当する商品を同一フォーム上に表したいと言うことです。 このデータをテキストボックスで確実に受取れる事は確認出来ているのですか?

mi158
質問者

お礼

hana-hana3様 何度も御回答頂き、本当にありがとうございます。 どうしても動かなかったのですが、No.5の方の御回答に従い挑戦してみましたところ、無事表示させることができました。 本当にありがとうございました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.3

>・・・どうも動きません txtbox1.Valueに値は入っていますか? その値は、商品リストにあるものですか? Vlookupで一致しない値(データに無い値)の場合はエラーになります。 >On Error Resume Next で、システムからのエラーメッセージを回避する事になります。 エラーの時に、Ansformは以前の値(この場合は宣言された後なので値が入っていない)が入っています。 そのため『下記のように考えていますが、何も表示されません。』と言う状態になっていたのではないでしょうか?

mi158
質問者

お礼

たびたびありがとうございます。 何で動かないのでしょう? 値は入力しています。 商品リストに入っている値を入力しています。 On Error~は削除しました。 ・・・ 色々いじって試しているのですが、ダメです。 今回、プログラムを書きましたが、もっと簡単な方法や確実に動く方法があれば教えていただけませんか? したいことはバーコードリーダでバーコードを読んで、その値に該当する商品を同一フォーム上に表したいと言うことです。 是非、御教示の程、宜しくお願い致します。

mi158
質問者

補足

txtbox1.Valueの値を再確認しました。 13桁の数値を入力しているのですが、1桁目までしか読んでいませんでした。 どうすれば13桁目まで読んでくれるのでしょうか? もしかしたら、ここに最大の原因があったのかもしれません・・・・。 色々申し訳ございません。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

>フォームのテキストボックスに商品名を書き出したいと考えています。 フォームのモジュール書かれているならこのままで動作するはずです。 標準モジュールや別のフォームに書かれているなら、 フォーム名.Textbox2 になります。

mi158
質問者

お礼

hana-hana3様 再度の御回答ありがとうございます。 「フォームのモジュール」に Worksheets("商品マスター").Activate という一文を加えて、 Ansform = Application.WorksheetFunction.VLookup(UserForm1.textbox1.Text, RangeA, 3, False) UserForm1.textbox2.Text = Ansform として再挑戦しているのですが、・・・どうも動きません。 デバッグをすると、Ansformの行が黄色く表示されていますが、どこをどう直せばよいのかわかりません。 申し訳ございませんが、再度のご指導、宜しくお願い致します。

mi158
質問者

補足

hana-hana3様 エラー番号は1004で、「WorksheetFunctionクラスのVLookupプロパティを取得できません。」となっています。 「Range オブジェクトの一部のメソッドでは、対象となる範囲にデータが入力されている必要があります。」とヘルプに書かれていましたので、とりあえずデータの入れてある範囲(A2:E16)として再挑戦してみましたが、やはりダメでした。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>txtbox1.Value >txtbox2.Text では、どこにあるものかわかりません。 Sheets("シート名").txtbox1 のように指定してください。 >On Error Resume Next デバッグ時にこれがあるとエラー箇所がわかりません。 コメントアウトしておきましょう。 そうすればエラーが発生すると実行が止まります。

mi158
質問者

お礼

hana-hana3様 早速御回答いただきましてありがとうございます。 恐れ入ります。私の説明がわかりづらかったと思います。 シートに商品名を書き出すのではなく、フォームのテキストボックスに商品名を書き出したいと考えています。 ・・・ということは、フォームのテキストボックスだと言うことを指定しなくてはいけないようですが、どうにも・・・わかりません。 再度ご指導の程宜しくお願い致します。

関連するQ&A

  • エクセルのフォームに検索結果を表示する方法について

    エクセルのフォーム上に商品名を入力して、別シートに入っているデータを検索し、該当するデータを上記フォーム上に表示させたいと考えています。 【エクセルのフォームの概要】 (1)フォームはuserform1に作成してあります。商品名を入力→txtbox1 (2)「商品一覧表」というシートに商品一覧表が作成されていて、A1~J1000までデータが入っています。 (3)検索に引っかかるデータはその一覧表の左から2番目(商品名)の列です。 (4)該当するセルがある行の左から3番目のデータをフォームのtextbox2に表示させたいと考えています。 下記のように考えていますが、どうもうまくいきません。ご指導の程宜しくお願い致します。(つい最近マクロを始めたばかりなので、とんでもない構文なのかもしれませんが、自分ではどこがどうダメなのかわかりません。) Private Sub CommandButton1_Click() Dim RangeA As Range Set RangeA = Worksheets("商品一覧表").Range("A1:J1000") UserForm1.TextBox2.Text = Application.WorksheetFunction.VLookup(TextBox1.Value, RangeA, 3, False) End Sub

  • EXCEL ユーザーフォームの2つのtextboxの値で検索

    久しぶりの投稿です。 今、EXCELのユーザーフォームのVBAで行き詰ってます。 お分かりの方宜しくお願いいたします。 まず、EXCELのシートが下の様にあります。   A        B         C         D 1 得+支店 得意先コード  支店コード     得意先名 2 1030401   10304         01         XXX乳業 3 20000    20000                   XXX商事本店 4 2000001    20000          01         XXX商事 A支店 (AのセルはB&Cで)   textbox1に得意先コード textbox2に支店コードを入力してコマンドボタンを押したら textbox3に得意先名を表示させるという事がしたいのですが 支店コードが入ってる時はよいのですが入ってない時 実行時エラー’1004’ WorksheetFunctionクラスのVLookupプロパティを取得出来ません。 となってしまいます。 VBAは下の様になってます  Private Sub CommandButton1_Click()   Set ADR = Worksheets("sheet1").Range("A2:C4") TextBox3 = Application.WorksheetFunction.VLookup(TextBox1 + TextBox2, ADR, 4, False) End Sub

  • エクセルによる照合と警告音

    エクセルとバーコードリーダーによって、在庫管理をしようと考えています。バーコードリーダーには、スキャンによって値が入力されるとPC上でtabキーを押す、という機能があるので、エクセルにリーダーで読み込んだ値が入力されたあと、次のセルに移動することができます。ですので、商品のバーコードを次々に読んでいって、エクセルのシート上にデータを蓄積させていきます。 この蓄積される行をsheet1につくった一覧表からcountif関数でチェック(shhet2にバーコード数値=商品名のリストがある)し、どの商品が何個あるかを数えていくようにしています。 =COUNTIF(10:10,Sheet2!D7)・・・(リーダーから入力される値が入る行:元リスト) お尋ねしたいのは、バーコードから入力される値が、元リストにあるかどうかを照合し、リストに無い値が読み込まれた場合にエクセル上で警告音を鳴らすようにできないのか?という事です。 小型のノートPCでこのエクセルを動かし、肩掛けかばんに入れてバーコードリーダーだけ手元に。という事を考えているので、警告ダイアログ等は出さす、音だけで知らせるようにしたいのです。 以上、よろしくお願いします。

  • keydownイベントを発生で他のフォームで受信

    VB初心者です。 よろしくお願いします。 バーコードリーダーで読み込んでtextboxに表示させる仕組みを作りましたが、バーコードリーダーが ないのでバーコードリーダーを読み込んだように疑似的にできるようなことを考えています。 考えとしては バーコードを読み込んで表示させる:フォームA  ・keydownイベントを受っとる  ・textboxに読み込んだ値を表示 バーコードを読み込んだように疑似的に動作する:フォームB  ・keydownイベントを発生させる  ・フォームBに入力した値をフォームAに渡す フォームAは作成できましたが、フォームBのようなことはできるのでしょうか。 どのようなイベントを使用したらいいかなど、アドバイスをいただけないでしょうか。 環境:VB2008 OS:Windows7

  • エクセルVBAのユーザーフォームにセルデータを

    Excel2007を使っています。 VBA初心者ですがユーザーフォームのテキストフォームにエクセル内のセルデータを表示させたいと考えています。 以下のコードをユーザーフォームのコードに書いてユーザーフォームを走らせましたがユーザーフォームは表示するのですがデータがまったく表示されません。 どなたかご教授いただけませんでしょうか。 Sub Farst() Dim Data1 As String Dim Data2 As String Dim Data3 As String Dim Data4 As String Dim Data5 As String Dim Data6 As String Dim Data7 As String Dim Data8 As String Dim Data9 As String Dim Data10 As String Dim ActiveRow As String ActiveRow = 4 With Worksheets("MDH,MDO") Data1 = .Cells(ActiveRow, 1) Data2 = .Cells(ActiveRow, 2) Data3 = .Cells(ActiveRow, 3) Data4 = .Cells(ActiveRow, 4) Me.TextBox1連番.Text = Data1 Me.TextBox2品番.Text = Data2 Me.TextBox3品番2.Text = Data3 Me.TextBox4品番3.Text = Data4 End With End Sub

  • excel マクロ vlookupがわかりません(泣)

    初心者です。 ほんとに迷宮にはいっていまい、提示のコードもめちゃめちゃですが ご回答頂ける方はいらっしゃいますでしょうか・・・ マクロのコード記載のある "A.xle" ファイルの"報告書"シートのE2セルに 外部ファイル(一覧.xls)からVLOOKで値をひっぱってきて入力させたいです。 Vlookで入力させたい値が複数あるので、一気にできたらと思っているのです。 Private Sub CommandButton111_Click() Dim wb1 As Workbooks Dim 範囲 As Range Dim 列番号 As Range Dim 検索値 As Range Range("E2") = TextBox1.Value   Set wb1 = Workbooks.Open("\\192.168.~\~\一覧.xls") Set 範囲 = \\192.168.~\~\一覧.xls 状況!A3:P3000 ←ここに外部ファイルを設定したいのですが、どう記述すればよいかわかりません。 列番号 = 11 検索値 = (Worksheets("報告書").Range("E2")) Range("D3").Value = WorksheetFunction.VLookup(検索値, 範囲, 列番号, False) Unload Me End Sub どうぞ、ご教授宜しくお願い致します。

  • エクセルマクロでバーコードを読みたい

    こんにちわ! エクセルマクロを使って在庫管理をできるものを作ろうと思っています。 そこで、USBバーコードリーダーなるものを発見したのですが、こういったバーコードリーダーをエクセルマクロを用いて読み取ることは可能でしょうか? 可能なようでしたら、その方法をご教授願います。 また、お勧めのバーコードリーダーがございましたら教えてください。(2次元バーコード(QRコード)リーダーは高いので、今のところ通常のバーコードで考えています)

  • Excel VBA ユーザフォームの検索について

    添付の画像のようなユーザフォームを作っています。 TextBox1に検索ワードを入力して、CommandButton1をクリックすると、下のComboBox1に一覧が出るようにしたいと思い、ほかのサイトから下記のコードを見つけて、作ってみました。参照先のsheet2を表示しているときは大丈夫なのですが、別のシートを選んでいるとエラーになります。 sheetは3つあり、それぞれ違うリストが入力されています。今回はsheet2のリストを参照したいのですが、最初はsheet1が表示されている状態で実行したいです。 エラーの内容は 実行時エラー9 インデックスが有効範囲にありません。 コチラがコードです。 Private Sub UserForm_Initialize() Dim i As Long, imax As Long Dim tbl() As Variant imax = ThisWorkbook.Worksheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Row ReDim tbl(imax) For i = 1 To imax tbl(i) = Range("A" & i).Value Next i With ComboBox1 .List() = tbl() End With End Sub Private Sub CommandButton1_Click() Dim i As Long, imax As Long Dim tbl() As Variant Dim cnt As Long, j As Long j = -1 With ThisWorkbook.Worksheets("sheet2") imax = .Cells(Rows.Count, "A").End(xlUp).Row cnt = Application.CountIf(Range("A1:A" & imax), "*" & TextBox1.Text & "*") ReDim tbl(cnt) For i = 1 To imax If InStr(.Range("A" & i), TextBox1.Text) > 0 Then j = j + 1 tbl(j) = Range("A" & i).Value ←この部分がエラーになる End If Next i End With With ComboBox1 .List() = tbl() End With End Sub どこを直せば良いか、教えてください。 よろしくお願いします。

  • ユーザーフォームでの登録&編集

     ユーザーフォームのリストボックス(RowSource,P6:A26)で選択し14個のテキストボックスで編集しコマンドボタンでSheet(P6:AC26)にコピペしていますが、下記のコードだと無制限に登録されてしまいます。Sheetの範囲内で登録&編集のコードの書き方がありましたらご教示賜りたく存じます。(番号は自動入力でなくてもいいです。) Windows7・SP1 Office2010 Private Sub CommandButton2_Click() Dim varRag As Variant Dim myArray As Integer Dim i As Long varRag = Array(txtID, txtTextBox2, txtTextBox3, txtTextBox4, txtTextBox5, txtTextBox6, txtTextBox7, txtTextBox8, txtTextBox9, txtTextBox10, txtTextBox11, txtTextBox12, txtTextBox13, txtTextBox14) If TextBox3.Text = "" Then MsgBox "登録すべき内容がありません!", vbExclamation, "確認" Exit Sub End If Application.ScreenUpdating = False Application.Calculation = xlCalculationManual If ListBox1.ListIndex = -1 Then 'リストが選択していなかったら、 Cells(Rows.Count, 16).End(xlUp).Offset(1).Select For myArray = 0 To 9 With Selection txtID = .Row - 5 .Offset(, myArray) = varRag(myArray) End With Next myArray Else i = ListBox1.ListIndex + 6 Range("P" & i).Value = i - 5 Range("Q" & i).Value = TextBox2.Text Range("R" & i).Value = TextBox3.Text Range("S" & i).Value = TextBox4.Text Range("T" & i).Value = TextBox5.Text Range("U" & i).Value = TextBox6.Text Range("V" & i).Value = TextBox7.Text Range("W" & i).Value = TextBox8.Text Range("X" & i).Value = TextBox9.Text Range("Y" & i).Value = TextBox10.Text Range("Z" & i).Value = TextBox11.Text Range("AA" & i).Value = TextBox12.Text Range("AB" & i).Value = TextBox13.Text Range("AC" & i).Value = TextBox14.Text End If 'データをクリア ListBox1.ListIndex = -1 ID.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" TextBox7.Text = "" TextBox8.Text = "" TextBox9.Text = "" TextBox10.Text = "" TextBox11.Text = "" TextBox12.Text = "" TextBox13.Text = "" TextBox14.Text = "" Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub Private Sub ListBox1_Change() Dim targetRow As Integer With ListBox1 targetRow = .ListIndex ID.Text = .List(targetRow, 0) TextBox2.Text = .List(targetRow, 1) TextBox3.Text = .List(targetRow, 2) TextBox4.Text = .List(targetRow, 3) TextBox5.Text = .List(targetRow, 4) TextBox6.Text = .List(targetRow, 5) TextBox7.Text = .List(targetRow, 6) TextBox8.Text = .List(targetRow, 7) TextBox9.Text = .List(targetRow, 8) TextBox10.Text = .List(targetRow, 9) TextBox11.Text = .List(targetRow, 10) TextBox12.Text = .List(targetRow, 11) TextBox13.Text = .List(targetRow, 12) TextBox14.Text = .List(targetRow, 13) End With End Sub

  • エクセル ユーザーフォームでVLOOK

    ユーザーフォームのテキストボックスで、ご教示お願いいたします。 現在、以下のようなコードこちらで教えていただきセルに入力をしております。 テキストボックス5に値を入れ、 listのシートから該当する文字をテキストボックス6に表示させたいと思っております。 ■現在のコード '// Private Sub CommandButton1_Click() Dim LastRow As Long 'ここはキャメル形式やパスカル形式にします/大文字は定数です。 Dim i As Long '/テキストボックスに値があるか調べる For i = 1 To 7 Next i '/セルに書き込み With Worksheets("Sheet1") LastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 For i = 1 To 7 .Cells(LastRow, i).Value = Me.Controls("TextBox" & i).Value Next End With '/TextBox1-7をクリア If MsgBox("テキストボックスを空にしてよろしいですか?", vbQuestion + vbYesNo) = vbYes Then For i = 1 To 7 Me.Controls("TextBox" & i).Value = "" Next i End If 'TextBox1にフォーカスを移動 Me.TextBox1.SetFocus End Sub ■付け足したいコード Private Sub textbox5_change() Dim temp, x temp = Me.textBox5.Value If IsNumeric(temp) Then temp = Val(temp) x = Application.VLookUp(temp, Sheets("list").Range("a1:b20"), 2, False) If Not IsError(x) Then Me.TextBox6.Value = x Else MsgBox Me.TextBox5.Value & " はリストにありません" End If End Sub 【質問内容】 付け足したいコードは上記の通りですが、どのように付け足せばいいのかが分からず、 困っております。 度々で申し訳ありませんが、テキストボックス5の値を見て、 テキストボックス6に表示させるやり方をご教示お願いいたします。

専門家に質問してみよう