エクセルのVBAで顧客番号を入力後の動作をカスタマイズする方法

このQ&Aのポイント
  • エクセルのVBAを使用して顧客番号を入力した後の動作をカスタマイズする方法についてご相談です。
  • 現在のVBAコードに追加することで、顧客番号の入力後に確認画面を表示し、OKを押せば番号が入力され、キャンセルを押せばメッセージボックスが閉じる機能を実装することができます。
  • 詳細な手順やサンプルコードについては、以下の要領で説明します。お手数ですが、ご参考にしてください。
回答を見る
  • ベストアンサー

エクセルのVBA

お世話になります。 ただ今,VBAで以下のことに挑戦していますが,行き詰ってしまいました。皆様のお知恵をお貸しください。 1.エクセルで,ある図形をクリックすると,インプットボックスが開き,「顧客番号を入力」と出ます。 2.顧客番号を入力すると,「顧客管理」というシートのD1セルにその番号が入力されます。 3.その顧客番号をもとに「顧客名簿」というシートのデータから,その顧客の住所や性別などのデータがvlookupで引っ張ってこられます。 そこでご相談です。上記の2の操作で,顧客番号を入力後,すぐにD1セルに番号が入力されるのではなく, メッセージボックスでの確認画面「○○さんのデータを表示しますか」(○○には顧客番号に該当する顧客名が入ります)というものを表示させ,OKを押せば,D1セルに番号が入力され,キャンセルを押せば,単純に,メッセージボックスが閉じる という機能を追加したいのですが。ちなみに,現在のVBAは以下の通りです。 Dim ans As String ans = InputBox("顧客番号を入力", "入力", "") If ans <> "" Then Sheets("顧客管理").Select Range("D1").Value = ans End If End Sub これの,どこにどのようなプログラムを追加したらいいのでしょうか。 よろしくお願いします。

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

  • ベストアンサー
  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.1

いや、単純にMSGBOX関数を使えばいいだけの話なんじゃ? 詳細は「Excel VBA MSGBOX」とかで検索して頂くとして。 Dim ans As String ans = InputBox("顧客番号を入力", "入力", "") If ans <> "" Then IF MSGBOX(Cstr(ans)&"さんのデータを表示しますか?",vbYesNo)=vbYes Then Sheets("顧客管理").Select Range("D1").Value = ans End IF End If End Sub チェックしてないですが、これで動くんじゃないかと。

参考URL:
http://officetanaka.net/excel/vba/function/MsgBox.htm
mine2309
質問者

補足

さっそく,ありがとうございます。 試してみたところ,メッセージボックスの確認画面が出てきましたが,顧客名ではなく,顧客番号での確認メッセージでした。 VBA初心者ですので,Cstrという部分を直せばいいのかな?という感じでしか,調整できません。もう少しご教授いただければ,幸いです。 よろしくお願いします。

その他の回答 (3)

  • NYAN99
  • ベストアンサー率35% (32/90)
回答No.4

>試してみたところ,メッセージボックスの確認画面が出てきましたが,顧客名ではなく,顧客番号での>確認メッセージでした。 >VBA初心者ですので,Cstrという部分を直せばいいのかな?という感じでしか,調整できません。 NO.1の方の回答で正しいです。 ですが、質問者さまの質問の意図に入力した顧客番号にヒットした顧客名を確認したいということが伝わっていないからです。 補足説明します。 Dim ans As String ans = InputBox("顧客番号を入力", "入力", "") ・・・(1) If ans <> "" Then <(2)> IF MSGBOX(Cstr(ans)&"さんのデータを表示しますか?",vbYesNo)=vbYes Then ・・・(3) Sheets("顧客管理").Select  Range("D1").Value = ans   End IF End If End Sub (1)で入力を促しansという変数には入力した顧客番号が入っています。 (1)で入力した顧客番号を元に「顧客名簿」というシートのデータから,その顧客の住所や性別などのデータがvlookupで引っ張ってこられます。 その引っ張った顧客名のセルは?どこに置かれますか? それを取得して(2)の所にセットし、 (3)のCstr(ans)の所を取得したセルに変えてあげれば、顧客名を確認出来ます。 vlookup参照 http://kokoro.kir.jp/excel/vlookup-false.html

mine2309
質問者

お礼

お礼が遅くなりすみません。 みなさんにいろいろと教えていただいたことを試したところ,望んでいたものに近いものができました。 ご協力ありがとうございました。 まだまだVBA初心者で,わからないことだらけですが,少しずつ勉強していきます。 こんごともよろしくお願いします。

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.3

ちょっと横入りを。 文章は長いですが、中身は薄いです^^; > メッセージボックスでの確認画面「○○さんのデータを表示しますか」(○○には顧客番号に該当する顧客名が入ります)というものを表示させ 顧客番号と顧客名の対応表はどこかに持っているという事でしょう。 おなじみ(?)VLOOKUP関数を使って行う、簡単な方法を。 Sub Test() Dim ans As String, ans2 As String     ans = InputBox("顧客番号を入力", "入力", "")         If ans = "" Then             MsgBox "顧客番号が空白です" & vbNewLine & _                "処理を中止します", vbOKOnly         Else             If WorksheetFunction.CountIf(Worksheets("対応表があるシート名").Range("顧客番号が入力されている範囲"), ans) = 0 Then                 MsgBox "顧客番号が登録されていません", vbOKOnly             Else                 ans2 = WorksheetFunction.VLookup(ans, Worksheets("対応表があるシート名").Range("対応表のセル範囲"), 2, False)                 If MsgBox(ans2 & " さんのデータを表示しますか", vbYesNo) = vbYes Then                     Sheets("顧客管理").Select                     Range("D1").Value = ans                 Else                     MsgBox "処理を中止します", vbOKOnly                 End If             End If         End If End Sub 「対応表のセル範囲」は、例えば「A1:B6」のように指定します。 その他の使い方はワークシート関数のVLOOKUPと同じです。 ちなみに・・「対応表」に「顧客番号」が無い場合は VLOOKUPがエラーを返して止まってしまいますので、 これまたおなじみ(?)のCOUNTIF関数で件数が0だと メッセージを出して止まる仕掛けを入れています。 文字列と数値をシビアに見てしまうので、変数ansのデータ型の扱いに注意しましょう。

mine2309
質問者

補足

ありがとうございます。 教えていただいたとおりに試してみましたが,ans2 = の行で「vlookupのプロパティを取得できません」というエラーが出てしまいました。 シート名や範囲も確認し,入力ミスが無いかも確認しましたが,うまくいきません。 聞いたことのないエラーなので,いろいろ調べてみましたが,解決法が見つかりませんでした。

  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.2

顧客名の入ってるセルの情報が無いので、これ以上の 回答は出来ませんが、発想だけ。 1.IF文の中で、セルD1に顧客番号を埋め込んでしまい、 Vlookupで呼び出された名前を何かの変数で受け取る 2.受け取った変数を使ってメッセージを表示する。 Cstrは「変数を文字列にする関数」ですから、ここを適当 いじる程度じゃ無理です。

mine2309
質問者

補足

説明不足ですみません。 顧客名の入っているシートは,A列に顧客番号,B列に顧客名,C列以降に顧客データが横にずーっと並んでいます。その顧客番号に該当する顧客名を表示させるということになります。 すみません。

関連するQ&A

  • vbaにvlookupを組み込む

    お世話になります。 エクセルのマクロにvlookupを組み込みたいのですが,エラーが出てしまいます。 用意したものは「顧客名簿」というシートで,A列に顧客番号(6ケタの数字),B列に顧客名が入っています。C列以降はその他のデータが入っています。 「トップメニュー」というシートにあるマクロボタン「顧客抽出」を押すと,インプットボックスが現れます。これに顧客番号を入力すると,メッセージボックスが現れます。 この時のメッセージボックスに,インプットボックスに入力された番号により「顧客名簿」から顧客名を取り出し,「○○さんのデータを表示しますか」としたいのですが,ここでエラーが出ます。(○○は,「顧客名簿」のB列にある名前です) 実行時エラー 1004 WorksheetFunctionクラスのVLookupプロパティを取得できません。 組んであるマクロは以下の通りです。 Sub 顧客抽出() Dim ans As String, ans2 As String     ans = InputBox("顧客番号を入力", "入力", "")         If ans = "" Then             MsgBox "顧客番号が空白です" & vbNewLine & _                "処理を中止します", vbOKOnly         Else             If WorksheetFunction.CountIf(Worksheets("顧客名簿").Range("A1:B5000"), ans) = 0 Then                 MsgBox "顧客番号が登録されていません", vbOKOnly             Else                 ans2 = WorksheetFunction.VLookup(ans, Worksheets("顧客名簿").Range("A1:B5000"), 2, False)                 If MsgBox(ans2 & " さんのデータを表示しますか", vbYesNo) = vbYes Then                     Sheets("顧客情報").Select                     Range("D4").Value = ans                 Else                     MsgBox "処理を中止します", vbOKOnly                 End If             End If         End If End Sub 途中にある ans2 = WorksheetFunction.VLookup(ans, Worksheets("顧客名簿").Range("A1:B5000"), 2, False) の部分でエラーが出るのですが,解決策が見当たりません。 おそらくRange("A1:B5000")の部分に不具合があると思うのですが,どう対処すればいいでしょうか。 詳しい方,ご教授願います。

  • エクセルVBA 別シートからのコンボボックス連動

    エクセルVBA 別シートからのコンボボックス連動について Book1(多人数入力用ブック) ・入力シート ・データ用シート Book2(反映用ブック) ・シート1 Book1にコンボボックスが2列 テキストボックスが2列 * 6行のユーザーフォームを作成しました。 コンボボックス1 コンボボックス2 テキストボックス1 テキストボックス2 コンボボックス3 コンボボックス4 テキストボックス3 テキストボックス4 ・ ・ ・ 左のコンボボックスで「あ」が選ばれたときには、右のコンボボックスで「あ行の顧客」・・・というように連動させたいと考えております。 データ用シートのデータは、   A      B          C 1 あ あ行で始まる顧客 か行で始まる顧客 2 か 3 さ 4 た 5 な 6 Private Sub UserForm_Initialize() Dim c As Range ComboBox1.RowSource = "データ用シート!A1:A9" End Sub Private Sub ComboBox1_Change() 'Dim Rng As Range 'Dim i As Long i = ComboBox1.ListIndex If i > -1 Then Dim c As Range Set Sh = Worksheets("データ用シート") Set Rng = Worksheets("データ用シート").Range("B2:I30") ComboBox2.Value = "" ComboBox2.RowSource = Rng.Columns(i + 1).Address End If End Sub 上記コードですと、コンボボックス2が入力シートのデータを表示してしまいうまくいきません。 欲をいえば、 Book1(多人数入力用ブック)入力シートの特定セルに コンボボックス2・テキストボックス1 コンボボックス4・テキストボックス3というように続けて1セルに反映 Book2(反映用ブック)シート1に コンボボックス2・テキストボックス1・テキストボックス2 を各1セル 1行に反映させたいと考えております。 まったく知識がないのですが 仕事上どうしても必要となったので、各種サイトを見よう見真似でやっております。 ご助力いただければ幸いです。

  • エクセルのVBAについて

    初めて質問します。 VBA初心者で勉強中なのですが教えてください! sheet1に下記 顧客番号 物件名 4月 5月 6月 0 31 0 1111 神戸 1,200 1,300 0 31 0 1112 大阪 1,300 1,400 0 31 0 1113 名古屋 1,500 1,600 0 31 0 1114 熊本 1,600 1,700 0 31 0 1116 群馬 1,650 1,600 sheet2に下記 顧客番号 物件名 6月 0 31 0 1111 神戸 1,600 0 31 0 1113 名古屋 1,800 0 31 0 1114 熊本 1,900 0 31 0 1115 北海道 1,800 0 31 0 1116 群馬 1,700 の二つのシートがありsheet2のデータを全コピしてsheet1のデータに上書きで貼り付けたら 又はsheet3に下記完成形  顧客番号 物件名 4月 5月 6月  0 31 0 1111 神戸 1,200 1,300 1600  0 31 0 1112 大阪 1,300 1,400  0 31 0 1113 名古屋 1,500 1,600 1800  0 31 0 1114 熊本 1,600 1,700 1900  0 31 0 1115 北海道 空白 空白 1800  0 31 0 1116 群馬 1,650 1,600 1700 を作りたいのですが、なにかいい方法はありますでしょうか・・・ 今後も7月8月とデータは増えていきます(空白は空白セルです) 6月データがない所も残しつつ、新規に6月からデータができたとこも追加して 重複してるのはそのまま6月分を追加したい感じです。 わかりにくい説明かもしれませんが、ぜひお願い致します。

  • Excel VBA Worksheet_Change イベントについて

    Excel VBA Worksheet_Change イベントについて質問です。 セルH8とI8を結合し、入力規則よりリストボックスを配置しました。 本シートにWorksheet_ChangeをVBAで作成しましたが、 セルH8:I8をDeleteすると実行時エラー13が発生します。 If Target = "" then exit sub end if や If Target.value = "" then exit sub end if や If Target <> "" then 処理 end if としても対処できませんでした。 よい対処方法のアドバイスよろしくお願いします。

  • エクセルVBA初心者です。

    エクセルVBA初心者です。 「テキストボックスとコマンドボタンを使って、シートのA列にあるセルの文字列を左から検索する」という事をやりたいのですが、うまくいきません。お教えください。ちなみにCtrl+Fではなく、VBAで。 Private Sub TextBox1_Change() Dim R As Range With ActiveWorkbook.Worksheets("Sheet名") Set R = .Columns(3).Find(Me.TextBox1.Value) End With If R Is Nothing Then MsgBox "該当セルなし" Else R.Activate End If Set R = Nothing End Sub としましたが、テキストボックス入力+Enterで出来てしまい、コマンドボタンが機能しません。また、BackSpaceやDelをすると、他のセルに飛んでしまいます。????

  • 【VBA】一番初めの処理に戻って、処理を繰り返す。

    VBA初心者です。 コードはネットで調べて組み合わせて作っております。 今回は、組み合わせたコードで処理が終わってもフォルダ内のファイル数の数だけ処理を繰返したいです。 事前に作っているコードは、 ①データ読み取りをしたいExcelを開く、別ブックを開いて該当のセルに入力。セル自体に数式が入っているので各シートに反映されます。 ②inputboxで各シートの該当セルに表示させたい文字を入力。 ③3、4枚目のシートを選択。 ④名前をつけて保存する。 という作業のコードになっています。 ①~④までを行った後に、データ数に応じて処理を繰返し行いたいです。 下記のコードにしたところ、Nextに対応するForがありません。とエラーが出ます。End Ifは追加しているのにエラーが起きるのはなぜでしょうか? ---下記 コード--- Sub マスターデータ取込03() '選択したファイルを取り込み、別のファイルに貼り付ける。 For Each f In fso.GetFolder(folderpath).Files If fso.GetExtensionName Like "xls?" Then Set wb = Workbooks.Open(f) Dim RC As Integer Dim OpenFileName, FileName, Path, SetFile As String Dim wbMoto, wbSaki As Workbook Set wbMoto = ActiveWorkbook 'マスターデータ取り込み元をセット Application.DisplayAlerts = False RC = MsgBox("マスターデータ取込みますか?", vbYesNo + vbQuestion, "確認") If RC = vbYes Then OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") 'ダイアログボックスを表示して、マスターデータファイルを指定します。 If OpenFileName <> "False" Then SetFile = OpenFileName Else MsgBox "キャンセルされました" Exit Sub 'マスターデータの取り込みをキャンセル End If Workbooks.Open FileName:=SetFile, ReadOnly:=True, UpdateLinks:=0 'ダイアログボックスで指定したマスターデータファイルを開きます。 Set wbSaki = Workbooks.Open(Path & SetFile) 'ワークブック間のシート「項目」をコピーします。 wbSaki.Worksheets("内訳書").Range("D:O").Copy wbMoto.Worksheets("見積入力").Range("U7").PasteSpecial xlPasteValues Application.CutCopyMode = False 'コピー切り取りを解除 wbSaki.Close False 'マスターデータ取り込み先のファイルを閉じる Else MsgBox "処理を中断します" End If Application.DisplayAlerts = True Dim ans As String ans = InputBox("見積書・請求書No", "", "") If ans <> "" Then wbMoto.Worksheets("見積").Range("I3").Value = ans Worksheets("見積").Range("I3").Value = "VHM-" & ans End If Application.DisplayAlerts = True ans = InputBox("見積書発行日", "", "") If ans <> "" Then wbMoto.Worksheets("見積").Range("F11").Value = ans End If ans = InputBox("完工日", "", "") If ans <> "" Then wbMoto.Worksheets("請求").Range("F11").Value = ans End If ans = InputBox("請求書発行日", "", "") If ans <> "" Then wbMoto.Worksheets("請求").Range("F12").Value = ans End If Worksheets(Array(2, 3)).Select ' 1 番目と 2 番目のシートを選択 Dim xFile xFile = Application.GetSaveAsFilename( _ FileFilter:="Excelファイル, *.xlsm") If TypeName(xFile) <> "Boolean" Then ActiveWorkbook.SaveAs FileName:=xFile End If Next End Sub

  • エクセル この場合のVBAの書き方教えてください。

    顧客情報がsheet2にデータベース化されていて、そのシートのR列に管理上、属性によって顧客を分類する番号が1から8までそれぞれ入力されています。 教えていただきたいのは、シート1上でその分類の数字を入力すれば、別シート、例えばsheet3にそれに該当する顧客だけをsheet2と同じ書式で自動でコピーしてくれるマクロを作りたいのですが、詳しい方いましたらご面倒でしょうがVBAのコードをそのままコピーできるように書いていただけないでしょうか? 情報が不足でしたら補足させていただきますので宜しくお願いします。

  • エクセルVBAについて

    エクセルVBA についての質問です。 この問題の答えを教えて頂きたいです。 次の条件を満たすプロシージャを作成してください。 1、ダイアログボックスに最初に市外局番なしの電話番号を入力すると、 先頭に小文字の「a]をつけた電話番号が自動的に、セルB3に入力される。 2、ダイアログボックスでキャンセルを押すと、 電話番号を入力してください、というメッセージボックスが表示される。 3、セルB3の値が「a1234567890」のとき、セルB3が赤の太字になり、 さらにセルC3に「検証用です」と入力される。 この問題の正解となる式を教えてください。 どこが間違っているかがわからず困っております。 よろしくお願いいたします。

  • エクセルVBAの構文を教えてください。

    こんばんは。マクロ初心者です。 VBAの構文を教えてください。 ■シート(1)には項目が50ある5年分(60ヶ月)の市場統計データーがあります。50個ある項目名はB列にありDセル2008年1月からBKセル2012年12月まで横に60ヶ月分のデーターを入力しています。 ■シート(2)には50の項目名のデータがあります。項目名はB列にあります。 ■シート(3)にはコンボボックスを作成し、コンボボックスの下に表を作成しました。 シート(3)のコンボボックスの50ある項目から▼ボタンで項目を選びコマンドボタンを押すと シート(3)の下記のセル範囲でシート(1)のデーターを参照させたいのです。 B8セルからM8セルまで(2008年度12か月分のデータ) B11セルからM11セルまで(2009年度12か月分のデータ) B14セルからM14セルまで(2010年度12か月分のデータ) B17セルからM17セルまで(2011年度12か月分のデータ) B20セルからM20セルまで(2012年度12か月分のデータ) コンボボックスは設定できたのですが、構文がうまくできないため参照できていません。 エクセルVBAに詳しい方、どうぞご教授ください。よろしくお願い致します。

  • エクセルVBA「型が一致しません」

    エクセルVBA「型が一致しません」 これまで作成してきたVBAを明日から使用します。 最後に一つ、ご回答頂きたいのですが、 Dim a As Long a = Me.LabelCompany.Caption If a = 0 Then MsgBox "このベルマークは失効しています。失効していない場合は「ベルマーク番号シート」を編集してください。なお、失効後半年以内のベルマークは有効です。" End If このようなコードを書いたのですが、タイトルのエラーを吐いてしまいます。 「LabelCompany」に何も入力されていなければメッセージボックスを表示するという動作に持って行きたいです。御指南お願いします。

専門家に質問してみよう