
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
vbaを早くしたい
Visual Basic(VBA)
-
初めてマクロを入力しますが、テキストとおりに入力したのに構文エラーです。修正を教えてください。
Visual Basic(VBA)
-
Excel VBAでAA(BBB) → BBB.AA に置換したい
Visual Basic(VBA)
-
4
マクロを簡潔にしたい
Excel(エクセル)
-
5
配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。
Visual Basic(VBA)
-
6
【至急】 当方初心者です。 マクロについて知恵をお貸しください。 ★したい動作 ①リストE列2行目か
Visual Basic(VBA)
-
7
VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます
Visual Basic(VBA)
-
8
VBA エラーの件
Excel(エクセル)
-
9
VBA ComboBoxについて
Visual Basic(VBA)
-
10
VBAマクロでシートコピーした新シートにコピー元シートとの計算式の入れ方を教えて下さい。
Visual Basic(VBA)
-
11
Excel VBA 大量のレコードからある列の重複数をカウントする方法?拡張編
Visual Basic(VBA)
-
12
以前シートを集めて1シートへ繋げる下記コードをご教授いただき作成しました。 今回すでに集めてある「ま
Visual Basic(VBA)
-
13
マクロのコードを、少しでも削って短くしたい
Excel(エクセル)
-
14
指定文字を太字にするVBAを別シートのセルを指定する構文(改良について)
Visual Basic(VBA)
-
15
Excel vbaについて知恵もしくは、コード教えて下さいm(__)m ① 表にあるデータをコピー、
Visual Basic(VBA)
-
16
エクセルVBAでオブジェクトが必要です
Excel(エクセル)
-
17
データを製品別に集計
Visual Basic(VBA)
-
18
ExcelのVBAでシフト表を作っていますが、バグが出て困っています
Visual Basic(VBA)
-
19
VBAのトグルボタンでのマクロについて質問です
Visual Basic(VBA)
-
20
1つの入力フォルダの値を読み込み、3分割をして新しい変数に代入する方法を教えていただきたいです。 読
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
Outlook.ApplicationをCreateOb...
-
5
ExcelVBA Range クラスの Page...
-
6
VBAがブレークモードになっ...
-
7
実行時エラー48発生時のDLL特定...
-
8
【エクセル】ハイパーリンク先...
-
9
マクロを作成したのですが、以...
-
10
VBSで変数の宣言はできないので...
-
11
EXCEL VBAマクロ中断でデバッグ...
-
12
Exce2007でBorder クラスの Lin...
-
13
VBAでのMATCH関数の使用
-
14
Dictionaryについてその2
-
15
エクセルVBA、フリーフォームで...
-
16
Excel VBA のコンパイルエラー
-
17
エクセルVBAで以下のようなコー...
-
18
エクセルエラー13型が一致しま...
-
19
IEのダウンロード通知バーのVBA...
-
20
プロシージャの引数 VBA
おすすめ情報
公式facebook
公式twitter
回答ありがとうございます
Trimを用いた理由としては、②の表のコードにはアルファベットを含んだものが有り、
②のコードは文字列としているためです。
問題のモジュール以前の段階で、
G_PRICE(), P_PRICE()ともに10桁の数字がVariant/Doubleで格納されています。
問題のMATCHのところでは、ptrおよびgtrに該当業がdoubleで格納されますが、
G_PRICE(2)では 0がDoubleで格納されたままになります。
(Nextの前に、ptr=0, gtr=0deでリセットしています)