4

アプリケーションのテストで使用される英数字データの配列があり、特定の理由から、各文字列で"a" から "f" までの文字の出現回数の合計を計算する必要があります (これは、以降のデータ処理に使用されます)。

02599caa0b600 --> should be 4
489455f183c1fb49b --> should be 5
678661081c1h
66410hd2f0kxd94f5bb
8a0339a4417
f6d9f967ts4af6e
886sf7asc3e85ec
03f1fhh3c3a2am
e491b17638m60
1m8h2m07bhaa4tnhbc4
29ma900a80m96m65
ca6a75f505tsac8
956828db8ts7fd1d
cf1d220a59a7851180e
a8b7852xd9e7a9
b85963fbe30718db9976
39b8kx8f85abb1b6
0xxb3b648ab
a8da75f730d45048
588h69d344

これは文字列がどのように見えるかで、その長さは約 10 ~ 30 シンボルで、処理のために毎日約3 ~ 5kあると思います。前提と制限:

  1. 大文字と小文字は関係ありません (幸いなことに)。
  2. 文字のリストは 1 日で変更される可能性がありますが、ak、dg などの範囲のままである可​​能性が非常に高いため、ソリューションは可能な限り柔軟にする必要があります。
  3. 一時的な計算/範囲は禁止されていませんが、短いほど良いです。
  4. 私は純粋な Excel ソリューションを好みますが、複雑すぎる場合は、VBA を使用することもできます。それにもかかわらず、複雑な Excel の数式は、「2 行のコード」の VBA よりも優れています (最初の数式が期待どおりに機能する場合)。

私がこれまでに試したこと(気づいたように、ここでの練習は大歓迎です):

  • 回答済みの質問を検索しましたが、同様の Excel ベースのソリューションは見つかりませんでした。他の言語/アプローチはオプションではありません (VBA を除く)。
  • これまでのところ、私が自力で得た最良のものはネストされたSUBSTITUTE関数ですが、それは汚れていて非常に単純です。範囲が cx に変わる可能性があると仮定すると、それは悪夢になります。
  • 私はExcelの初心者ではありませんが、複雑な配列数式のようなものは私にとってまだ難しいです.

とにかく、私は「すぐに使える」「すぐに使える」解決策を求めません.同様の問題を自己学習し、さらに理解するための助けと正しい方向性/アプローチを求めます.

4

4 に答える 4

6

複数のSUBSTITUTE関数をネストせずにSUBSTITUTEを使用できます。たとえば、A1のテキスト文字列では、B1のこの数式はすべての文字aからf(大文字または小文字)をカウントします。

=SUMPRODUCT(LEN(A1)-LEN(SUBSTITUTE(LOWER(A1),{"a","b","c","d","e","f"},"")))

cからxのような文字のより長いリストについては、このバージョンを使用して、それらすべてをリストすることを避けることができます

=SUMPRODUCT(LEN(A1)-LEN(SUBSTITUTE(LOWER(A1),CHAR(96+ROW(INDIRECT("3:24"))),"")))

3:24は文字3(c)から文字24(x)を表すため、すべての文字を1:26に、oからyなどを15:25に簡単に変更できます。

于 2013-02-05T22:41:31.883 に答える
4

ここに私の選択肢があります - すでに投稿されたものとかなり似ていますが、とにかく...特に、今日では非常にまれな学習に興味がある場合)

A2 で始まるリストがあると仮定すると、次の配列数式を使用します。

=SUM(LEN($A2)-LEN(SUBSTITUTE($A2,CHAR(ROW(INDIRECT(CODE("a")&":"&CODE("f")))),"")))

念のため、通常の代わりにCTRL+ SHIFT+を押してください。ENTERENTER

いくつかの説明:

  1. 文字 af の範囲は、範囲エッジの char コードを使用して生成され、CHAR(ROW(INDIRECT(...)))構造体を使用して char の配列に変換されます。
  2. 次に、「悪夢」が助けになり、最終的に、得られた置換された文字列と元の文字列の減算の数を要約します。
  3. したがって、このような二重変換の場合、codetable は必要ありません)))

そして、さらに 2 つの同様の「ナッツ」サンプル - 学習目的のためだけです。

すべての数字の一致を要約する必要がある場合、入力として 0 と 9 を使用して上記を使用できます (数字は 0 から始まる 48 ~ 57 コードの文字です)。ただし、次のより単純なソリューションも有効です。

=SUM(LEN($A2)-LEN(SUBSTITUTE($A2,ROW($1:$10)-1,"")))

ここでのコツは、配列または行番号 1 ~ 10 から 1 を引いたものを使用して 0 ~ 9 の数字を生成する可能性があることですROW(0)エラーが発生します。

最後に、文字列内のすべての数字の合計を計算する必要がある場合は、次を使用します。

=SUM(IFERROR(VALUE(MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)),0))

ここでは、最初の文字列をMID1 文字ごとにを使用して文字に分解し、IFERROR数字以外の場合は 0 を使用して返し、数値であることをテストします。

最後の2つは(明らかに)あなたの最愛の配列ナッツです)))

私は上記のサンプルを QA 用の Excel トレーニングで使用しています (ところで、同僚の SE へようこそ!)。このようにして、典型的な機能/ナッツ クラッキングのアプローチを示します。それがあなたにとっても役に立ったことを願っています。ただし、以前のすべての回答、特に @barry のナッツを使わないレシピには、少なくとも公正な賛成票を投じる価値があります)

便宜上、サンプル ファイルを共有しています: https://www.dropbox.com/s/qo5k479oyawkrzh/SumLettersCount.xlsx

テスト頑張ってください)

于 2013-02-06T00:12:05.247 に答える
3

この数式は、データが列 A にあり、探している範囲の最初の文字が F1 にあり、最後の文字が G1 にあると想定しています。配列数式として入力し、データの末尾にコピーする必要があります。

  =SUM(--(UPPER(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>=UPPER($F$1))*--(UPPER(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<=UPPER($G$1))).

対象の文字の範囲が変更された場合は、セル F1 の範囲の最初の文字と G1 の最後の文字を変更する必要があることに注意してください。

どの文字列の文字数も最大数 (たとえば 50) を超えないことが確実な場合は、式を次のように簡略化できます。

  =SUM(--(UPPER(MID(A1,ROW($1:$50),1))>=$F$1)*--(UPPER(MID(A1,ROW($1:$50),1))<=$G$1))
于 2013-02-05T23:02:25.537 に答える
0

データが列 A にあると仮定して、次の式を試してください。

=SUM(--NOT(ISERROR(SEARCH(MID(A1,ROW($1:$99),1),"abcdef"))))-99+LEN(A1)

式を配列式として入力します。つまり、Ctrl- Shift-を押しEnterます。

于 2013-02-05T22:39:52.477 に答える