2017-11-06 10 views
0

式ベースのクエリから変換するように作成したVBAコードでは、いくつかのエラーが発生します。Excel式からVBAコードへのエラー

Cell.Offset(0, 37).Value = Application.WorksheetFunction.IfError(Application.WorksheetFunction.Index((Sheets("CP INFO").Range("N6:AK570")), Application.WorksheetFunction.Match(Cell.Offset(0, 36).Value, Sheets("CP INFO").Range("N6:AK570"), 0), 1), "No SFH") 

エラーは、ワークシート関数クラスの 'Matchプロパティを取得できません。 上記のコードの元の式は - =IFERROR(INDEX('CP INFO'!$N$6:AK$570,MATCH(VALUE(AK4),'CP INFO'!$N$6:$N$570,0),1),"NO SFH")です。だから間違っているのはわかりません。

次のコードは次のエラーです。

Cell.Offset(0, 39).Value = Application.WorksheetFunction.IfError(Left(Application.WorksheetFunction.IfError(Left(Right(Cell.Offset(0, 24), _ 
Len(Cell.Offset(0, 24)) - Application.WorksheetFunction.Find("(", Cell.Offset(0, 24))), (Len(Cell.Offset(0, 24)) - Application.WorksheetFunction.Find("-", Cell.Offset(0, 24))) + 1), ""), _ 
Application.WorksheetFunction.Find("-", Application.WorksheetFunction.IfError(Left(Right(Cell.Offset(0, 24), Len(Cell.Offset(0, 24)) - _ 
Application.WorksheetFunction.Find("(", Cell.Offset(0, 24))), (Len(Cell.Offset(0, 24)) - Application.WorksheetFunction.Find("-", Cell.Offset(0, 24))) + 1), "")) - 1), _ 
Application.WorksheetFunction.IfError(Left(Right(Cell.Offset(0, 24), Len(Cell.Offset(0, 24)) - _ 
Application.WorksheetFunction.Find("(", Cell.Offset(0, 24))), (Len(Cell.Offset(0, 24)) - Application.WorksheetFunction.Find("-", Cell.Offset(0, 24))) + 1), "")) 

このエラーは、プロパティを見つけることができないというfind関数に関連しています。私はVBA内のこれらの機能については本当に初心者なので、何か間違ったことや何か不足していることは間違いありません。

オリジナルのコード式です。

=IFERROR(LEFT(IFERROR(LEFT(RIGHT(DATA2!Y4,LEN(DATA2!Y4)-FIND("(",DATA2!Y4)),(LEN(DATA2!Y4)- 
FIND("-",DATA2!Y4))+1),""),FIND("-",IFERROR(LEFT(RIGHT(DATA2!Y4,LEN(DATA2!Y4)- 
FIND("(",DATA2!Y4)),(LEN(DATA2!Y4)-FIND("-",DATA2!Y4))+1),""))-1),IFERROR 
(LEFT(RIGHT(DATA2!Y4,LEN(DATA2!Y4)-FIND("(",DATA2!Y4)),(LEN(DATA2!Y4)-FIND("-",DATA2!Y4))+1),"")) 

このマクロの設計は、およそ3〜5k行のデータをループし、データを事前にソートしたレポートを作成することです。セルは現在の行で、列Aです。基準が満たされている場合、オフセットは対応する列に値をポストします。

誰かが助けてくれることを願っています。

よろしくあなたは、VBAでそのよう代わりに何かのようIfError()を使用することはできません アラン

+1

vbaコードでは「WorksheetFunction」を使用しないで、関数が実行するコードを記述することをお勧めします。あなたが関数の使用を主張するなら、 'worksheet()を見てください。Evaluate' –

+0

ありがとう@ScottCraner前にEvaluateを使っていませんでした。私はこれを述べるコメントを見たことがありますが、これは使い方が遅いのですか? –

+0

workheetformulaを使用するよりも遅くはありません。真のVBAに変換し、ワークシートを参照する代わりに配列を使用する方が早いでしょう。私はこの機会に、配列を使って正しいコードを書くことを学びます。 –

答えて

0

v = "No SFH" 
On Error Resume Next 
    With Application.WorksheetFunction 
     v = .Index((Sheets("CP INFO").Range("N6:AK570")), .Match(Cell.Offset(0, 36).Value, Sheets("CP INFO").Range("N6:AK570"), 0), 1) 
    End With 
On Error GoTo 0 
Cell.Offset(0, 37).Value = v 

注:

スコットが指摘するように、MATCH()の引数をまた、修正が必要です。

+0

マッチで2D範囲を使用することはできません。 –

+0

@ScottCranerあなたが言うことは本当ですが、あなたは***を得るでしょうSFH *** –

+0

はい、 'Cell.Offset(0,36).Value'が何であっても、それはいつも得られます。 –