-2

深刻な知識不足のため、私は計算を行うためにとてつもなく長い関数を作成しました。問題は、Excel には長すぎるということです。自分の関数を参照する VBA で新しい関数を作成する方法をオンラインで調べてみました。私はこれに非常に迷っており、どんな助けも素晴らしいでしょう. この関数は、ここに投稿するには面倒すぎます (30k 文字の長さです)。

では、ここで関数の一部を示します: =+IF(ISERROR(IF(LEFT(C12,FIND(" ",C12,1))=$C$2,SUMPRODUCT(P12:S12,Selection!$B) $4:選択!$E$4),IF(LEFT(C12,FIND(" ",C12,1))=$C$3,SUMPRODUCT(P12:S12,選択!$B$5:選択!$E$5),IF (LEFT(C12,FIND(" ",C12,1))=$C$4,SUMPRODUCT(P12:S12,Selection!$B$6:Selection!$E$6),IF(LEFT(C12,FIND(" ", C12,1))=$C$5,SUMPRODUCT(P12:S12,選択!$B$7:選択!$E$7),IF(RIGHT(C12,LEN($C$6))=$C$6,SUMPRODUCT(P12 :S12,選択!$B$8:選択!$E$8),IF(RIGHT(C12,LEN($C$7))=$C$7,SUMPRODUCT(P12:S12,選択!$B$9:選択!$E $9),IF(RIGHT(C12,LEN($C$8))=$C$8,SUMPRODUCT(P12:S12,選択!$B$10:選択!$E$10),SUMPRODUCT(P12:S12,選択!$B $11:選択!$E$11)))))))),1,IF(LEFT(C12,FIND(" ",C12,1))=$C$2,SUMPRODUCT(P12:S12,選択!$B $4:選択!$E$4),IF(LEFT(C12,FIND(" ",C12,1))=$C$3,SUMPRODUCT(P12:S12,セレクション!$B$5:セレクション!$E$5),IF(LEFT(C12,FIND(" ",C12,1)) =$C$4,SUMPRODUCT(P12:S12,選択!$B$6:選択!$E$6),IF(LEFT(C12,FIND(" ",C12,1))=$C$5,SUMPRODUCT(P12:S12 ,選択!$B$7:選択!$E$7),IF(RIGHT(C12,LEN($C$6))=$C$6,SUMPRODUCT(P12:S12,選択!$B$8:選択!$E$8) ,IF(RIGHT(C12,LEN($C$7))=$C$7,SUMPRODUCT(P12:S12,選択!$B$9:選択!$E$9),IF(RIGHT(C12,LEN($C$8) )=$C$8,SUMPRODUCT(P12:S12,選択!$B$10:選択!$E$10),SUMPRODUCT(P12:S12,選択!$B$11:選択!$E$11)))))))) )SUMPRODUCT(P12:S12,選択!$B$8:選択!$E$8),IF(RIGHT(C12,LEN($C$7))=$C$7,SUMPRODUCT(P12:S12,選択!$B$9:選択!$E$9),IF(RIGHT(C12,LEN($C$8))=$C$8,SUMPRODUCT(P12:S12,選択!$B$10:選択!$E$10),SUMPRODUCT(P12:S12,選択!$B$11:選択!$E$11)))))))))SUMPRODUCT(P12:S12,選択!$B$8:選択!$E$8),IF(RIGHT(C12,LEN($C$7))=$C$7,SUMPRODUCT(P12:S12,選択!$B$9:選択!$E$9),IF(RIGHT(C12,LEN($C$8))=$C$8,SUMPRODUCT(P12:S12,選択!$B$10:選択!$E$10),SUMPRODUCT(P12:S12,選択!$B$11:選択!$E$11)))))))))

4

3 に答える 3

1

「VBAでできますか?」という質問に答えると、答えは「はい」です。エクセル関数でできるならVBAでもできます。ただし、機能上の欠点がある可能性があり、関数のコーディングは完全に異なる構文になります (ただし、通常は Google 検索を使用して翻訳するのは非常に簡単です)。

ただし、VBA を使用する前に考慮すべきことの 1 つは、関数が複数のセルに分割される可能性があることです。これはあなたのニーズに合っており、文字制限を回避できるかもしれませんが、30,000 文字の長さの場合、これは実用的ではないか、これを行うことさえできないかもしれません.

使用する各Excel関数について、文字通り「Excel関数XXXXに相当するVBA」をグーグルで検索することから始めることをお勧めします。次に、中央の括弧から裏返しに作業して、Excel 関数と同じ順序で入力に対して操作を実行します。VBA 関数と Excel 関数の主な違いは、複雑な操作順序を使用する代わりに、同じ変数に対して行ごとに操作を実行できることです。

たとえば、=if(a2>3,b3+5,b3-5)*if(A1>3,B2+3,B2-3) の代わりに、次のように入力できます。

Function Your_Function_Name1(Cell_one As Range, Cell_two As Range, _
                            Cell_three As Range, Cell_four As Range) As Double
    If Cell_four > 3 Then
        If Cell_three > 3 Then
            Your_Function_Name1 = (Cell_one.Value + 5) * (Cell_two.Value + 3)
        Else
            Your_Function_Name1 = (Cell_one.Value - 5) * (Cell_two.Value + 3)
        End If
    Else
        If Cell_three > 3 Then
            Your_Function_Name1 = (Cell_one.Value + 5) * (Cell_two.Value - 3)
        Else
            Your_Function_Name1 = (Cell_one.Value - 5) * (Cell_two.Value - 3)
        End If
    End If
End Function

で呼び出します=Your_Function_Name1(B3,B2,A2,A1)。しかし、それは完全に合法でもあり、通常は代わりにこれを行う方が簡単です:

Function Your_Function_Name(Cell_one As Range, Cell_two As Range, _
                            Cell_three As Range, Cell_four As Range) As Double
    If Cell_three > 3 Then
        Your_Function_Name = Cell_one.Value + 5
    Else
        Your_Function_Name = Cell_one.Value - 5
    End If

    If Cell_four > 3 Then
        Your_Function_Name = Your_Function_Name * (Cell_two.Value + 3)
    Else
        Your_Function_Name = Your_Function_Name * (Cell_two.Value - 3)
    End If

End Function

これらの関数は両方とも同じ方法で呼び出され、同じ結果が得られます。

開始するにはこれで十分だと思いますが、実際に作業に入ってデバッグを開始すると、おそらく別の質問を投稿することになるでしょうが、少なくとも特定のコードについて質問する必要があります。VBA は最初は難しいですが、時間をかけて取り組む価値はあります。

幸運を!

于 2015-03-12T22:43:30.100 に答える
0

次のガイドラインは、既存のコードをリファクタリングするため、および将来的に新しいコードを記述するための優れた方法です。

説明的なコメントを持っている、または持つのに十分な大きさのコードのすべてのブロックに対して、サブルーチンを作成し、説明的なコメントで (PascalCase で) 名前付けます。すべてのローカル変数を識別し、新しいサブルーチンで再宣言します。すべてのグローバル値を名前付きパラメーターとして渡します。

すべてのサブルーチンが 40 行以下になるまで、この手順を繰り返します。

于 2015-03-12T22:44:13.557 に答える
0

IFERRORを使用するのではなく、使用することで関数を半分に削減できますIF(ISERRORSelection!$B$4:Selection!$E$4Selection!$B$4:$E$4

=IFERROR(IF(LEFT(C12,FIND(" ",C12,1))=$C$2,SUMPRODUCT(P12:S12,Selection!$B$4:$E$4),IF(LEFT(C12,FIND(" ",C12,1))=$C$3,SUMPRODUCT(P12:S12,Selection!$B$5:$E$5),IF(LEFT(C12,FIND(" ",C12,1))=$C$4,SUMPRODUCT(P12:S12,Selection!$B$6:$E$6),IF(LEFT(C12,FIND(" ",C12,1))=$C$5,SUMPRODUCT(P12:S12,Selection!$B$7:$E$7),IF(RIGHT(C12,LEN($C$6))=$C$6,SUMPRODUCT(P12:S12,Selection!$B$8:$E$8),IF(RIGHT(C12,LEN($C$7))=$C$7,SUMPRODUCT(P12:S12,Selection!$B$9:$E$9),IF(RIGHT(C12,LEN($C$8))=$C$8,SUMPRODUCT(P12:S12,Selection!$B$10:$E$10),SUMPRODUCT(P12:S12,Selection!$B$11:$E$11)))))))),1)

これでうまくいきましたが、あなたのテストはLEFT(C12,FIND(" ",C12,1))=$C$2 疑わしいようです。C12 の House に Cat が含まれている場合、左側は "Cat " と評価され、末尾にスペースがあります。テスト対象のセルの末尾にスペースが含まれていても問題ありませんが、そうではないと思います。テキストを作成したい場合があります。 LEFT(C12,FIND(" ",C12,1)-1)=$C$2

于 2017-10-29T18:46:38.017 に答える