(VBA) ●Evaluateが通りません (エラー2029 #Name) 。どのように記載すれば宜しいのでしょうか? >
(VBA) ●Evaluateが通りません (エラー2029 #Name) 。どのように記載すれば宜しいのでしょうか? > 本件は 下記2本の継続に当たります 1.XL97でSUMIFS形式の代用関数(ユーザー関数)作成中 (未完) http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10114976755 2.(1)を受けて,検索条件値を判断するルーチン省力化中 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10115027765 ------- 2)において Evaluateを教えて頂き使いましたが 2029 (又は2015)エラーが出て通りません。 具体的には下記式で 2029 が多発 ●C = C - Evaluate(Zn(JX)(IX) & S(JX / 2) & C1) 式の意味は検索条件範囲データ Zn(JX)(IX) と 検索条件値 C1 を 比較演算子 S(JX/2) で 比較し,一致していれば Cに+1する ------- 現在コード ' Public Function SUMIFS97(Z, ParamArray Zn()) As Long Dim U(), IX, JX, C, C1 Dim S() As String ReDim U(5) U(0) = "<>": U(1) = ">=": U(2) = "<=": U(3) = ">": U(4) = "<": U(5) = "=" JX = Int(UBound(Zn) / 2) ReDim S(JX) For IX = 0 To JX For Each C In U S(IX) = IIf(InStr(Zn(IX * 2 + 1), C) > 0, C, "") If S(IX) <> "" Then Exit For Next C Next IX ' For IX = 1 To Z.Count C = 0 For JX = 0 To UBound(Zn) Step 2 C1 = Mid(Zn(JX + 1), Len(S(JX / 2)) + 1) C1 = IIf(IsNumeric(C1), Val(C1), C1) C = C - Evaluate(Zn(JX)(IX) & S(JX / 2) & C1) '● Next SUMIFS97 = SUMIFS97 + IIf(C = (UBound(Zn) + 1) / 2, Z(IX), 0) Next End Function ------- 只,Evaluate成功例は 1.C = C - Evaluate(Zn(JX)(IX) = C1) --- 比較演算子を直接記入 2.C = C - Evaluate(1 & S(JX/2) & 1) --- 2つは対象を直接記入 ちなみにSUMIFS97は例えば =SUMIFS97(E2:E8,A2:A8,"=運賃",B2:B8,"=1234") と入力で合計対象範囲 E2:E8から \10,500と計算される予定 (現状は未完成) システムは windows xp sp3 XL97VBA
Office系ソフトウェア・3,241閲覧・25
ベストアンサー
ID非公開
ID非公開さん
2013/10/17 23:44(編集あり)
その書き方だと、Evaluate に喰わせる引数は 運賃=運賃 みたいな文字列になってしまいますね。 数値だったらこれでも通りますけれど、文字列だったら、""で括ってやらないといけないと思います。 たとえば、下記のように・・・。 Public Function SUMIFS97(Z, ParamArray Zn()) As Long Dim U(), IX, JX, C, C1, D Dim S() As String ReDim U(5) U(0) = "<>": U(1) = ">=": U(2) = "<=": U(3) = ">": U(4) = "<": U(5) = "=" JX = Int(UBound(Zn) / 2) ReDim S(JX) For IX = 0 To JX For Each C In U S(IX) = IIf(InStr(Zn(IX * 2 + 1), C) > 0, C, "") If S(IX) <> "" Then Exit For Next C Next IX ' For IX = 1 To Z.Count C = 0 For JX = 0 To UBound(Zn) Step 2 C1 = Mid(Zn(JX + 1), Len(S(JX / 2)) + 1) C1 = IIf(IsNumeric(C1), Val(C1), """" & C1 & """") D = IIf(IsNumeric(Zn(JX)(IX)), Val(Zn(JX)(IX)), """" & Zn(JX)(IX) & """") C = C - Evaluate(D & S(JX / 2) & C1) '● Next SUMIFS97 = SUMIFS97 + IIf(C = (UBound(Zn) + 1) / 2, Z(IX), 0) Next End Function でも、配列数式を使うよりもさらに遅くなりそうです・・・。大丈夫ですか? [補足] 読み返して気付きましたが、成功例として書かれている 1.C = C - Evaluate(Zn(JX)(IX) = C1) --- 比較演算子を直接記入 2.C = C - Evaluate(1 & S(JX/2) & 1) --- 2つは対象を直接記入 ですけれど、2番目は良さそうですが、1番目は Evaluate 関係ないのでは? つまり先に Zn(JX)(IX) = C1 の計算が行われて、結局 C = C -Evaluate(True) もしくは C= C-Evaluate(False) となっている気がします。 それなら C = C - (Zn(JX)(IX) = C1) としても同じことですよね?
4人がナイス!しています
質問者からのお礼コメント
[補足]を含め仰る通りでした(^^); 本答は巧く行きました (SUMIFS97は山を越えたと同然で、後は日付記入の判定、ワイルドカード(*)にチャレンジします) [補足]は "="だけでトレースしてたためでした。”="を他の演算子に変化させる ことが狙いでした gekkasuikouさま, いつも々,ありがとうございます
お礼日時:2013/10/18 9:05