1

職場の多数のサーバーで実行されている OS のリストがあります。OS を指定する文字列には、さまざまな形式があります。以下にいくつかのサンプルを示します。

  • AIX5.1
  • VMware ESX Server 3.5.0 build-110268
  • Linux Linux 2.6.X Linux
  • Red Hat Enterprise AS 4 (2.6.9-78.0.13.ELlargesmp)
  • Microsoft (R) Windows (R) 2000 Advanced Server
  • Microsoft Windows XP Win2008R2 6.1.7601

全部で 180 の一意の文字列があります (および 10,000 を超えるサーバー)。

私の上司は、各文字列から OS の種類とバージョンを抽出する式を求めています。10 個のエントリを含むテーブルを検索して、確実に動作する OS タイプ用に作成しました。ただし、バージョンの形式は OS の種類に依存し、さらに OS の種類ごとに複数の形式が存在する可能性があるため、バージョンの公式はより厳密です。

私の知る限り、COL A に文字列、COL B にバージョンを含む 180 行を含むテーブルが必要で、その文字列に対して Vlookup を実行します。ただし、彼は、VBA を使用せずに Excel の式のみを使用して、文字列からバージョンを抽出することを要求しています。

この時点でほとんど諦めていたので、このサイトに投げ出します。これができるかどうか誰でも知っていますか?

4

4 に答える 4

3

これが私の試みです:

=IF(NOT(ISNUMBER(SEARCH(".", A1))), "Cannot find version number", IF(NOT(OR(MID(A1, SEARCH(".", A1) - 2, 1) = "1", MID(A1, SEARCH(".", A1) - 2, 1) = "2", MID(A1, SEARCH(".", A1) - 2, 1) = "3", MID(A1, SEARCH(".", A1) - 2, 1) = "4", MID(A1, SEARCH(".", A1) - 2, 1) = "5", MID(A1, SEARCH(".", A1) - 2, 1) = "6", MID(A1, SEARCH(".", A1) - 2, 1) = "7", MID(A1, SEARCH(".", A1) - 2, 1) = "8", MID(A1, SEARCH(".", A1) - 2, 1) = "9")), IF(NOT(ISERROR(MID(A1, SEARCH(".", A1) - 1, SEARCH(" ", MID(A1, SEARCH(".", A1), LEN(A1)))))), MID(A1, SEARCH(".", A1) - 1, SEARCH(" ", MID(A1, SEARCH(".", A1), LEN(A1)))), MID(A1, SEARCH(".", A1) - 1, LEN(A1))),  IF(NOT(ISERROR(MID(A1, SEARCH(".", A1) - 2, SEARCH(" ", MID(A1, SEARCH(".", A1), LEN(A1)))))), MID(A1, SEARCH(".", A1) - 2, 1 + SEARCH(" ", MID(A1, SEARCH(".", A1), LEN(A1)))), MID(A1, SEARCH(".", A1) - 2, LEN(A1)))))

この (複雑な) 式の利点は、バージョン 9 以降で機能することです。たとえば、テキスト全体が「Ubuntu Linux 13.5.3」の場合、「13.5.3」と出力されます。お役に立てれば!

編集: 私の式では、バージョン 100 以降のオペレーティング システムが存在しないことを前提としていることを付け加えておく必要があります。

于 2012-07-23T02:15:26.190 に答える
2

最も簡単な方法は、配列全体を一度に計算できる、いわゆる配列数式を使用することだと思います。配列数式を入力するときは、単に。ではなく、最後にCtrl++を押す必要がありShiftます。EnterEnter

以下のスクリーンショットは、使用するさまざまな列と式を示しています。E1最初にセルに数式を入力します(確認するにはCtrl++を使用します)。次に、右下隅を選択して下にドラッグし、列内の他のセルにコピーします。ShiftEnterEE1

Aには、OSの180の名前が含まれています。列Bにはバージョン番号が含まれています。列Dには、検索する10,000を超える文字列が含まれています。列Eには、10,000を超える対応するルックアップバージョン番号が含まれています。

列で使用される式は次のとおりEです。

=IF(MAX(COUNTIF(D1,$A$1:$A$6)),OFFSET($B$1,MAX(ROW($A$1:$A$6)*COUNTIF(D1,$A$1:$A$6))-1,0),"Not Found")

このD1式のは、行番号によって変わります。あなたの場合、もちろん、180個のOS名すべてを検索するために$A$6に置き換える必要があります。$A$180アイテム数を希望のスケールまで増やすとパフォーマンスがどうなるかわからないので、徐々にアイテム数を増やしていくことをお勧めします...

これがうまくいけば、そこで助けが必要な場合は、数式がどのように機能するかをもう少し詳しく説明できます。

注:Ctrl+ Shift+Enterを押して配列数式として確認すると、Excelはその周りに中括弧を表示します。式を変更するときも、毎回このキーの組み合わせを使用する必要があります。

使用する数式を示すExcelシートのスクリーンショット

于 2012-07-23T02:29:12.843 に答える
1

少し時間に余裕があったので、これを楽しいチャレンジとして試してみることにしました。それは機能しますが、あらゆる変動に非常に敏感です。ただし、ここで送信したすべてのケースの正しいバージョン番号が出力されます。

=IF(ISERROR(FIND(".",B2,1)),"Cannot find version number",IF(ISERROR(FIND("(",B2,1)), MID(B2, FIND(".",B2, 1)-1, IF(ISERROR(FIND(" ", B2, FIND(".", B2, 1))), LEN(B2) + 1, FIND(" ", B2, FIND(".", B2, 1))) - FIND(".", B2, 1) + 1),MID(B2,FIND("(",B2,1)+1,FIND(")",B2,1)-FIND("(",B2,1)-1)))

数式にエラーがある場合は、関数を翻訳しなければならなかったことが原因である可能性があります。私に知らせてください、私はあなたがそれを修正するのを手伝います.

于 2012-07-23T01:28:09.453 に答える
0

Reinierの答えも素晴らしいですが、頑固な上司の満足度を十分に高める新しい方法を教えてもらいました:)。これには、約 35 個の値を持つルックアップ テーブルが必要です (これまでの唯一の解決策であった 180 個の一意の文字列すべてのエントリを持つよりもはるかに優れています)。使用する式は次のとおりです。

=IFERROR(LOOKUP(2^15, SEARCH('Lookup Tables'!$A$2:$A$36, $A2), 'Lookup Tables'!$B$2:$B$36), "")

配列数式として入力する必要はありません。シート「ルックアップ テーブル」では、列 A にルックアップ用語のリストが保持され、列 B にはそれらの用語に関連付けられたバージョン番号が保持されます。ルックアップ用語にはワイルドカードを含めることができます。例えば:

勝利*2003

前者が後者より前にある限り、Win と 2003 を含む任意の文字列に一致します。文字列の左右にワイルドカードを含める必要はありません。数式がこれを行います。奇妙なことに、文字列がリスト内の 2 つのエントリに一致する場合、一番上のエントリではなく一番下のエントリが優先されます。

もちろん、最初に 180 個の文字列のリストを調べて、どの検索文字列を含めるかを決定する必要があります。

式の値 $A2 は、OS 文字列を含むセルを表します。2^15 は任意の大きな数です。式がどのように機能するかを正確に説明することはできませんが、機能します。

于 2012-07-25T00:00:18.900 に答える