VBAにて価格を算出するマクロを作成しています。
添付画像がイメージ図です。
表①にて型式・材質によりコードを取得
取得したコードに基づいて、MSHシートにある表②から価格を取得。
何種類化のパーツがあるため、①で取得したコードは配列 PRICE()に格納して、
MATCHを使って、②の該当行を特定し、価格を間接的に導く方式にしています。
PRICEへの格納は別のモジュールで行っており、Variant/Doubleとして数値格納は成功しています。
ただ実行してみると、最後の一つ(G_PRICE(2)の時)に実行時エラー1004が出てしまいます。
VLOOKUPに変えてみたり、表の書式を「標準」「文字列」などに統一し直してみたりと試したのですが、エラーが止まることはありません。
最後の一つ以外はうまく行っており、また参照している①・②は共通なので、コードや表自体がおかしい可能性は低そうなのですが、なにかエラーを生じさせている可能性があれば、ご教示いただけないでしょうか。
【コード】
Sub 価格算出(ByRef P_PRICE() As Variant, ByRef G_PRICE() As Variant)
Dim i As Long '処理用の変数
Dim ptr As Double, gtr As Double '該当パーツNoのある該当行
Dim end_r As Long: end_r = MSH.Cells(Rows.Count, "B").End(xlUp).Row 'マスターシートの最終行
Dim t_range As Range: Set t_range = MSH.Range("B3:B" & end_r) 'Noを探す範囲
For i = 0 To 2
ptr = WorksheetFunction.Match(Trim(P_PRICE(i)), t_range, 0) + 2
P_PRICE(i) = MSH.Cells(ptr, 10)
gtr = WorksheetFunction.Match(Trim(G_PRICE(i)), t_range, 0) + 2
G_PRICE(i) = MSH.Cells(gtr, 10)
Next
End Sub
No.3ベストアンサー
- 回答日時:
回答べたでごめんなさい
#2の補足は良く解りません
ptr = WorksheetFunction.Match(Trim(P_PRICE(i)), t_range, 0) + 2
は、P_PRICE(i)がDoubleであろうが、Doubleの初期値0であろうが、
はたまた、Longであろうが
Trim関数によりStringになっていますよ と言う事です
文字列でMATCHの対象範囲B列で見つかればOK
見つからなければ1004ですね
また、>アルファベットを含んだものが有り
アルファベットをスペースに置き換えていると言う事でしょうか?
Trim関数:
文字列から先頭のスペースと、末尾のスペースを削除し結果を返す
P_PRICE(i)にスペースが含まれているのなら、そもそもの話になりますよ
あまりへんてこな書き方はしたくありませんがあくまで例として
ptr = WorksheetFunction.Match(CDbl(Trim(P_PRICE(i))), t_range, 0) + 2
Trim(P_PRICE(i))をDoubleに変換していますが見つかりますか?
この様なエラーはよくあるのでWorksheetFunction.Match関数でない
代替えを考えるべきかと思います
範囲が狭いのならFindとかFor Nextでも対して負担にならないかと・・
(VLOOKUPで試しているようなので原因を知りたいだけだと理解していますが)
Dim ptr As Double, gtr As Double
これはMatch , 0 の戻り値を代入する変数のようなのでLongで良い
一応Findの例
Dim r As Range
Set r = t_range.Find(What:=Trim(P_PRICE(i)), LookIn:=xlValues, LookAt:=xlWhole)
If Not r Is Nothing Then P_PRICE(i) = r.Offset(2, 8)
Offset:B列検索でJ列の見つかった+2下の値を取得
文字列として検索されますので表示形式に依存した検索となります
従って数値などの場合、表示形式の違いで検索されない場合があります
(汎用性を得るには、値の検証処理などを追加する必要があります)
回答ありがとうございます。
いろいろと書いていただいたところ申し訳ないのですが、もっと原始的なミスでした。
表の表示形式を変えたつもりが、実際の入力値は変わっておらず、それにより検索が機能していなかったようです。
お騒がせして申し訳ありませんでした。
No.2
- 回答日時:
Trim・・・ 文字列を数値で・・いや逆かな?
Trimを無くすとどう? 各値を確認してみてください
Trim関数はstring(文字列)を返します
従ってTrim(P_PRICE(i))は文字列になります
このエラーはシート上でも同じだと思います。。
セル範囲には数字の1がある時
=MATCH("1",B1:B10,0) #N/A
=MATCH(1,B1:B10,0) 問題ない
No.1
- 回答日時:
こんばんは
シート上でもそうですけれどMatch関数って見つからないとエラーが返るのでは?
実行時エラー1004が出たところでデバッグ、各値を確認してみてはどうでしょう
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) Sheet1のA列にコードB列にメアド、Sheet2のB列にコード一覧とD列にメアド一覧があり、Sh 3 2022/10/19 11:57
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
このQ&Aを見た人はこんなQ&Aも見ています
-
好きな人を振り向かせるためにしたこと
大好きな人と会話のきっかけを少しでも作りたい、意識してもらいたい…! 振り向かせるためにどんなことをしたことがありますか?
-
【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
【お題】・忍者がやってるYouTubeが炎上してしまった理由
-
自分独自の健康法はある?
こうしていると調子がいい!みたいな自分独自の健康法、こだわりはありますか?
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
「これいらなくない?」という慣習、教えてください
現代になって省略されてきたとはいえ、必要性のない慣習や風習、ありませんか?
-
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
ApplicationとWorksheetFunctionの違い
Visual Basic(VBA)
-
matchプロパティを取得できません…と出ます。
PowerPoint(パワーポイント)
-
-
4
Application.Matchで特定行の検索
Visual Basic(VBA)
-
5
vbaでworksheetfunctionでの複数関数がエラーになります
Visual Basic(VBA)
-
6
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
7
ExcelのVBAでGoToの代わりに…
Excel(エクセル)
-
8
VBAでEmpty値って何ですか?
Excel(エクセル)
-
9
配列の値を置換するにはどうすればいいでしょう?
Excel(エクセル)
-
10
配列でデータが入っている要素を求める方法
Visual Basic(VBA)
-
11
VBA Match関数の限界
Excel(エクセル)
-
12
VBAのFind関数で結合セルを検索するとヒットしない
Visual Basic(VBA)
-
13
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
14
Excel マクロ VBA 別シートのセルを検索し、該当するセルの右にあるセルを入力させる方法 s
Visual Basic(VBA)
-
15
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
-
16
findメソッドの変数について
Visual Basic(VBA)
-
17
VBA Application.Matchについての質問です
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー 438になった時の...
-
実行時エラー48発生時のDLL特定...
-
VBS実行時エラー オブジェクト...
-
ADODB.Streamを使用してUTF-8を...
-
VBAで入力規則の設定がうまくい...
-
OLEDB.NETで接続できない
-
マクロについて教えてください...
-
VBSで変数の宣言はできないので...
-
なぜこんな初歩的なVBAのIf文で...
-
VBAでのエラー
-
エクセルエラー13型が一致しま...
-
VBA エラーと対策
-
実行時エラー3001「引数が間違...
-
【Excel VBA】マクロをボタンに...
-
VBAのエラー発生場所をメッセー...
-
AccessVBAでExcelを起動し、罫...
-
トランスポートレベルのエラー
-
1列目の何行目に検索文字がある...
-
【エクセル】ハイパーリンク先...
-
EXCEL VBA シート追加時のエラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
実行時エラー48発生時のDLL特定...
-
なぜこんな初歩的なVBAのIf文で...
-
VBAがブレークモードになっ...
-
エクセルエラー13型が一致しま...
-
マクロについて教えてください...
-
【Excel VBA】マクロをボタンに...
-
VBAでのエラー
-
ExcelVBAで、ユーザー定義型は...
-
EXCEL VBAマクロ中断でデバッグ...
-
ExcelVBA Range クラスの Page...
-
VBSで変数の宣言はできないので...
-
実行時エラー3001「引数が間違...
-
実行時エラー -'-2147417848
-
なぜエラーになるのでしょうか...
-
VBS実行時エラー オブジェクト...
-
Outlook.ApplicationをCreateOb...
-
プロシージャ名の取得
-
VB6+SQL サーバー 2000 で 実行...
-
VBAで、定数式が必要ですのエラ...
おすすめ情報
回答ありがとうございます
Trimを用いた理由としては、②の表のコードにはアルファベットを含んだものが有り、
②のコードは文字列としているためです。
問題のモジュール以前の段階で、
G_PRICE(), P_PRICE()ともに10桁の数字がVariant/Doubleで格納されています。
問題のMATCHのところでは、ptrおよびgtrに該当業がdoubleで格納されますが、
G_PRICE(2)では 0がDoubleで格納されたままになります。
(Nextの前に、ptr=0, gtr=0deでリセットしています)