2016-05-09 10 views
1

Excelセルに文字列があります。文字列を解析し、正と負の数値コンポーネントの合計を返します。

各行は文を表します。この文字列は、文中の単語の正と負のスコアを表します。センテンスは任意の長さとすることができる。

喜び:POS = 0.37 NEG = 0.0、正直:POS = 0.4 NEG = 0.0、ピック:POS = 0.0 NEG = 0.0
こんにちは:POS = 0.0 NEG = 0.0、OK:POS = 0.0 NEG = 0.0

セルの正と負の合計を計算します。

Excelでテキストと列の機能を使用して文字列を分割しないと、数式でこれを行う方法がわかりません。

この場合の出力例は次のようになります

POS = 0.77 NEG = 0.0
POS = 0.0 NEG = 0.0

任意のアイデア?

+0

ています'pos = 0.37 neg = 0.0、正直:pos = 0.4 neg = 0.0、pick:pos = 0.0 neg = 0.0'であり、posとnegのコンマで区切られた合計が必要です次のセルで? – Brian

+0

@ブライアンはい。正と負の合計は、必要に応じて2つの列になります。 – user47467

+0

私はVBAソリューションを開発することをお勧めします。 –

答えて

2

は、より良い方法があるかもしれませんが、私は、これはあなたのために働くだろうと信じて:

Function pos(rTest As Range) As String 

Dim a() As String 
Dim i As Integer 
Dim iVal As Double 
Dim wf As WorksheetFunction 
Set wf = Application.WorksheetFunction 

a = Split(rTest, ",") 

Dim iStart As Integer 
Dim iEnd As Integer 

For i = LBound(a) To UBound(a) 
    iStart = wf.Find("=", a(i)) + 1 
    iEnd = InStr(wf.Find("=", a(i)) + 1, a(i), " ") 
    iVal = iVal + CDbl(Mid(a(i), iStart, iEnd - iStart)) 
Next 

pos = "pos=" & CStr(iVal) 

End Function 

Function neg(rTest As Range) As String 

Dim a() As String 
Dim i As Integer 
Dim iVal As Double 
Dim wf As WorksheetFunction 
Set wf = Application.WorksheetFunction 

a = Split(rTest, ",") 

Dim iStart As Integer 
Dim iEnd As Integer 

For i = LBound(a) To UBound(a) 
    iStart = InStrRev(a(i), "=") + 1 
    iEnd = Len(a(i)) + 1 
    iVal = iVal + CDbl(Mid(a(i), iStart, iEnd - iStart)) 
Next 

neg = "neg=" & CStr(iVal) 

End Function 

が、私はまだVBAに自分自身が新しい考えます。私はそれが最適化されるか、少し強化されると確信しています。 2つの機能をVBAモジュールに入れます。その後、細胞内の定期的な式として、それに応じて=pos=negを入れて、範囲を置く。

+0

私はVBAも新しくなっています。私は期待されている終了サブコンパイルエラー – user47467

+0

まだ問題と同じエラーを実行している – user47467

+0

何を取得しているのですか?コードをコピーして通常のモジュールに貼り付けましたか?あなたの書式をセルに保存すると(それはコンマで区切られた項目のリストです)、私のために働きます。 – Brian

1

あなたが迅速な解析のための正規表現を使用することができ、すなわち

Sub Test() 
Debug.Print StrOut("joy: pos=0.37 neg=0.0, honest: pos=0.4 neg=0.0, pick: pos=0.0 neg=0.0") 
End Sub 

機能は

Function StrOut(strIn As String) As Variant 
Dim objRegex As Object 
Dim objRegexMC As Object 
Dim objRegexM As Object 
Dim arr(1) As Variant 

Set objRegex = CreateObject("vbscript.regexp") 
With objRegex 
    .Pattern = "(pos|neg)=([0-9]*\.[0-9]+|[0-9]+)" 
    .Global = True 
    If .Test(strIn) Then 
     Set objRegexMC = .Execute(strIn) 
     For Each objRegexM In objRegexMC 
     If objRegexM.submatches(0) = "pos" Then 
      arr(0) = arr(0) + CDbl(objRegexM.submatches(1)) 
     Else 
      arr(1) = arr(1) + CDbl(objRegexM.submatches(1)) 
     End If 
     Next 
    StrOut = arr(0) & " " & arr(1) 
    Else 
    StrOut = "no match" 
    End If 
End With 
End Function 
関連する問題