解析字符串并总计正和&否定数字组件

时间:2016-05-09 10:59:01

标签: excel excel-vba excel-formula vba

我在Excel单元格中有一个字符串。

每行代表一个句子。此字符串表示句子中单词的正面和负面分数。

句子可以是任何长度,例如

  

joy:pos = 0.37 neg = 0.0,老实说:pos = 0.4 neg = 0.0,pick: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

有什么想法吗?

2 个答案:

答案 0 :(得分: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的新手。我确定它可以优化或收紧一点。将这两个函数放在VBA模块中。然后将=pos=neg相应地作为常规公式放入单元格中,并将范围放入。

答案 1 :(得分:1)

您可以使用RegExp进行快速解析,即

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