按條件綁定文本

我已經寫過有關如何快速將多個單元格中的文本粘合到一個單元格中的文章,相反,將長文本字符串解析為組件。 現在讓我們看一個接近但稍微複雜一點的任務——如何在滿足某個特定條件時從多個單元格中粘貼文本。 

假設我們有一個客戶數據庫,其中一個公司名稱可以對應其員工的幾封不同的電子郵件。 我們的任務是按公司名稱收集所有地址並將它們連接起來(用逗號或分號分隔),以便為客戶製作例如郵件列表,即獲得類似以下的輸出:

按條件綁定文本

換句話說,我們需要一個工具來根據條件粘合(鏈接)文本——函數的類似物 蘇梅斯利 (蘇米夫),但對於文本。

方法0.公式

不是很優雅,但最簡單的方法。 您可以編寫一個簡單的公式來檢查下一行中的公司是否與上一行不同。 如果沒有區別,則粘貼下一個以逗號分隔的地址。 如果它不同,那麼我們“重置”累積的,重新開始:

按條件綁定文本

這種方法的缺點很明顯:從獲得的附加列的所有單元格中,我們只需要每個公司的最後一個單元格(黃色)。 如果列表很大,那麼為了快速選擇它們,您必須使用該功能添加另一列 DLSTR (倫),檢查累積字符串的長度:

按條件綁定文本

現在您可以過濾掉那些並複制必要的地址粘貼以供進一步使用。

方法一、一條件上膠的宏功能

如果原始列表未按公司排序,則上述簡單公式不起作用,但您可以輕鬆地在 VBA 中使用一個小的自定義函數。 按鍵盤快捷鍵打開 Visual Basic 編輯器 Alt + F11鍵 或使用按鈕 Visual Basic中 選項卡 開發人員 (開發商). 在打開的窗口中,通過菜單插入一個新的空模塊 插入 - 模塊 並在那裡複製我們函數的文本:

Function MergeIf(TextRange As Range, SearchRange As Range, Condition As String) Dim Delimeter As String, i As Long Delimeter = ", " 粘合彼此不相等 - 我們退出並出現錯誤 If SearchRange.Count <> TextRange.Count然後MergeIf = CVErr(xlErrRef) Exit Function End If '遍歷所有單元格,檢查條件並收集變量OutText 中的文本For i = 1 To SearchRange。 Cells.Count If SearchRange.Cells(i) Like Condition then OutText = OutText & TextRange.Cells(i) & Delimeter Next i '顯示沒有最後分隔符的結果MergeIf = Left(OutText, Len(OutText) - Len(Delimeter) ) End功能  

如果您現在返回 Microsoft Excel,則在函數列表中(按鈕 fx 在編輯欄或選項卡中 公式 - 插入函數) 將有可能找到我們的函數 合併如果 在類別中 用戶自定義 (用戶自定義). 該函數的參數如下:

按條件綁定文本

方法 2. 通過不精確的條件連接文本

如果我們替換宏第 13 行的第一個字符 = 到近似匹配運算符 Like,則可以通過初始數據與選擇標準的不精確匹配來執行粘合。 例如,如果公司名稱可以寫成不同的變體,那麼我們可以用一個函數來檢查和收集它們:

按條件綁定文本

支持標准通配符:

  • 星號 (*) – 表示任意數量的任意字符(包括它們的缺失)
  • 問號 (?) – 代表任何單個字符
  • 井號 (#) – 代表任意一位數字 (0-9)

默認情況下,Like 運算符區分大小寫,例如,將“Orion”和“orion”理解為不同的公司。 要忽略大小寫,您可以在 Visual Basic 編輯器中的模塊開頭添加該行 選項比較文本,這將切換 Like 不區分大小寫。

通過這種方式,您可以編寫非常複雜的掩碼來檢查條件,例如:

  • ?1##??777RUS – 選擇 777 地區的所有車牌,從 1 開始
  • LLC* – 所有名稱以 LLC 開頭的公司
  • ##7## – 所有帶有五位數字代碼的產品,其中第三位是 7
  • ??? – 所有五個字母的名稱,等等。

方法三、兩種情況下粘貼文字的宏功能

在工作中,當您需要將文本鏈接到多個條件時,可能會出現問題。 例如,讓我們假設在我們之前的表格中,添加了一個帶有城市的列,並且不僅應該對給定的公司進行粘合,還應該對給定的城市進行粘合。 在這種情況下,我們的函數必須通過添加另一個範圍檢查來稍微現代化:

Function MergeIfs(TextRange As Range, SearchRange1 As Range, Condition1 As String, SearchRange2 As Range, Condition2 As String) Dim Delimeter As String, i As Long Delimeter = ", " '分隔符(可以用空格或 ; 等替換) e. ) '如果驗證範圍和粘合範圍彼此不相等,則退出並顯示錯誤If SearchRange1.Count <> TextRange.Count Or SearchRange2.Count <> TextRange.Count Then MergeIfs = CVErr(xlErrRef) Exit Function End If '遍歷所有單元格,檢查所有條件並將文本收集到變量OutText For i = 1 To SearchRange1.Cells.Count If SearchRange1.Cells(i) = Condition1 And SearchRange2.Cells(i) = Condition2 then OutText = OutText & TextRange.Cells( i) & Delimeter End If Next i '顯示沒有最後分隔符的結果MergeIfs = Left(OutText, Len(OutText) - Len(Delimeter)) End Function  

它將以完全相同的方式應用——現在只需要指定更多參數:

按條件綁定文本

方法 4. Power Query 中的分組和粘合

如果您使用免費的 Power Query 加載項,則無需在 VBA 中編程即可解決問題。 對於 Excel 2010-2013,可以在此處下載,在 Excel 2016 中,它已默認內置。 動作順序如下:

Power Query 不知道如何使用常規表,因此第一步是將我們的表變成“智能”表。 為此,選擇它並按下組合 按Ctrl+T 或從選項卡中選擇 主頁 – 格式為表格 (首頁——表格格式). 在隨後出現的選項卡上 構造函數 (設計) 你可以設置表名(我離開了標準 表1):

按條件綁定文本

現在讓我們將表加載到 Power Query 加載項中。 為此,在選項卡上 數據 (如果您有 Excel 2016)或在 Power Query 選項卡上(如果您有 Excel 2010-2013)單擊 從表 (數據——來自表):

按條件綁定文本

在打開的查詢編輯器窗口中,通過單擊標題選擇列 公司 然後按上面的按鈕 群組 (通過...分組). 在分組中輸入新列的名稱和操作類型—— 所有線路 (所有行):

按條件綁定文本

單擊確定,我們將獲得每個公司的分組值的迷你表。 如果您左鍵單擊結果列中單元格的白色背景(而不是文本!),則表格的內容清晰可見:

按條件綁定文本

現在讓我們再添加一列,使用該函數,我們將每個迷你表中的地址列的內容粘合起來,用逗號分隔。 為此,在選項卡上 添加欄 我們按 自定義列 (添加列 - 自定義列) 並在出現的窗口中,輸入新列的名稱和Power Query內置的M語言的耦合公式:

按條件綁定文本

請注意,所有 M 函數都區分大小寫(與 Excel 不同)。 點擊後 OK 我們得到一個帶有膠合地址的新列:

按條件綁定文本

它仍然刪除已經不必要的列 表地址 (右擊標題) 刪除列) 並通過單擊選項卡將結果上傳到工作表 主頁 — 關閉並下載 (首頁 - 關閉並加載):

按條件綁定文本

重要的細微差別:與以前的方法(函數)不同,Power Query 中的表不會自動更新。 如果將來源數據有任何變化,那麼您需要右鍵單擊結果表中的任意位置並選擇命令 更新並保存 (刷新).

  • 如何將長文本字符串分成幾部分
  • 將不同單元格中的文本粘合到一個單元格中的幾種方法
  • 使用 Like 運算符針對掩碼測試文本

發表評論