2015-05-16 126 views
1

我有一個電子表格,我們將按以下格式將電話號碼輸入D列:(253)796-0340。我想使用VBA公式/函數自動刪除任何括號,破折號或空格,因爲我將它們粘貼到列D中的單元格中。當單元格中粘貼下面的「舊值」時,它會自動替換爲「新價值「;例如: -自動刪除特殊字符

舊值:(253)796-0340

新價值:2537960340

一些此電子表格的用戶都沒有爲Excel精明。所以如果有一種方法不讓他們需要訪問源代碼並運行該功能,那就太好了。

回答

0

你會想要做的總體思路是什麼喜歡 -

Private Sub Worksheet_Change(ByVal Target As Range) 
    Application.EnableEvents = False 
    Target.Value = Replace(Replace(Replace(Replace(Target.Value, "(", ""), ")", ""), "-", ""), " ", "") 
    Application.EnableEvents = True 
End Sub 

這是一個觸發間隔的值在工作表改變的時候,並刪除所有不必要的字符從價值的事件是進入。請注意,這將適用於此代碼應用於工作表內的每個單元格。

+0

這是做的不正確的方式來代替|以及再設置一個唯一的分隔符的,你必須在開始的可能性無盡循環...你可能想看到[This](http://stackoverflow.com/questions/13860894/ms-excel-crashes-when-vba-code-runs/13861640#13861640) –

+0

@SiddharthRout你是對,我忘了禁用事件。固定。 – iliketocode

1

包含在工作表的代碼區以下事件宏:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim intr As Range, t As String 
    Set intr = Intersect(Range("D:D"), Target) 
    If intr Is Nothing Then Exit Sub 

    Application.EnableEvents = False 
    For Each r In intr 
     t = Replace(Replace(r.Text, "-", ""), " ", "") 
     r.Value = "'" & Replace(Replace(t, ")", ""), "(", "") 
    Next r 
    Application.EnableEvents = True 
End Sub 

因爲它是工作表的代碼,它是非常容易安裝和自動使用:

  1. 右鍵單擊該選項卡名稱靠近Excel窗口的底部
  2. 選擇查看代碼 - 這將彈出一個VBE窗口
  3. 粘貼東西並關閉VBE窗口

如果您有任何疑問,請先在試用工作表上嘗試。

如果保存工作簿,宏將與其一起保存。 如果您在2003年以後使用的是Excel版本,則必須將該文件保存爲.xlsm而非 。XLSX

要刪除宏:

  1. 彈出VBE窗口如上
  2. 清晰的代碼進行
  3. 關閉VBE窗口

要了解更多關於宏一般,參見:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

要了解更多有關事件宏(工作表的代碼),請參閱:

http://www.mvps.org/dmcritchie/excel/event.htm

宏必須爲此工作啓用!

+0

++不錯。如果你包含錯誤處理,並且顯示[Here],那就更好了(http://stackoverflow.com/questions/13860894/ms-excel-crashes-when-vba-code-runs/13861640#13861640) –

-1

這聽起來像你試圖重新發明了好大的data validation上出類拔萃本身

支持例如,標識列A,並選擇data選項卡,data validation

然後選擇custom和寫入=INT(A1)=A1

現在用戶將無法插入非數字字符

0

另一種方式。

  1. 您不必循環所有單元格。設想一個用戶複製10000行數據。整列上的.Replace比循環遍歷每個單元快得多。您可以繼續添加到MyList = "(|)| |-"。您想要替換的所有內容都由|分隔。如果在未來,要在deLim = "|"

代碼

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim MyList As String, MyAr 
    Dim deLim As String 
    Dim i As Long 

    '~~> Keep Adding whatever you want to replace 
    MyList = "(|)| |-" 

    deLim = "|" 

    On Error GoTo Whoa 

    Application.EnableEvents = False 

    If Not Intersect(Target, Columns("D:D")) Is Nothing Then 
     MyAr = Split(MyList, deLim) 

     For i = LBound(MyAr) To UBound(MyAr) 
      With Columns("D:D") 
       .NumberFormat = "@" 
       .Replace What:=MyAr(i), Replacement:="", LookAt:=xlPart, _ 
       SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ 
       ReplaceFormat:=False 
      End With 
     Next i 
    End If 

Letscontinue: 
    Application.EnableEvents = True 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume Letscontinue 
End Sub