2

MS Excel でテキスト (「=A1+A2」など) を数式として解析/キャストすることは可能ですか? テキストの断片から式を作成したいと考えています。そのうちのいくつかは、後でユーザーが入力するだけです。

INDIRECT() 関数がセルを参照するためだけに機能しない場合は、この =INDIRECT("=A1+A2") と入力できたはずです。

サブ計算を行う非表示の列をさらに追加するだけで、この問題を回避できることはわかっています。しかし、スケーラビリティと効率のために、上記のようなことをしたいと思います。

herehereで同様の質問を見つけましたが、問題は解決しません。



現実世界の問題:

上記を実行する理由をよりよく理解するために読んでください

シナリオ

リスト内の各項目は、それぞれ 1 ~ 5 個のアカウント名を含む文字列で構成されます。各口座名の後には括弧内に口座番号が続きます。番号の長さによってアカウントの種類が決まります。口座番号の一部は日付で、日付の形式は口座の種類によって異なります。さらに、各口座タイプには複数の口座番号の長さが関連付けられている場合がありますが、各口座番号の長さ [*] は 1 つの口座タイプにのみ関連付けられています。

目的

  • アカウント名とそれぞれのアカウント番号およびアカウント タイプをリストから抽出します。
  • 口座番号から口座の種類を推測する
  • 名前の数字と要素の構成を調べて、この仮定を検証します。
  • タイプに応じて、口座番号の有効性を確認してください。

トリッキーな部分(これが私の問題の場所です) アカウントの種類とそれぞれのアカウント番号の長さは事前に知られていないため、シートのユーザーがアカウントの種類と番号を指定してテーブルに入力します-このアカウント タイプに関連付けられた長さ。ユーザーはこれをリストに入力する必要があります - デリケートな数式をいじくり回してはいけません

ここまで完了

  • 列 A: 生データが含まれます (各セルには最大 5 つの名前と数字があります)
  • 列 B..F: 各列は 1 つの名前を抽出し、すべてが既に抽出されている場合は空のままです
  • 列 G..K: 各列は列 B..F の名前に対応する 1 つの数値を抽出し、すべてが既に抽出されている場合は空のままです。
  • 列 L..P: 各列は、列 G..K の対応する数値の長さを計算します。

ここで、ユーザーは次の詳細をアカウント タイプに特定の数値の長さを割り当てるテーブルに入力
ます。計算されたアカウント番号の長さ。

今やりたいこと

列 Q..U:
すべて、列 G..K の対応する口座番号の口座タイプを示す必要があります。上記のようにユーザーが入力した基準を使用して、ネストされた if-elseIf-elseIf 式を作成するという考え方です。elseIF ステートメントの 1 つの例: SUBSTITUTE
(CONCATENATE("=IF(", criteria ,",", type ,",", errCode )),"length","O10"))
これらの elseIf ステートメントはすべて、連結してマスター式を形成し、アカウントの種類を計算するための式として解析/キャストする必要があります

この提案では、5 つの列 (アカウント番号ごとに 1 つ、マスター数式を含む) とアカウントの種類と基準を指定するテーブルのみを使用し、ユーザーを数式から遠ざけます。1 行のコード (条件) を編集すると、すべての数式が更新されます。効率的でスケーラブル。

ユーザーは内部で数式をいじってはならないため、単純な 1 列の if-elseIf-elseIf は問題外です。上記の代わりに、アカウント番号ごとにアカウントの種類ごとにテストする個別の列を作成することもできます。各テストを独自の列に分離/抽象化すると、読みやすさが大幅に向上し、編集が容易になり、デバッグが大幅に少なくなります-マルチスクリーンワイドの数式が好きでない限り. 例: 5 つの口座番号 * 10 の可能な口座タイプ = 50 の余分な列。任意の条件に対する各編集は、隣接していない他の 4 つの列にコピーし、10,000 行下にドラッグして埋める必要があります (実質的に列の 5x5 配列であるため、列を隣接させることはできません)。効率的でもスケーラブルでもありません。隣接していない数式をワンクリックで更新するエレガントな方法を見逃していない限り

残りの検証エラー表示は簡単です。

サンプルデータ

Tshepo Trust (6901/2005) Marlene Mead (8602250646085)
Great Force Inv 67 Pty Ltd (200602258007)
Jane (870811) Livingstone (6901/2005) Janette Appel (8503250647056) James (900111)


VBA を巧みに使用すれば、抽象化、カプセル化、多次元配列、関数型プログラミングをスプレッドシートでシミュレートする必要がなくなり、これらすべてを実現するのがおそらくはるかに簡単になることはわかっています。しかし、VBA でプログラミングできるようになるまでは、ワークシートの数式が私の避難所になります。

[*]: アカウント番号の長さは、数字の桁数として、または次の式で示されるように記述することもできます: LEN(accNumber)

4

2 に答える 2

1

VBA では、Cell.Formula にアクセスできます。私は通常、Range を使用してセルをアドレスでピークしました。

于 2013-08-03T10:03:38.283 に答える