高楠 徐剛
摘? 要:Excel是使用非常廣泛的辦公軟件體系之一,自身帶有多種類型、可實現多種功能的內置函數,但仍不能完全滿足一些用戶的特殊功能使用要求?;诖?,Excel提供了宏功能,滿足用戶通過自定義的方式開發(fā)獨特功能的使用需求。利用VBA的宏編程技術,通過自定義Excel函數,實現Excel單元格數據中指定字符間文本的批量去除功能,同時提供指定字符去除或保留兩種實現模式的解決方案。
關鍵詞:VBA;指定字符;文本去除
中圖分類號:TP317? ? ? 文獻標識碼: A 文章編號:2096-4706(2021)02-0032-03
Abstract:Excel is one of the more widely used office software systems. It has many types of built-in functions to realize many functions,but it still cannot fully meet the usage requirements of special functions of some users. In view of this,Excel provides macro functions to satisfy users usage requirements that develop unique functions through self-definition way. Using the macro programming technology of VBA and through self-definition of Excel function,the batch removal function of the text between the specified characters in the Excel cell data is realized. At the same time,two implementation modes of solutions removing or retaining of the specified characters are provided.
Keywords:VBA;specified character;text removal
0? 引? 言
Excel是微軟公司Office辦公軟件體系中的主要模塊之一,Excel為普通用戶提供各式各樣的數據處理、數據分析、數據計算方法。但在一些需要獨特操作,使用小眾的運算方面,利用Excel提供的各種函數可以分次組合計算實現獨特的功能,在實際操作中,雖然能夠滿足用戶的特殊需求,但重復性操作步驟多,影響實際工作效率,此時可考慮利用Excel的宏開發(fā)功能,對重復性步驟進行整合編程處理,以自定義運算的方式簡化工作步驟。
1? 問題提出
在實際工作中,經常遇到一些問題,需要批量去除單元格數據中的括號及括號中的內容,并且需要去除的內容在單元格字符串中的位置并不固定。如在學生學籍管理工作中,規(guī)范的專業(yè)名稱不帶括號及括號中的專業(yè)方向,但多數原始數據中的專業(yè)名稱后均帶有括號及括號中的專業(yè)方向。對于此類數據,在數據規(guī)范化處理時,需要批量去除專業(yè)名稱后面的括號及括號內的專業(yè)方向名稱。
對于此類問題,可通過Excel的篩選,手動小批量刪除同內容數據的括號及括號中的文本,或者使用Excel提供的MID、LEFT、RIGHT等字符串函數根據原始數據的不同進行分類處理。不管采用哪種方式,在實際操作中均存在操作步驟多、使用煩瑣的問題。如何利用Excel的宏功能將步驟多而煩瑣的操作進行集成化處理,是本文將要著重討論和解決的問題。
同時,可將此類問題引申為,對于給定的已知Excel單元格字符串,可通過指定開始位置的字符和結束位置的字符來實現Excel單元格中字符串的特征化批量刪除。這尤其適用于需要批量去除的文本在整個字符串中的位置不固定的情形。
2? 問題分析
以實際問題為例進行分析,如圖1所示Excel表格,已知A列,批量生成B列。
通過分析上圖可以得出,需要批量去除的字符串均在括號內并且連同括號一同去除。同時,A列數據中需要去除的字符串缺少規(guī)律性且在原字符串中的位置并不固定。
Excel自帶的LEFT、RIGHT函數,具有從左往右和從右往左按字符數生成新字符串的功能。故解決問題的核心可轉化為求A列單元格數據字符串中括號位置的問題。
利用Excel自帶的函數實現功能的具體步驟分析為:
(1)利用Excel自帶的函數LEN實現字符串長度的計算,該長度可作為程序循環(huán)模塊中的循環(huán)次數控制變量。
(2)利用Excel自帶的函數MID實現字符串文本的逐個提取,通過將提取出的字符和指定字符相比對,可以確定是否到達刪除字符串的起始位置及結束位置。
(3)當判斷出MID函數提取的字符等于指定開始字符時,可記錄當前字符在字符串中的位置數。
(4)當判斷出MID函數提取的字符等于指定結束字符時,可記錄當前字符在字符串中的位置數。
(5)通過記錄的位置數,綜合利用Excel自帶的LEFT、RIGHT函數,獲取所需的頭尾字符串,使用Execl提供的字符串連接運算符“&”連接形成最終需要的字符串。
上述步驟中,為了實現指定字符的去除與否控制,在自定義Excel函數時,通過附加一個判斷參數,進一步拓展自定義函數的功能,使自定義函數具有按照用戶要求實現是否保留指定字符的功能。
綜上所述,利用Excel自身支持的VBA宏編程功能,通過自定義實現符合用戶特殊需求的函數,依賴該函數讓Excel具有一次性解決上述問題的能力,簡單直接的解決同類問題。
3? 問題解決
3.1? VBA簡介
Visual Basic for Applications(VBA)是Visual Basic的一種宏語言,主要用來擴展Windows的應用程式功能,特別是Microsoft Office軟件,也可說是一種應用程式視覺化的Basic Script。1994年發(fā)行的Excel 5.0版本中,即具備了VBA的宏功能。
3.2? 基本算法描述
首先,設需要處理的目標單元格為S,其次,利用LEN求源字符串的字符個數,即長度,再次,以長度為循環(huán)依據,使用判斷語句逐字符判斷是否為指定開始字符或指定結束字符,如是,記錄指定開始字符或指定結束字符位置數,最后,利用已記錄位置及Excel自帶函數LEFT和RIGHT綜合生成用戶需要的單元格內容。
3.3? 基本算法實現
設有字符串s為a1,a2,…,an,b1,b2,…,bm,c1,c2,…cp,其中n,m,p均為隨機自然數,需求a1,a2,…,an,c1,c2,…cp或a1,a2,…,an,x,y,c1,c2,…cp。
設已知字符串長度為c則,c=n+1+m+1+p;
設字符x位置為x1,則x=n+1;
設字符y位置為y1,則y1=n+1+m+1;
即a1,a2,…,an,c1,c2,…,cp=LEFT(s,x1-1) & RIGHT(s,y1+1),a1,a2,…,an,x,y,c1,c2,…cp=LEFT(s,x1) & RIGHT(s,y1)。
3.4? 程序基本流程圖
自定義Excel函數的程序基本流程圖如圖2所示。
流程圖的主要內容為:
(1)前期數據處理包括函數定義、變量定義,求目標字符串長度并以該長度為依據設立循環(huán)。
(2)每取到字符串中的一個字符,便利用指定開始字符、指定結束字符做判斷。如相等,則記錄該字符在字符串中的位置,如不相等,則繼續(xù)取下一個字符,循環(huán)往復,直到遍歷字符串中的所有字符。
(3)利用函數定義中指定的功能控制參數進行分支選擇,結合上一步中記錄的指定開始字符和指定結束字符的位置數,按照用戶需求計算保留指定字符或不保留指定字符的目標字符串。
3.5? 功能實現代碼
利用Excel的VBA宏編輯器,新建一個模塊并輸入以下代碼:
Function tqnr(mb As Range, fh1 As String, fh2 As String, hf As Boolean) As String
//函數定義,函數名tqnr,數據類型字符串型。該函數同時定義4個參數,第一個參數為mb,用于單元格引用控制,數據類型單元格型;第二個參數為字符型變量fh1,用于接收用戶指定的開始字符;第三個參數為字符型變量fh2用于接收用戶指定的結束字符;第四個參數為布爾型功能控制參數,用于接收用戶對功能的選擇要求,如為TRUE,則表示用戶需要去除指定的字符,如為FALSE,則表示用戶不需要去除指定的字符。
Dim c As Integer? ? //定義整型變量c,用于存放需處理字符串的長度數值。
If hf = True Then? ? //通過參數hf控制是否需要保留指定字符的功能選擇。
c = Len(mb.Text)? ?//求需處理字符串的長度數值。
d1 = 1
d2 = 0//定義整形變量d1和d2,用于存放指定開始字符和指定結束字符在字符串中的位置數,同時對d1和d2賦初值做初始化處理。
For i = 1 To c//循環(huán)開始,通過循環(huán)遍歷需處理字符串中的每個字符。
txt = Mid(mb, i, 1)? ? //定義字符型變量txt用于臨時存放需處理字符串中的每個字符。
If txt = fh1 Then d1 = i? ? ? ?//確定指定開始字符在字符串中的位置。
If txt = fh2 Then d2 = i? ? ? ?//確定指定結束字符在字符串中的位置。
Next i
tqnr = Left(mb, d1 - 1) & Right(mb, c - d2)? //輸出函數值,不保留指定字符及字符間內容的字符串。
End If
If hf = False Then
c = Len(mb.Text)
d1 = 1
d2 = 0
For i = 1 To c
txt = Mid(mb, i, 1)
If txt = fh1 Then d1 = i
If txt = fh2 Then d2 = i
Next i
If d1 <> 1 Then
tqnr = Left(mb, d1 - 1) & fh1 & fh2 & Right(mb, c - d2)
Else: tqnr = Left(mb, d1 - 1) & Right(mb, c - d2)? //輸出函數值,保留指定字符,但去除指定字符間內容的字符串。
End If
End If
End Function
4? 自定義函數使用說明
利用Excel的宏編程功能,自定義了函數tqnr,該函數同時帶有四個參數。第一個參數為函數處理目標的指定(單元格型);第二個參數為去除文本開始字符的指定(字符型);第三個參數為去除文本結束字符的指定(字符型);第四個參數為是否保留指定字符的控制(布爾型)。
在如圖3所示的Excel工作表中,通過在B2單元格中輸入自定義的函數tqnr,使用填充句柄進行填充后,可以快速地得到如圖4所示的結果。
5? 結? 論
在分析Excel宏開發(fā)功能的基礎上,對于本文提出的具體問題,即從多種類字符串單元格中,對指定字符及字符間的內容批量去除功能,進行了步驟分解和分析。在此基礎上,提出了功能實現的算法描述,并通過VBA的宏編程功能開發(fā)了功能實現代碼。
在實際工作中,面對幾十個不同的專業(yè)名稱,成千上萬條學生學籍信息記錄,相較以往的逐專業(yè)篩選,逐專業(yè)批量復制的處理方式。該方法不受專業(yè)類型多少,數據記錄條數多少的影響,一次性、批量化地得出用戶所需的數據。極大地提高了工作效率,并且,用戶處理的數據量越大,該方法的效率提升越明顯,在實際工作中具有極高的使用價值。
參考文獻:
[1] 高楠,李紅霞.利用Excel的宏功能實現多數據類型單元格中純數字的提取 [J].計算機產品與流通,2017(9):197.
[2] 李曉玫,楊小平.Excel中的VBA程序設計 [J].四川師范大學學報(自然科學版),2004(4):96-99.
[3] 楊天生.VBA在高效辦公中的應用 [J].機械工程師,2017(9):145-146.
[4] 張怡芳.Excel自定義函數的編制與實例 [J].計算機與現代化,2001(2):130-135.
[5] 孔德宏.在EXCEL中基于VBA的學生基本情況調查表的設計與實現 [J].企業(yè)導報,2011(6):254-255.
[6] 高楠,石蕊,李紅霞.根據身份證號直接計算年齡的EXCEL實現 [J].計算機產品與流通,2017(10):37.
作者簡介:高楠(1982—),女,漢族,河北定州人,講師,畢業(yè)于蘭州交通大學,碩士研究生,主要研究方向:計算機應用、通信工程;徐剛(1980—),男,漢族,河南洛陽人,講師,畢業(yè)于蘭州交通大學,碩士,主要研究方向:計算機應用、網絡通信技術。