• ベストアンサー

エクセルVBAでデータ検索について

顧客情報の管理をしようと思っています。 (マクロ初心者です) エクセルのシートを2つに分けて、1つは顧客情報を入力したり検索したりするシート、もう1つは入力した顧客情報を蓄積するシートです。顧客情報を蓄積シートから検索する時に、顧客番号から検索するのですが、それ以外に検索したい時や番号にローマ字が入っている時はどのようなVBAを組めばよいですか? 今参考書のとおりやっていると、 tmpInt = Sheet("入力").Range("C4").Value でエラーが出てしまいます。 数値しか検索しないようになっているからだというのはわかるのですが、それに変わるマクロがわかりません。 教えてください。 また昨日本屋に行き、このような時に対処できる本を探しましたが見つかりませんでした。何か良いのがあれば教えてください。

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

  • ベストアンサー
  • wakky_tom
  • ベストアンサー率40% (20/50)
回答No.3

こんにちは #1です。ちょっと誤った事を書いてしまいましたので、訂正します。 エラーの内容を見ないと何とも言えませんが、もし「型が一致しません」と出るようですと、変数の定義で数値型をしている可能性があります。 変数の定義とは、DimやPublicであらかじめ使用する変数(この場合ですとtmpIntとなります)をこのデータ型で使用します、と決めることです。 何故このようなことをするかというとメモリ領域の節約の為です。 もし現在、Dim(若しくはPublic) tmpInt As に続くデータ型として、Integer、Long等を使用しているようでしたら、Stringに変えてみて下さい。

frenchpag
質問者

お礼

ありがとうございます!!!!! IntegerをStringに変更してみたら出来ました!!! ホントありがとうございます。 この「教えて!goo」を初めて使ってこんなすぐに解決するなんてうれしいです。

その他の回答 (2)

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

シート名「入力」シートのC4セルに例えば11aaa12 と入れて、下記を実行して見ました。 なお= Sheet("入力").Range・・はSheetの後に sが必要です。 Sub test01() tmpInt = Sheets("入力").Range("C4").Value MsgBox tmpInt End Sub でエラーにはなりませんでした。 Sub test01() Dim tmpInt As Integer tmpInt = Sheets("入力").Range("C4").Value MsgBox tmpInt End Sub では「型が一致しません」のエラーになります。 こう言う類の原因でしょうか。

frenchpag
質問者

お礼

回答頂きましてありがとうございます。 別の方法で解決致しましたが、初めて「教えて!goo」を使ってみて、こんなにすぐに知らない方に教えていただけるとは感激です。どうもです。

  • wakky_tom
  • ベストアンサー率40% (20/50)
回答No.1

こんにちは .Valueをとってみたらいかがでしょう? それかtmpIntの変数を定義しているのでしたら、そこを変える必要もありますが・・・。

関連するQ&A

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

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

  • エクセルの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 これの,どこにどのようなプログラムを追加したらいいのでしょうか。 よろしくお願いします。

  • VBAの検索入力

    FAX送信を簡単にしようと思い。VBAにて まず、シート2に顧客データを入力し シート1で1クリックで選択フォームから選んで、顧客名、FAX番号電話番号等がが出るようにはできたのですが、顧客データが多すぎて、フォームから選ぶのが大変で、検索項目を作り絞り出したやつから選ぶにしたいのですがなかなかうまくいきません。よい方法がありますか?

  • エクセル2000VBA 情報の検索について

    いつもお世話になります。 sheet1は商品情報検索画面で、sheet2は、データのマスターです。 sheet1のセル"D4"に商品コードを入力し、マクロを起動することで、sheet2の商品コード(A列)の同じ情報を検索し、その次のセルの商品コードを表示させたいのです。(ややこしくてすみません) 自分なりに考えてコードを作ってみたのですが・・・ Dim sh2, sh3 As Worksheet Dim temp As Variant Set sh2 = Worksheets("sheet2") Set sh3 = Worksheets("sheet1") d = sh2.Range("A1").CurrentRegion.Rows.Count Set temp = sh2.Range("A2:A" & d).Find(What:=sh3.Range("D4").Value) For l = 2 To d If Not temp Is Nothing Then sh3.Range("D4").Value = sh2.Cells(l, 1).Offset(1, 0).Value ElseIf temp Is Nothing Then sh3.Range("D4").Value = sh2.Range("A2").Value End If Next l 以上だと、次々に情報が更新され、結局最終行の空白が答えになってしまいます。 以上宜しくお願い致します。

  • VBA 重複する番号があるときは値を貼り付けない

    すみません。 理解しているのが少しなので、ちょっとシンプルなVBAを書いています。 1つのブックに 登録シート =Sheets("登録")           顧客情報シート=Sheets("顧客情報")          販売情報シート=Sheets("販売情報")          売り上げシート=Sheets("売り上げ") 登録シートのボタンを押すと、登録シートに入力した情報が、 各シートに分かれて値が入るようにしています。 下記がコードです。 Private Sub CommandButton1_Click() Dim row As Integer ★★★ row = WorksheetFunction.CountA(Sheets("顧客情報").Columns(2)) + 1 Sheets("顧客情報").Cells(row, 2).Value = Range("A2").Value Sheets("顧客情報").Cells(row, 3).Value = Range("A5").Value Sheets("顧客情報").Cells(row, 4).Value = Range("B8").Value ★★★ row = WorksheetFunction.CountA(Sheets("販売情報").Columns(2)) + 1 Sheets("販売情報").Cells(row, 2).Value = Range("C26").Value Sheets("販売情報").Cells(row, 3).Value = Range("J1").Value row = WorksheetFunction.CountA(Sheets("売り上げ").Columns(2)) + 1 Sheets("売り上げ").Cells(row, 2).Value = Range("H1").Value Sheets("売り上げ").Cells(row, 3).Value = Range("K6").Value End Sub もっと簡単な書き方あるよ。。。と言われるでしょうが、 私が理解して修正等ができるのが、上記でした。。 やりたいことは、2点です。 (1)重複は貼り付けをしない。  登録シートのセル A2に入った数字が、顧客情報シートのB列のどこかに、  既に入力がされていた場合は、★★★で囲まれた部分の値を貼り付けず、  その先の販売情報のシートに貼り付ける作業へと進めたい。  IF などを使えばできますでしょうか?   (2)各シートに入力したものを貼り付けた際、A2より下から順番に各シートのCells(row, 1)の位置に、連番をつけたい。 何卒宜しくお願い申し上げます。

  • エクセルVBA(マクロ)の書き方で・・・

    VBA初心者です。よろしくお願いします。 エクセルマクロで、次のような関数を入力して、 =IF(月!$D4=稼動シート!$B$2,月!B4,"◆") 自動記録をさせると コードは、次のような「絶対参照セル」(←表現あっていますか?)の表示になります。 『Range("C4").Select ActiveCell.FormulaR1C1 = "=IF(月!RC4=稼動シート!R2C2,月!RC[-1],""◆"")"』 わたしのスキルでは、この記述コードを参考に別のコードを書こうにも理解と応用が効きません。 そこで、VBAコードにも 『Range("C4").Select  =IF(月!$D4=稼動シート!$B$2,月!B4,"◆")』 と単純に書いてはいけないのでしょうか?また、どうすれば実際のシートで入力した関数と同じような表現でVBAにもかけるのでしょうか? ご指導お願いいたします。

  • エクセルでの検索について

    初めて質問させていただきます。 エクセルシートに1万個程度の番号が 縦(行)に並んでいます。なお、番号はそれぞれ異なります。 あるフォームに日付と10個の異なる番号を入力すると、 エクセルシートから合致する番号を検索し、 エクセルシートの一行目に日付が自動的に入力され、 その行を色塗りしたいと考えております。 これをVBA(マクロ)にて作成したいのですが、 初心者なのでどのようにやればよい分かりません。 どうか教えていただけないでしょうか。 よろしくお願いします。

  • excel vbaの関数の使い方

    excel VBAでsumproduct関数を使いたいがでますのですがどうしても実行できません 何が原因でしょうか、どなたか教えてください。 ------------------------------------------------- 下記コードは実行できます。 Worksheets("集計").Range("j4").Value = WorksheetFunction.Sum(Worksheets("日常").Range("h4:h13")) 下記コードは型が違うとのコメントがでます。 Worksheets("集計").Range("j4").Value = WorksheetFunction.SumProduct((Worksheets("日常").Range("c4:c13") >= j2) * Worksheets("日常").Range("c4:c13") <= k2) * Worksheets("日常").Range("d4:d13") = l2 * Worksheets("日常").Range("f4:f13") = m2 * Worksheets("日常").Range("h4:h13") --------------------------------------------------------------------- ワークシートは、日常、集計、の二つがあります。 「日常」には、C4:H13にデータがあります。 c列に年月日、d列にコード番号、e列に購入箇所、f列にコード番号、g列に商品、h列に金額 が入力されています。 「集計」には、j2に開始日、k2に終了日、l2にd列のコード番号、m2にf列のコード番号、 が入力されています。 環境は、windows10 使用しています。 ----------------------------------------------------------- 以上の状況ですがvba でsumproduct関数を使いたいのですが実「実行」できません,たかどなたか教えて頂けませんか。

  • エクセルVBAの転記について

    エクセル2013VBAで最終行を取得しての転記が上手くいきません。どのようにすれば良いかご教授ください。 簡単なサンプルを下記します。 Sub サンプル入力からのDBへの転記() Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim myRow As Long Set Sh1 = Worksheets("サンプル入力") Set Sh2 = Worksheets("サンプルDB") With Sh2 myRow = Range("A" & Rows.Count).End(xlUp).Row + 1 .Range("A" & myRow).Value = Sh1.Range("D4").Value .Range("B" & myRow).Value = Sh1.Range("F4").Value End With End Sub 入力内容を変えないテストでは (1)実行するとDBへの転記は問題なく出来ます。 (2)継続してマクロを実行しても問題なく転記が行われ、同じデータが蓄積されていきます。 入力内容を変更して引き続きマクロを実行すると挙動不審に陥ります。 現象としては (1)初めの行に何度も重ねて転記を行う。 (2)空白行を作り、その行に何度も転記を行ってしまう。 (3)空白行を作り、それ以降転記を実行し蓄積を行ってしまう。 入力シートには結合セル、リストを使用していますが、原因究明を行う中でこれが原因とは思えませんでした。 これがクリアできないと先に進めません。ぜひお力を貸してください。 宜しくお願い申し上げます。

  • エクセルVBA抽出がうまく出来ません

    エクセル2013VBA初心者です。 入力シートからDBシートへ、DBシートから印刷シートへのデータ転記と印刷、入力内容のクリアまでは出来るようになりました。 DBシートの検索を行い、記録内容を入力シートに転記する抽出を行いたいのですが、下記構文を書いたところで問題が発生しました。 If Sh2.Range("A & i").Value = j And Sh2.Range("B & i").Value = k Then  でとまります。メッセージは ‘Range’メソッドは失敗しました:‘Workshieet’オブジェクトというものです。 やろうとしていることは、入力シートに設けた“E12”と”G12”の二つの検索項目をキーにDBシートの行を特定し、この行の内容を入力シートに反映しようということです。 入力シートの検索項目“E12”、 ”G12”はそれぞれDBシートのA列、B列に格納されている項目で、年度と連番です。サンプルとして入力シート"C5"に抽出しようとしているDBシートD列は申請者名です。 恐れ入りますがよろしくご教示頂きたく、お願い申し上げます。 Sub DBシートから力情報を抽出する () Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim i As Long Dim j As Long Dim k As Long Set Sh1 = Worksheets("入力") Set Sh2 = Worksheets("DB") j = Sh1.Range("E12").Value k = Sh1.Range("G12").Value With Sh2 For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row If Sh2.Range("A & i").Value = j And Sh2.Range("B & i").Value = k Then Sh1.Range("C5").Value = Sh2.Range("D & i").Value End If Next  End With End Sub

専門家に質問してみよう