EXCEL VBA 他のブックを検索し、値を代入する方法

このQ&Aのポイント
  • EXCEL VBAを使用して、他のブックを検索し、値を代入する方法について教えてください。
  • 具体的には、2つのブック間で顧客コードを検索し、一致した場合に作業員コードを顧客マスタの備考フィールドに代入する処理を実装したいと考えています。
  • 何か良い方法やヒントがあれば教えてください。
回答を見る
  • ベストアンサー

EXCEL VBA 他のブックを検索し、値を代入する方法

EXCEL VBA 他のブックを検索し、値を代入する方法 下記の様な2つのブックがあった時に ブック1(入力用) 顧客コード,作業員コード,チェックボックス ブック2(顧客マスタ) 顧客コード,顧客名,顧客住所,備考 ブック1は日報の様な物です。 ブック2は顧客マスタの様な物です。 ブック2に登録されている顧客数が10件とすると、ブック1は顧客コードを 名前としたブック名で計10個創成されています。 ブック1のチェックボックスにチェックを入れると、ブック1の顧客コードをブック2の顧客コードの中から検索し、そのレコードの「備考」フィールドにブック1の作業員コードを代入する、といった処理を行いたいのですが、 「他のブックを開けて」の後の「検索をかけて、ヒットしたらそのいくつとなりのセルに値を代入」の 記述の仕方が分かりません。 どなたかご教授よろしくお願いします。

  • msn-q
  • お礼率80% (4/5)

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

ブック2の列位置が分からないのですが、Aからと仮定します。 Sub 処理(ByVal 顧客コード As String, _        ByVal 作業員コード As String) Dim ブック As Workbook Dim シート As WorkSheet Dim 一致 As Range Dim 行 As Long Set ブック = Workbooks.Open("~.xls") Set シート = ブック.WorkSheets(1) Set 一致 = .Columns("A:A").Find(顧客コード) If 一致 Is Nothing Then     MsgBox "そのような顧客はいません" Else     シート.Cells(一致.Row, 4) = 作業員コード     ブック.Save End If ブック.Close End Sub

msn-q
質問者

お礼

ありがとうございます、出来ました! なるほど、Rowを使って行を割り出す訳ですね。勉強になりました。 Set 一致 = .Columns("A:A").Find(顧客コード) の所は.Columnsがうまく動いてくれなかった為変数を用意して回避しました。 助かりました、ありがとうございます!

その他の回答 (1)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

ワークブックをOpenすると、Workbookオブジェクトが返ってくるのでそれを取得します。 Dim targBook As Workbook Set targBook = Application.Workbooks.Open(...) で、このWorkbookオブジェクト内のWorksheetsコレクションから検索対象とするWorksheetを選択し、検索範囲をRangeで取得してそのRangeでFind、というのが検索の流れです。 Dim targSheet As Worksheet Set targSheet = targBook.Worksheets(...) Dim targRange As Range Set targRange = targSheet.Range(...) Dim foundCell As Range Set founcCell = targRange.Find(...) ここまでで対象セルが判明するので、あとはその隣のセルに値を書き込む訳です。

msn-q
質問者

お礼

ありがとうございます、おかげで解決致しました。 >このWorkbookオブジェクト内のWorksheetsコレクションから検索対象とするWorksheetを選択し、検索>範囲をRangeで取得してそのRangeでFind、というのが検索の流れです。 この部分は非常に分かりやすくて頭の中の霞が晴れたようです。 本当にありがとうございました!

関連するQ&A

  • テキストボックスの値を変数に代入したい。

    テキストボックスの値を変数に代入したいのですが、どういうコードを書けばいいですか? 例えばTextBox1の値を変数xに代入したいのですが。

  • エクセルVBAでブックの分割

    下記のようなデータがあります。 支店code 顧客名 属性 顧客コード A01 ああああ 1 0123456 A01 いいいい 1 0123457 A01 うううう 2 A01 ええええ 1 0123459 A55 かかかか 1 A55 きききき 2 0123461 A55 くくくく 3 0123462 B22 ささささ 4 0123463 B22 しししし 1 0123464 C56 たたたた 2 0123465 D88 なななな 1 0123466 全部で約800件ほどです。実際には顧客コード以降にも多くのデータがあります。 これを支店コードごとに別ブックに分割し、さらに顧客コードごとにそれぞれ別シートにしたいのです。(シート名は顧客名) 中には顧客コードが未記入のものがあり、その場合はそのデータは無視します。 とても手におえません。お助けいただけると幸いです。

  • ACCESSで値を代入できないとは?

    ACCESS2000を使用しています。 フォームを作り、画面のテキストボックスに値を入れると、エラーになります。 エラーコードは 2448。 エラーメッセージは オブジェクトに値を代入できない と出ますが、ヘルプが参照できません。 どういうことなのでしょうか。

  • エクセルVBA 検索データの表示方法

    大変困っているので、どなたか教えてください。顧客管理ツールを作っています。 顧客データを保有するエクセルブックAがあり、1顧客につき51個のデータを持っています。オートフィルタのあいまい検索によりヒットしたデータを別のエクセルブックBの(シート名:HITDATA)へコピーします。 (シート名:HITDATA)に抽出された各顧客データを同じブックBの(シート名:USER)に1顧客ごとの情報がわかるようにデータを表示させます。そして「次へ」「前へ」「最初へ」「最後へ」のコマンドボタンを押すことで、(シート名:HITDATA)に抽出されたそれぞれのデータ参照からの表示をコマンドボタンの意味通りに変更させたいのですが、どうすればいいのでしょうか? 「最初へ」と「最後へ」は、End(elUP)とEnd(elDown)を使って何とかできるのですが、「次へ」と「前へ」が出来ません。どのようなコードを書けばよろしいか、どなたか教えてください。

  • エクセルで別ブックを検索するマクロ、VBA

    エクセルで以下の処理を行えるマクロを作成したいです。 当方、マクロについてほとんど知識がありません。 恐縮ですが、教えていただけると嬉しいです。 ・主にしたいこと  [検索]ブックで一致するコードを探して、  [結果]ブックの対応するコードの行にそれぞれの項目を返したい。 ●ブック1 [検索]  シートが12個あります(それぞれ、1、2、3…12というシート名=1~12月分)  ↓各シートの内容    A    B    C    D 1  氏名  数値  コード  内容 2  abc   111  SS1234 あいうえお 3  bcd   123  SS3456 かきくけこ ・ ・ ・ といった感じです。 12個のシートの中身はそれぞれ似たようなものですが、 「コード」や「内容」などは少しずつ違います。 ●ブック2 [結果]  ↓シートの内容    A    B    C    D 1  氏名  コード  内容  数値 2      SS3456 3      SS1234 ・ ・ ・ といった感じです。 (注)検索用ブックとは列の並びが異なっています。 ここでやりたいことの詳細ですが、 ・[結果]ブックの「コード」(B列)にコードを入力すると、  [検索]ブックで一致するコードを検索し、  A列「氏名」、C列「内容」、D列「数値」に、[検索]シートの内容を  自動的に表示させたい。  (ただし[結果]ブックに入力した「コード」は、[検索]ブックの1~12のうち、   どのシートにあるかわからない) ・入力したコードが見つからない場合は何も表示しない。 ということです。 最初VLOOKUP、MATCH等の関数で表示することを考えましたが、 シートが複数にまたがっているのと、 列の並び方が[検索][結果]ブックで違うのでわかりませんでした。 長くなってしまい申し訳ありませんが、どうかおしえてください。 よろしくお願いします。

  • Excelでブックを検索し表示する方法

    Excelで、複数のブックをひとつのフォルダに入れています。 この中のSTRAT.xlsのSheet1に通し番号とファイル名(*.xls)を記入して管理しています。 このSTART.xlsにテキストボックスとボタンを挿入して、管理番号を入力しボタンを押すとSheet1で通し番号(管理番号)と対応したブックが開くマクロを作りたいのですがどうすればいいのでしょうか? いろいろ調べたのですが、ブックやシート内の値の検索方法は、いろいろな方が質問しておられるのですが、私のやりたいことが見当たりません。 初歩的なことで手間取っているのかも知れませんが、ドンドン深みに嵌まってるような気がして書き込みさせていただきました。 ご存知の方、ご教示お願いいたします。

  • セッション変数への値の代入方法について

    レガシーASPでチェックボックスやラジオボタンをクリックしたら サブミット等のページ遷移ではなく同じページ内で即座にその値を セッション変数へ代入させる方法はあるのでしょうか?

  • エクセルVBA コンボボックスの値から検索したい

    エクセル・VBAで商品検索をしようとしているのですが行き詰ってしまい、皆様のお知恵を拝借できればと思い質問させていただきます。 ・現状 1.商品マスタ シートにJANコード・商品名・規格その他を入力しています。 2.ユーザーフォームを使い、商品名(一部分)を入力・検索したら、その商品の商品名・規格がコンボボックス上に表示される(2列分の情報を出力しています) 3.当てはまる商品を選択し、コマンドボタンを押したら、その商品のJANコードや商品名・規格・価格などが出力されるようにしたい 現在2.まではなんとか作成したのですが、3.の操作をどうすれば良いかわからず悩んでおります。 コンボボックスに格納されたデータは配列形式で、findメソッドを使って引っ張ってきているのですが、選択したデータからもともとの商品マスタのセルを割り出す操作があるのかどうかも分かりません。 独学でやっているので、基礎の基礎もわかっていないとは思いますが、どうかご教授ください。 (例) 商品名検索をした際には、コンボボックスに     チロルチョコ    バナナ味20円     チロルチョコ    いちご味21円     チロルチョコ    マンゴー味21円 のように表示されます。その中でチロルチョコ イチゴ味を選択した後に、そのチロルチョコ いちご味のデータを出力したいのです。

  • VBA シート上のチェックボックスの値の取得

    (作業環境 windowsXP Excel2007 作業対象のブックは.xls) シート上に1ブックにつき3000個ほどのチェックボックスがあります。 このブックが現在約1000個、すでに配布・回収されております。 これからチェックボックスの選択状況やセルに入力された値をマクロで収集するのです。 大半のチェックボックスにはすでに「リンクするセル」の設定がされており、そのセルの値を参照すればチェック状態の取得は容易なのですが、 最初にこのブックを作った方が一部のチェックボックス群(3000個中500個程度)にリンクの設定をするのを忘れていたのです。 このリンク設定のされていないチェックボックスの値の取得についてご質問です リンクセルの設定をするのであれば sub a() ActiveSheet.Shapes("Check Box 1").Select Selection.LinkedCell = "$A$1" ・ end sub でいいのでしょうが、これだとselectのはずみで チェックボックスがTrueになってしまします。 リンクせずに直接チェックボックスの値をブール型で取得しようと思い dim a as boolern a = Activesheet.checkboxes(1).value としましたが、ためしに別ブックのシート上に1つだけチェックボックスを作って実行すると、チェック状態にかかわらずTrueが返ります。 checkboxesの使い方がダメなんでしょうか? 求める回答としては (1)上記のやり方でもできるが、間違っている部分がある (2)上記以外のやり方でもっと簡単な(早い)やりかたがある のどちらかのようなアドバイスをいただけると幸甚です。 よろしくおねがいします

  • Excel VBA 別ブックを開かずに転記

    Excel2007のユーザーフォームについて教えてください。 ユーザーフォームを以下のように作成しました。 ■テキストボックス6つ テキストボックス2→件名 テキストボックス3→数 テキストボックス4→名前 テキストボックス5→備考1 テキストボックス6→備考2 ■コマンドボタンが1と3の2つです。 コマンドボタン1→転記と印刷 コマンドボタン3→終了 ■シートの構成  sheet"作成と一覧"   1行目を以下の項目で使用しています。  A1→番号(テキストボックス1を表示)  B1→件名(テキストボックス2を表示)  C1→数(テキストボックス3を表示)  sheet"印刷"  A1→番号(テキストボックス1を表示)  A2→件名(テキストボックス2を表示)  B2→数(テキストボックス3を表示)  A3→名前(テキストボックス4を表示)  A4→備考1(テキストボックス5を表示)  A5→備考2(テキストボックス6を表示) テキストボックスに入力した値を2つのシートにそれぞれ転記して、 シート"印刷"を2部印刷しています。 ここまで以下のコードで行いました。 Private Sub CommandButton1_Click() '入力値を作成と一覧シートに転記 行 = ActiveCell.Row 列 = ActiveCell.Column Cells(行, 列) = UserForm1.TextBox1.Value Cells(行, 列 + 1) = UserForm1.TextBox2.Value Cells(行, 列 + 2) = UserForm1.TextBox3.Value '入力値を印刷シートにに転記 Worksheets("印刷").Range("A1") = UserForm1.TextBox1.Value Worksheets("印刷").Range("A2") = UserForm1.TextBox2.Value Worksheets("印刷").Range("B2") = UserForm1.TextBox3.Value Worksheets("印刷").Range("A3") = UserForm1.TextBox4.Value Worksheets("印刷").Range("A4") = UserForm1.TextBox5.Value Worksheets("印刷").Range("A5") = UserForm1.TextBox6.Value 部数 = 2 Worksheets("印刷").PrintOut Copies:=部数, Collate:=True UserForm1.TextBox1.SetFocus Cells(行 + 1, 列).Select End Sub Private Sub CommandButton3_Click() '終了ボタンで値をクリアしてウィンドウを閉じる Dim Ctrl As Control For Each Ctrl In Controls If TypeName(Ctrl) = "TextBox" Then _ Ctrl.Value = "" Next Ctrl Unload Me End Sub 教えて頂きたい事なのですが・・・ コマンドボタン1の入力値を作成と一覧シートに転記の所なのですが、 アクティブセルではなく、常にA列の最後の値の次の空白行に転記するようにしたい場合、 どのように書き換えればいいのでしょうか? もう一点ですが、 別ブックにテキストボックス1から6が入力された一覧があります。 この別ブックを開かずに、 テキストボックス1に入力された番号を探して、 テキストボックス2から6に表示されるようにしたいのです。 うまく説明できないのですが・・・ 別ブックの名前は"たちつ" 別ブックは、あいうサーバーの かきくフォルダの中のさしすフォルダです。 ブック"たちつ"に"一覧"というシートがあります。 一覧のシートのD列の3行目以降には番号が入力されており、日々増えています。 テキストボックス1に入力された番号を、 一覧のD列から探し、 I列の値をテキストボックス2へ K列の値をテキストボックス3へ L列の値をテキストボックス4へ M列の値をテキストボックス5へ J列の値をテキストボックス6へ転記させたいのです。 同じブックの別シートを参照するときには Application.VLookupで出来たのですが、 マクロの記録でやってみても、解決できませんでした。 コードをご覧いただいてお分かりの通り、 VBA超初心者です。 ネットを見ながら試行錯誤している状況です。 コードの間違い等あるかもしれませんが、 ご教示よろしくお願いいたします。