問個關於把現有語法轉換成VBA的方式

各位好:
還記得去年來這裡問問題的時候有好幾位資深的高手大大們無私的協助,先讓我在這感謝一下各位,真的誠心感謝,要不是有各位幫忙,我的工作絕對無法像現在這麼順利。

首先我想要先分享一下目前會用到的所有功能,已經做成VBA的EXCEL檔案
https://tinyurl.com/2d8huutf

目前用到的功能有:
1.全選+繁化
2.繁化後用Ctrl+o(或p)及l,將所有多餘的欄、列全部刪除
3.用Ctrl+i 將不該出現的空格(取消合併儲存格之後留下來的欄位空白)全部向下填滿
4.用Ctrl+r 整理整個表格的格式:其中包含了刪除所有透明物件、標題列重整、取消填滿、取消框線、過度繁化如鬥、範、裡等字復原斗、范、里。另外還有調整欄位寬度,打開篩選,刪除換行、刪除多餘頁籤,取代部分符號空格等等。
5.用Ctrl+X、C、V,根據不同的欄位及條件來快速排序,找出問題資料
6.Ctrl+q,排除標題欄位全部複製
7.Ctrl+e,排除特定欄位指定貼上
8.Ctrl+b、n、m,指定欄位貼上指定日期

這大概是我每天會固定用到的功能,當然還有這些功能之外衍生的其他功能,在分享的xlsm裡面有,如果有興趣或者幫得上需要的人的話可以帶回去修改看看。

--------正題--------

問個關於把現有語法轉換成VBA的方式
如圖所示,最近處理到一些地址非常亂的資料,有些資料有郵遞區號,有些則沒有,而我的需求是刪除所有郵遞區號,因此有人教我使用語法:
「=MID(目標格E2,SUM(--ISNUMBER(--MID(目標格E2,{1,2,3,4,5,6},1)))+1,LEN(E2))」

轉完之後也如圖示非常實用,可以將目標欄位內開頭的數字清除,而不影響其中地址。
這邊有幾個問題想問,不知道可否打擾有空的大大們協助指導,感激不盡!
1.關於語法MID我明白,SUM我也明白,ISNUMBER看了範例其實只懂了一半,LEN也是只懂一半,當他們全部用在一起的時候就真的不太明白了。

我想知道他只所以用SUM在這其中的目的,ISNUMBER扮演的角色是什麼,MID所取的(1,2,3,4,5,6,)1,用意是什麼,最後的LEN的判斷是用來判斷什麼……我理解到一半就有點跟不上了,如果有大大願意撥空解答的話小弟萬分感激,或者給我一些關鍵字讓我能找到更詳盡解說的理解的話也是感激不盡

2.這個語法我不知道要怎麼帶入VBA裡面使用,我原本的想法是如果可以暫時取用一個欄位(比如O或P欄),貼上語法再複製選擇性貼上文字回原本來為,再刪除暫時欄位,我的想法是這樣的,但不知道是否有大大有更好的主意,不會佔用到欄位的話就更完美了。

3.如圖示內的狀況,如果一份資料內有許多那種缺縣、缺市、缺路名,導致一份地址資料亂七八糟的狀況,篩選排序的結果只會依照筆畫來排序,請問是否有方法可以快速揪出地址資料缺乏的篩選法呢?
問個關於把現有語法轉換成VBA的方式


因為關鍵字方面有點混亂,我不太確定有沒有更準確的關鍵字可以找到我想要的資訊,如果有大大可以不吝指教提供關鍵字讓我去搜尋學習的話小弟銘感五內~~

感謝各位大大~
文章關鍵字
稻草人到處草人 wrote:
3.如圖示內的狀況,如果一份資料內有許多那種缺縣、缺市、缺路名,導致一份地址資料亂七八糟的狀況,篩選排序的結果只會依照筆畫來排序,請問是否有方法可以快速揪出地址資料缺乏的篩選法呢?

這最好是輸入的時候強制他
1.縣市
2.鄉鎮市區
3.路(街)名或鄉里名稱
這3階只能從下拉選,後面才能自己打
不然事後整理很麻煩的

不知你要做到多複雜,要精準可以搜尋"地址正規化"

只要粗略判斷的話附一份極簡判斷給你參考

[點擊下載]
稻草人到處草人 wrote:
各位好:還記得去年來(恕刪)


規則運算式

VBA Form 加入下列參考
Microsoft VBScript Regular Expressions 5.5

範例
Function TestRegExp(myPattern As String, myString As String)
'Create objects.
Dim objRegExp As RegExp
Dim objMatch As Match
Dim colMatches As MatchCollection
Dim RetStr As String

' Create a regular expression object.
Set objRegExp = New RegExp
'Set the pattern by using the Pattern property.
objRegExp.Pattern = myPattern
' Set Case Insensitivity.
objRegExp.IgnoreCase = True
'Set global applicability.
objRegExp.Global = True
'Test whether the String can be compared.
If (objRegExp.Test(myString) = True) Then
'Get the matches.
Set colMatches = objRegExp.Execute(myString) ' Execute search.
For Each objMatch In colMatches ' Iterate Matches collection.
RetStr = RetStr & "Match found at position "
RetStr = RetStr & objMatch.FirstIndex & ". Match Value is '"
RetStr = RetStr & objMatch.Value & "'." & vbCrLf
Next
Else
RetStr = "String Matching Failed"
End If
TestRegExp = RetStr
End Function

已有很多文字編輯器提供 規則運算式 的功能 不一定要用 VBA 若要自己寫,上面是網路抓來的範例,我有寫過可以用,若要使用文字編輯器的功能,把資料複製到文字編輯器,利用規則運算式 找到資料,可刪除取代,處理完文字在複製回來

規則運算式 有很多參數,排列組合可以抓 網址 E-mail 地址 各種格式的文字,排列組合參數要自己試
感謝N大S大的回覆範例,我會研究看看的,感謝~
稻草人到處草人 wrote:
我想知道他只所以用SUM在這其中的目的,ISNUMBER扮演的角色是什麼,MID所取的(1,2,3,4,5,6,)1,用意是什麼,最後的LEN的判斷是用來判斷什麼……

稻大:建議您可以使用[評估值公式],當作公式解析的幫手~~有時候可以給你一些靈感(啟發)~~

上圖的例子:
C2的地方輸入: =MID(E2,SUM(--ISNUMBER(--MID(E2,{1,2,3,4,5,6},1)))+1,LEN(E2)) ,會得到「台北市永和區」
怎麼得到的呢?

想想公式的思考,應該是:
C2要傳回的應該是,將E2原本的字元,去除掉前面的數字(可能為0~6個數字?),然後把剩下的文字傳回來。

先看最外面的公式:MID(A,B,C) 3個參數,代表:抓取A字串,從A字串的第B個位置開始,取出C個字元。
=MID(E2,SUM(--ISNUMBER(--MID(E2,{1,2,3,4,5,6},1)))+1,LEN(E2))

第一個參數,寫E2,代表要處理E2,沒問題吧。

第二個參數,寫「從E2的非數字開始位置」,就是mid要開始抓取的字元(比如E2是「12345台北市永和區」,那字串擷取開始位置就是要從6,這個參數應該就要填6)....問題是,怎判斷E2字串,非數字位置是第6個開始呢?所以這個參數,就要輸入:SUM(--ISNUMBER(--MID(E2,{1,2,3,4,5,6},1)))+1 ......這樣可以取得 6,OK。
(至於這個SUM(--ISNUMBER(--MID(E2,{1,2,3,4,5,6},1)))+1的解析,稍等再來)

第三個參數,應該就是E2要擷取字串的長度,按照上例,E2是「12345台北市永和區」,那要擷取的長度就應該是總長度11-數字長度5=6,所以這格參數就要填入6。不過,mid函數的最後一個參數特性是,如果輸入的LEN大於剩下可以取的長度,就直接回傳剩下的總長度文字,所以,在還不知道E2開頭數字有幾個下,就直接使用LEN(E2)也可以(因為要抓取的文字長度,不會大於原本本身),這樣,結果就是:

=MID(E2,6,11)

你試試,在E2輸入:12345台北市永和區.............,然後在C2(其實任一格均可)輸入=MID(E2,6,11) ,你就會得到(C2) 「台北市永和區」的結果。


接著再來談,那第2個參數的6,怎麼得來的:「從E2的非數字開始位置」
SUM(--ISNUMBER(--MID(E2,{1,2,3,4,5,6},1)))+1

簡單說,就是判斷E2前面到底有幾個是數字,然後再加個1,就是非數字的開始位置,所以上面最後的+1就是這樣來的。
接著,先看一下中間的MID 函數......MID(E2,{1,2,3,4,5,6},1) 。原本MID就是3個參數,你可以把這個{}想像成代表中間參數要依序做6次mid,依序是:
MID(E2,1,1) '抓E2第1個字元
MID(E2,2,1) '抓E2第2個字元
MID(E2,3,1) '抓E2第3個字元
MID(E2,4,1) '抓E2第4個字元
MID(E2,5,1) '抓E2第5個字元
MID(E2,6,1) '抓E2第6個字元
要這樣,是因為你已經預設了:E2前6碼可能都是數字(區碼),所以要一一抓出來判斷。
不過MID是字串擷取公式,擷取出來的一律都是「非數值」的文字,那還判斷啥?所以,前面加個「--」,做數值轉換。(有關Excel中--的用法,您可以再google看看)
轉換好了,那就可以用ISNUMBER這個函數來判斷囉~~所以用ISNUMBER()包起來檢查,是數字就會傳回true,不是就傳回false
~~~~~結果就是:
MID(E2,1,1) '抓E2第1個字元,true
MID(E2,2,1) '抓E2第2個字元,true
MID(E2,3,1) '抓E2第3個字元,true
MID(E2,4,1) '抓E2第4個字元,true
MID(E2,5,1) '抓E2第5個字元,true
MID(E2,6,1) '抓E2第6個字元,false
由上面看,可以知道,E2開頭的6個字元,有5次ture,所以有5個數字~~但是怎麼得到5個true的合計呢?所以就借助一下SUM囉~~
但是,sum只是算數字和,所以,就先再用一次--,把true傳成數字。(true和false變成1,0)
整個公式就變成:SUM(--ISNUMBER(--MID(E2,{1,2,3,4,5,6},1)))

這樣,整個完整的公式:
=MID(E2,SUM(--ISNUMBER(--MID(E2,{1,2,3,4,5,6},1)))+1,LEN(E2))
就會得到:
=MID(12345台北市永和區,6,11)
結果:台北市永和區

以上說明可能不是很詳盡,希望您能看懂.....呵。
Der,misser1
misser wrote:
稻大:建議您可以使用(恕刪)

原來是這樣!
太感謝m大了!
講解得已經非常詳盡了
瞭解了很多,非常感謝
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!