最近因爲工做關係,深刻的用了一陣excel,並遭遇和處理了一系列關於excel數據的問題。正則表達式
其中最有趣的一個,就是一個沒法vlookup的問題。spa
問題記錄以下:excel
excel中直接打開csv文件,看到相似以下的數據表:code
SN,DATA
A ,Data1
12345789012 ,Data2
C ,Data3blog
在另一個數據表中,須要對SN號作關聯操做。因而使用經常使用的vlookup進行關聯,可是發現所有數據都只獲得N/A:文檔
SN 取值 A #N/A 12345789012 #N/A C #N/A
在兩個表裏使用查詢功能查詢相應的sn,均可以查到。class
因而使用sublime查看csv文件自己,發現這個csv中的sn號,後面統一附加了一個tab字符(爲清晰展示,使用16進制顯示):sed
00000000: 534e 2c44 4154 410d 0a41 092c 4461 7461 SN,DATA..A.,Data 00000010: 310d 0a31 3233 3435 3738 3930 3132 092c 1..12345789012., 00000020: 4461 7461 340d 0a43 092c 4461 7461 330d Data4..C.,Data3. 00000030: 0a
csv文件來自於一個軟件系統,諮詢研發,獲得的答覆是,sn裏有一些號是純數字,若是不加tab,會被excel顯示爲科學計數法,引起更多問題。軟件
使用正則表達式移除掉所有tab以後,用excel直接打開,發現確實部分sn被顯示爲科學計數法,且沒法恢復原始值。csv
經研究,發現excel對於此種狀況,其實有處理方法,就是使用csv數據導入功能而不要直接打開csv,經實驗,使用文本數據導入功能,並設定sn字段爲文本,便可解決科學計數法問題,而且能夠正確的vlookup。
因爲太忙,研發團隊拒絕對系統進行任何修改。同時,各類表格的數據來源很是複雜,你們基本都已經在基於這些excel數據在工做了。
所以,寫了一段vba代碼針對沒法vlookup的excel文檔的sn作了處理,解決了這些文檔沒法vlookup的問題:
1 Public Sub 去掉SN號兩端的空格和TAB() 2 ' TODO:首先把字段設置成文本格式 3 Dim Rng1 As Range 4 For Each Rng1 In Range("A2:A9999") 5 ' 處理科學計數法問題 6 On Error Resume Next 7 If CStr(Val(Rng1.Value)) = Rng1.Value Then 8 Rng1.Value = "'" & Rng1.Value 9 End If 10 Rng1.Value = Trim(Rng1.Value) 11 Rng1.Value = Replace(Rng1.Value, vbTab, "") 12 DoEvents 13 Next 14 End Sub
使用的時候,須要修改range的範圍,和sn的實際範圍對應。
沒有使用UsedRange.Rows.count之類的方法,是由於期間發現了不少人的不少表格,數據可能並很少,但rows.count都是一個巨大的數字。(通常這些數據也都是來自於某軟件系統導出的數據,看來很是不靠譜),解決這個問題是另一個話題了,暫且不表。
有一個花絮是,曾經在一個同事的表格,發現了部分匹配成XX的值,實際是由於sn匹配失敗,致使獲得了其餘結果。我深深的懷疑,在此前的工做中,有多少數據是恰好通過了這個坑被計算出來的,這又引起了哪些連鎖的數據錯誤,而這些數據若是恰好被用於計算公司的成本收入或者其餘重要的用途,致使的判斷錯誤最終會引起多大的後果。