2012-01-23 6 views
1

現在isnumberを使用して、特定の単語が文を含むセル内に存在するかどうかを判断しています。私は、特定の単語に常に先行する、または後に続く数字の値を見つける方法を決定しようとしています。 「定数単語」の前または後に「変数単語」を引き出すために、式を操作するか、一連の式を作成するにはどうすればよいですか?isnumber、可変ワードの文章を解析する

たとえば、
45門を通過した39匹の猫がいました。
20門を通過した猫は32匹ありました。

私はゲートを通過した猫の数を引き上げようとしています。

私の現在の進行状況...猫の

数は常に1の間で落ちる - 100、およびゲートの数も常に1との間で落ちる - 現在100 、私は100列を実行しています。各列は= ISNUMBER(SEARCH( "2 cats"、 'sentence'を含むセル))のような式を持ち、次の列は= ISNUMBER(SEARCH( "3 cats"、 'sentenceを含むセル')) 。私は、行全体の真のを発見し、そのセルの猫の値を返す列を持つことができるように、これは私の現在の問題

... trueまたはfalseを返します...それぞれの内の2つの数字が

あります私は現在2つの本当の列を持っています。

質問...

は単語猫の前に番号を引き出すための方法は何ですか? 猫の数は必ずしも常にゲートの数より大きくなくても、常にゲートの数より少なくなることはありません。 「cats」という言葉は各文章全体にわたって一定のままですが、数字は変更されます...

うまくいけば、これは十分に分かりやすく、誰かが助けることができます!前もって感謝します!!

が追加されました - 私の現在のコンピュータでは、私はVBAにアクセスできないようにスターターエディションを実行しています。私はこの公式を使うことがうまくいくことを発見しました。 =ルックアップ(1、右(TRIM)(LEFT(J46、FIND( "cats"、J46)-1))、{1,2,3,4,5,6}))。 すべての数値を正の値として返します。

私の質問は今どうなっていますか?それより先にあるのではなく、定数の後に続く値はどうやって見つけられますか? -

+0

「定数単語に続く値をどうやって見つけますか?」というのは別の質問ですか?以下の私の公式は、 "犬"に直ちに "猫"の直前の数字を見つけます。この 'LOOKUP(1000、MID(A1、FIND(" dogs "、A1)+4、{1,2、 3,4})+ 0) ' –

+0

ありがとうバリー!それは完全であり、おそらくより効率的です= MID(A1、(FIND( "cats"、A1)+6)、2) ここで、6はスキップしたい右側のスペースの数です、2は返す数字の桁数です。文のフォーマットが一定のままであると仮定すると、右側のスペースの数は常にセル全体で同じにとどまります。 –

答えて

3

この式は、あなたが同じことを行うことができますA1

=LOOKUP(1000,MID(A1,FIND("cats",A1)-{1,2,3,4},{1,2,3,4})+0)

のテキストからあなたの猫の数を取得する必要があります』。注意:それは「猫」ではなく「猫」見つけるようFINDは大文字と小文字が区別されます - あなたは大文字と小文字の区別をしたくない場合は、検索する変更を

説明:式のMID部分、この部分すなわち

MID(A1,FIND("cats",A1)-{1,2,3,4},{1,2,3,4})

は、4つの値の「配列」を返します。 A1にThere were 3 cats that ran through 20 gatesが含まれている場合は、この「配列」が返されます。あなたが得るようにそれらを数値(またはエラー)に変換します。

=ルックアップ(1000、{#VALUE!、3,3、#3、 "3"、 "3" VALUE!})

とルックアップ値は、それはいつもここになりルックアップ配列()内の任意の数よりも大きい場合、その後LOOKUPはlast数をとり、すなわち3

あなたがまでの数字の要求を満たすことができます9999

= LOOKUP(10000に変化させることにより、MID(A1、( "猫"、A1)を見つける - 0 + {1,2,3,4 ,5}、{1,2,3,4 ,5を}) )

数値が大きいほど同じように調整する

+0

私はこの答えが好きですが、私は式で '{'を使うことに慣れていません。それは何ですか?これらの行に沿って、999を超える数字を取得するにはどのように変更しますか? – mischab1

+0

+1よく行われたバリー – brettdj

+0

brettdj、ありがとうDave @ mischab1、私は私の答えに説明を追加..... –

2

ただ、モジュールでこれを入れて、新しいセル内の関数を使用します。= findPrevCount(A1、「猫」)

Function findPrevCount(ByVal sString As String, ByVal sKey As String) As Long 
    Dim v As Variant 
    Dim i As Integer 

    sString = Replace(sString, ".", "") 'strips periods 
    sString = Replace(sString, ",", "") 'strips commas 
    v = Split(sString, " ")    'turn sentence into several words 

    For i = LBound(v) To UBound(v) 
     'case insensitive search, can use wild cards 
     If LCase(v(i)) Like LCase(sKey) And i > 1 Then 
      If IsNumeric(v(i - 1)) Then 
       findPrevCount = v(i - 1) 
       Exit Function 
      End If 
     End If 
    Next i 

End Function 

これは、任意のテキストおよび任意の金額で動作するはずです。 findPrevCount(C2、 "cat *")= findPrevCount(C2、 "gate *")、findPrevCount(C2、 "cat *")=を使用して、 「)、 『足りない猫。ゲート『』)

String           Cats Gates Result 
There were 39 cats that ran through 25 gates.  39  25  39 
There were 32 cats that ran through 40 gates. 32  40  Not enough cats. 
There were 2 cats that ran through 1 gate.  2  1  2 
There was 1 cat that ran through 1 gate.  1  1  1 
There was 1 cat that ran through 2 gates.  1  2  Not enough cats. 
0

数値とその前にある単語の間にスペースがある限り機能する、より単純な関数です。

Function FindValue(ByVal sString As String, ByVal sKey As String) As Integer 
    Dim iFound As Integer 

    iFound = InStr(LCase(sString), LCase(sKey)) 
    If iFound > 0 Then 
     sString = Trim(Mid(sString, 1, iFound - 1))   ' discard the key and everything after it 
     sString = Trim(Mid(sString, InStrRev(sString, " "))) ' discard everything before the number 
    End If 

    FindValue = Val(sString) 

End Function 

あなたはそれが値で作業する必要がある場合は> 999は、任意のカンマを取り除くためにreplaceを使用しています。

FindValue = Val(Replace(sString, ",", ""))