2015-09-30 85 views
1

我有一個有兩列的excel表。第一列是關鍵短語,第二列是消息。關鍵短語可能出現在消息列中。我需要知道消息列中發生了多少次關鍵短語。請建議一些簡單易行的方法。在短語內計數並突出顯示關鍵字

關鍵短語是一列,消息是第二列。消息列是1個或多於1個關鍵短語的組合(連接)。我需要找出每條消息包含多少關鍵短語。

+1

如果Excel數據是SQL查詢的結果,我建議使用子查詢或分區來雕刻T-SQL,以便將結果與其餘數據一起傳遞。 – Jeeped

+0

消息列可以具有多個存在於第一列中的關鍵短語。 E,g,如果關鍵短語是「這是要測試的」,那麼這個字符串可以在消息列中作爲多行中的子字符串出現。即g「hello world;這是要測試的;這也正在測試中;」。這種類型的值可在列B中找到。 – Megha

+0

是的,這是子查詢在SELECT語句中的作用。 – Jeeped

回答

1

您可能可以通過模塊子程序收集高效的計數,該子程序執行存儲器陣列中的所有數學運算並將計數返回工作表。

Counts keywords in phrases sample data

我使用了一些標準的Lorem Ipsum關鍵字和短語創建上述樣本數據。

點擊Alt鍵 + F11和VBE打開時,立即使用下拉菜單插入►模塊(Alt鍵 + 中號)。將以下內容粘貼到名爲Book1 - Module1(Code)的新模塊代碼表中。

Option Explicit 

Sub count_strings_inside_strings() 
    Dim rw As Long, lr As Long 
    Dim k As Long, p As Long, vKEYs As Variant, vPHRASEs As Variant, vCOUNTs As Variant 

    ReDim vKEYs(0) 
    ReDim vPHRASEs(0) 

    With Worksheets("Sheet1") '<~~ set to the correct worksheet name\ 
     'populate the vKEYs array 
     For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row 
      vKEYs(UBound(vKEYs)) = LCase(.Cells(rw, 1).Value2) 
      ReDim Preserve vKEYs(UBound(vKEYs) + 1) 
     Next rw 
     ReDim Preserve vKEYs(UBound(vKEYs) - 1) 

     'populate the vPHRASEs array 
     For rw = 2 To .Cells(Rows.Count, 2).End(xlUp).Row 
      vPHRASEs(UBound(vPHRASEs)) = LCase(.Cells(rw, 2).Value2) 
      ReDim Preserve vPHRASEs(UBound(vPHRASEs) + 1) 
     Next rw 
     ReDim Preserve vPHRASEs(UBound(vPHRASEs) - 1) 
     ReDim vCOUNTs(0 To UBound(vPHRASEs)) 

     'perform the counts 
     For p = LBound(vPHRASEs) To UBound(vPHRASEs) 
      For k = LBound(vKEYs) To UBound(vKEYs) 
       vCOUNTs(p) = CInt(vCOUNTs(p)) + _ 
        (Len(vPHRASEs(p)) - Len(Replace(vPHRASEs(p), vKEYs(k), vbNullString)))/Len(vKEYs(k)) 
      Next k 
     Next p 

     'return the counts to the worksheet 
     .Cells(2, 3).Resize(UBound(vCOUNTs) + 1, 1) = Application.Transpose(vCOUNTs) 

     'run the helper procedure to Blue|Bold all of the found keywords within the phrases 
     Call key_in_phrase_helper(vKEYs, .Range(.Cells(2, 2), .Cells(Rows.Count, 2).End(xlUp))) 

    End With 
End Sub 

Sub key_in_phrase_helper(vKYs As Variant, rPHRSs As Range) 
    Dim p As Long, r As Long, v As Long 

    With rPHRSs 
     For r = 1 To rPHRSs.Rows.Count 
      .Cells(r, 1) = .Cells(r, 1).Value2 
      For v = LBound(vKYs) To UBound(vKYs) 
       p = 0 
       Do While CBool(InStr(p + 1, .Cells(r, 1).Value2, vKYs(v), vbTextCompare)) 
        p = InStr(p + 1, .Cells(r, 1).Value2, vKYs(v), vbTextCompare) 
        Debug.Print vKYs(v) 
        With .Cells(r, 1).Characters(Start:=p, Length:=Len(vKYs(v))).Font 
         .Bold = True 
         .ColorIndex = 5 
        End With 
       Loop 
      Next v 
     Next r 
    End With 
End Sub 

您可能需要重命名工作表以在5 代碼行進行處理。我還加入了一個幫助程序,用藍色|粗體字標識短語內的關鍵詞。如果不需要,註釋掉或刪除第一個子過程底部的Call key_in_phrase_helper(...)行。

點擊Alt鍵 + Q返回到您的工作表。 Tap Alt + F8打開對話框和運行子程序。如果你的數據與我放在一起的樣本數據相似,那麼你應該有類似的結果。

Counts keys in phrases


¹這些都是一些先進的方法,但我覺得他們也是解決問題的最佳途徑。如果您有具體問題,您自己的研究沒有充分解釋,我會嘗試在評論部分解決它們。我爲創建該解決方案而創建的示例工作簿可根據要求提供。

+0

這太棒了。非常感謝答覆。它完美的作品。 – Megha

+0

很高興聽到。在這個過程中,我不得不做出一些假設,但似乎我猜對了。 – Jeeped

+0

還需要一個幫助。一些關鍵短語有一些日期和數字,這些日期和數字在原始消息中可能有所不同,但消息的其餘部分保持不變。例如關鍵短語是「Id創建xx-xx-xx失敗」並且消息是「Id創建9823023失敗」。你能幫我解決這個問題,它會在匹配時忽略數字。 – Megha

0

您可以從第二行開始使用此公式COUNTIF(B:B;"*"&A2&"*")

+0

你能幫我理解這一點嗎?我不是excel的常用用戶。 – Megha

+0

'B:B'是一個引用整個列B,你有消息。公式會查看它。 'A2'是指在列A的第二行中您有密鑰的單元格。星號('*')是用於搜索的通配符。 &符號(&)是連接字符串的運算符。例如,如果您在列A中有一個「excel」鍵,並在B列中顯示「Excel 2016與Windows 10兼容」的消息,則需要構建搜索模式* * excel *'。這就是爲什麼在公式參數的開始和結尾使用字符串部分「*」。然後用'&'將它與鍵連接起來。 –

+0

謝謝,但抱歉,我有一個疑問。這隻會比較一個A2和整個B列的元素:B ?.我需要比較列A的所有值和庫侖B的所有值。 – Megha

相關問題