アプリ版:「スタンプのみでお礼する」機能のリリースについて

添付画像のように、ブック①の日付の中からブック②の販売日の値と一致する行を確認して、その行にブック②の情報を当てはめる(数値の部分を+で計算する)マクロを作りたいのですが、どのように行番号を取得したりその行に値を入れることができるのか教えてください。

「Excelマクロ 該当する値の行番号取得」の質問画像

質問者からの補足コメント

  • 例えば、セル("I5")の値である"7月8日"を、A列から検索して、一致する行番号(ここでの表でいう11行目)を取得する方法を知りたいです。以下のようにマクロを組んでみましたが、VBA エラー 91「オブジェクト変数またはWithブロック変数が設定されていません。」が出てしまいます。VBAにお詳しい方、是非ともご教示願います。

    Sub macro1()
    Dim test
    Dim FindCell As Range
    Dim SarchRow As Long
    Set test = Range("I5")
    Set FindCell = Range("A1:A13").Find(test, LookIn:=xlValues, LookAt:=xlWhole)
    SarchRow = FindCell.Row
    MsgBox (SarchRow)
    End Sub

      補足日時:2022/07/07 15:51

A 回答 (4件)

No1です。



>VBA エラー 91「~~」が出てしまいます。
ご質問の本文では別ブックのような記述になっていますが、補足でご提示のコードは同一シート内で検索しているものと考えても良いのでしょうか?
(そうでない場合は、問題点がいろいろとありすぎますので・・)

推測するところ、エラーが出た時にエディター画面を見ると、
>SarchRow = FindCell.Row
の行が黄色く反転していませんか?
そのままウォッチウィンドウに、Findcellの内容を表示させてみると、値がNothingになっていませんか?

もしそうなら、Findメソッドで検索がヒットしなくて、『 FindCell.Row と言われても、そんなのないよ』というエラーです。
通常、Findメソッドの結果を扱う時は、
 IF FindCell is Nothing Thne ~~ Else ~~
のようにしておく方が安全です。


『同じ日付があるんだから、検索で見つからないなんてのが、そもそもおかしい‼』とおっしゃりそうですが、実は、日付をFindで検索する場合はちょっとだけ面倒なんです。
(他の方法で検索するのなら、あまり問題は起きないのですが・・)
ひとまず、おまじないとして、
Set FindCell = Range("A1:A13").Find(test.Text, LookIn:=xlValues, LookAt:=xlWhole)
に変えて、試してみてください。
これで、ちゃんと行番号が表示されたりしませんか?

詳しい説明は長くなるので、以下をご覧になるのが宜しいかと。
http://officetanaka.net/excel/vba/tips/tips131c. …
    • good
    • 0
この回答へのお礼

行番号表示できました。ありがとうございました。

お礼日時:2022/07/07 17:49

Find メソッドって癖が強いんです。



・前回検索(ワークシート上の操作、VBA問わず)の検オプションがそのまま継続適用される
・日付の検索は表示形式を完全に一致された検索キーワードでなければならない
(回答はこれ)

などで注意が必要。
特に2番目の点はVBAの入門者の頭を悩ませることになります。

Set test = Range("I5")
Set FindCell = Range("A1:A13").Find(test, LookIn:=xlValues, LookAt:=xlWhole)

ここでFind の検索キーワードを指定しているオブジェクト変数 test ですが、Range 型なのでディフォルトプロパティの

test.Value

と解釈され、つまりはシリアル値(44621みたいな数値)で検索してます。

ですが、Find は検索範囲のセルの値をいちいちシリアル値かな?と評価してまで検索してません。あくまで

7月7日
7月8日

といった現在セルに表示されている値を検索しています。結果、そんなデータありません、となります。

Range("A1:A13").Find("7月8日", LookIn:=xlValues, LookAt:=xlWhole)

だと上手くいきませんか?

ここが特に面倒な点。

代替案でシリアル値で検索したいなら

worksheetfunction.match

を使うと良いでしょう。
ただし、matchはmatchで検索できる最大要素数が限られています。
簡単に言うと、Excel2013以降改善はされましたが、データの行数が数十万件を超えてくるとエラーまたは意図しない値を返します。
    • good
    • 0

こんにちは。



例えば、各店舗の売上報告を本店で全店売上として集計したい、といったケースであるならば、オススメの方向性は次の通り。

・入力フォーマットは全ての店舗で同一である
・店舗名列がある。なければ設ける。
データを集計シートに統合した後でも店舗名列のオートフィルターで店舗ごとの抽出可能

としたら、2のデータを1の集計シートの最後に丸ごとコピーして付け足していきます。

つまり、7/7の全店売上といった集計は、後からピポットテーブルなどの機能で行います。

ご質問文のとおり、VBAで書くことはできるのですが面倒な点(例えば日付の検索は少々コツが必要です)がありますし、後々データ構造に問題を残しそうです。1つ指摘するなら、集計値しか分からない場合、異常値がどの店舗のものか原因調査に手間がかかります。

異なるブック データ統合

といったキーワードでサンプルソースは見つかると思います。
    • good
    • 1

こんにちは



>どのように行番号を取得したりその行に値を入れることができるのか
検索してみましょう。

◇行番号を取得
https://www.tipsfound.com/vba/08003

◇セルに値を入れる
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/p …
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!