2017-09-05 51 views
0

我需要的是自定義格式,以根據這些規則更改值:Excel自定義格式,檢查字符

  1. 如果「/」不存在和數量的長度小於6,添加零至 的begining。
  2. 如果「/」存在且「/」之前的數字長度小於6,則將 零增加到開頭。
  3. 如果「/」存在,並且「/」之後的數字長度爲1,則在最後一個字符前加上 。
  4. 如果「/」存在,並且「/」之後的數字長度爲2,則保留爲 。
  5. 串的總長度 「/」 將是8,沒有它 - 6

未格式化的數據:

-534 
1083 
386840/2 
12345/10 

期望的結果:

000534 
001083 
38684002 

我到目前爲止:
000000; 000000; 0是非常明顯的部分,沒有「/」的值將被讀作數字。如果它是一個數字,我會使用[>1000]0或類似的東西,但據我所知,它不適用於Text
公式我使用(只是現在),而不是理想的自定義格式:

=IF(ISERROR(FIND("/";A1)); 
    CONCATENATE(REPT("0";6-LEN(A1));A1); 
    IF((LEN(A1)-FIND("/";A1))=1; 
     SUBSTITUTE(CONCATENATE(REPT("0";7-FIND("/";A1));A1);"/";"0"); 
     SUBSTITUTE(CONCATENATE(REPT("0";7-FIND("/";A1));A1);"/";""))) 

誰能給我一個提示?

+0

你不能要求的數字格式來檢查你的電話號碼。因此,在將其提交給NumberFormat之前,必須將40/2轉換爲4002和5/10轉換爲510。你應該可以用幫助欄(你可能會保持隱藏)做到這一點,但如果這是不可能的,你的唯一辦法就是VBA。 – Variatus

+0

@Variatus不能這樣做,這是數字格式的原因,否則我會使用公式。 – AntiDrondert

+0

你必須告訴更多。您是否允許更改列中的數據?只要忘記用NumberFormat來做就可以了。必須找到其他解決方案 – Variatus

回答

1

下面是使用NumberFormat完成所需工作的一種方法。適當的數字格式由VBA事件代碼生成。

存在一個很大的缺點,就是每個包含"/"的唯一條目都需要不同的數字格式,並且允許的數字格式數量可能會受到限制。

但是,它不需要幫助列,也不會更改存儲在單元中的原始數據。

列A中輸入的任何內容都將根據規則進行格式化。 如果存在斜線,代碼將更改數字部分;但不測試看到兩者都是數字。所以abc/1 - >abc01,但你可以改變,如果你喜歡。

這是工作表代碼:

Option Explicit 
Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim FormatRange As Range, C As Range 
    Const Fmt As String = "000000;000000;000000;@" 
    Dim V As Variant 

Set FormatRange = Range("A:A") 
If Not Intersect(Target, FormatRange) Is Nothing Then 
    For Each C In Intersect(Target, FormatRange) 
     If InStr(C.Text, "/") = 0 Then 
      C.NumberFormat = Fmt 
     Else 
      V = Split(C.Text, "/") 
      V(0) = Format(V(0), "000000") 
      V(1) = Format(V(1), "00") 
      C.NumberFormat = ";;;" & Chr(34) & Join(V, "") & Chr(34) 
     End If 
    Next C 
End If 

End Sub 
+0

雖然它看起來像我需要的東西,但它不能沒有宏就可以完成。忘了我可以將兩個部分分開,然後加入他們,非常感謝,明天我會仔細研究一下。 – AntiDrondert

+0

無需檢查字符串的部分是否爲數字,每次都是100%數字,忘記提及。 – AntiDrondert

+0

@AntiDrondert這使得代碼更簡單。這種方法的主要缺陷是工作簿僅限於擁有64,000個獨特的單元格格式/單元格樣式。用「格式」替換值會更加健壯,但會阻止保留沒有幫助列的原始數據。 –