きなこSHOW

自作プログラム置き場です。

自動作表、検索型 3行サンプル

先日、こんな仕事を頼まれた。 商品名と数量のベタな一覧から、複数シートからなる固定フォーマットに商品名が並んだ「発注書」の数量欄に転記する、と言うもの。

↓こんなイメージ

ベタな一覧の例
この「数量」を商品名で検索して、発注書の「数量」欄に転記

手作業だったらこうやってる。

  1. 表1の1行目の商品名をコピーするか、またはキーワードを手入力で発注書から検索
  2. あったら一覧の数量を発注書の該当する商品の数量欄に記入、なかったら、一覧の最終列の後ろに「なし」と記入
  3. 一覧の次の行の商品名で検索(→1に戻る)



これはマクロでやった方がダンゼン楽チン、正確、しかも早い!
やっぱりVBAで自動化でしょ、と言うわけで、
まずはリファレンスで文法をチェック。

「Findメソッドを使用したExcel自動作表」 構文
式.Find(What _ , After _ , LookIn _ , LookAt _ , SearchOrder _ , SearchDirection _ , MatchCase _ , MatchByte _ , SearchFormat)
戻り値:検索範囲の先頭のセルを表す Range オブジェクト。
備考: 一致するデータが見つからなかった場合、このメソッドは Nothing を返す。
Find メソッドは、選択範囲またはアクティブ セルに影響を与えません。

(Excel開発者用リファレンスより)

影響を与えませんってなんなの...リファレンス。
必須パラメータはWhatだけなので、最小のテストアプリを3行で作ってみました。

Dim c As Range
'--- 指定した範囲から検索 ---
Set c = WorkBooks("発注書.xls").Worksheets(1).Range("A4:C23").Find(What:="アサツキ")
If Not c Is Nothing Then
   c.Cells(1, 3).Value = 40
End If

ごめんなさい、3行じゃなかったね。。。
If文を1行で記述すれば、無理やり3行になるが。
先ずは固定の値で検索してみた。

発注書の1番目のシートのA4からC23の中から「アサツキ」を探す。
見つかったら見つかった行の3列目(つまりC列)に、数量を記入する。
なぜ検索対象をA列からC列までにしたか。
それは、戻り値がRangeオブジェクトなので、Cellsプロパティを使えば、値のセットにそのまま使えると考えたので。
Cellsプロパティは、修飾しているRangeオブジェクトの中で、「1行目、3列目」をあらわすので、わざわざRowやColumnを取得し直さなくて良いから便利。
でも発注書のB列やC列のどっかの行に商品名が記載されていたら、このサンプルは成立しないな〜
リファレンスでは「What」パラメータのデータ型はVariant型なんだけど、サンプルでは"アサツキ"って定数がそのまま通っちゃっていいのか?これってString型じゃないの??
Variant型の変数を定義して定数を代入し、その変数をパラメータに代入しなくて良いのかしらん。

次回はこれにちょっとずつ手を加えて行きます。