2016-12-07 24 views
1

我在Excel中有一個工作表,用戶必須在列C中輸入一些註冊號碼。這些數字通常由用戶通過一次複製粘貼其中的幾個來插入。複製源的格式通常是格式「000.000.000-00」,但我希望它只是在工作表中「00000000000」,沒有點和短劃線。Excel VBA - 如何更改用戶輸入的多個單元格的值?

我想在Excel VBA中開發一個代碼,在用戶鍵入或粘貼註冊號後自動刪除這些點和破折號。我需要它在同一個單元格中。的代碼是:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim SkipEvents As Boolean 
    If SkipEvents Then Exit Sub 
    With ActiveWorkbook.Sheets("Staff") 
    If Not Application.Intersect(Target, Me.Range("C:C")) Is Nothing Then 
     SkipEvents = True 
     li = Intersect(Target, Range("C:C")).Row 
     nl = Intersect(Target, Range("C:C")).Rows.Count 
     lf = li + nl - 1 

     For i = li To lf 
      RegNumb = Range("C" & i).Value 
      If Len(RegNumb) = 14 Then 
       Range("C" & i).Value = Left(RegNumb, 3) & Mid(RegNumb, 5, 3) & Mid(RegNumb, 9, 3) & Right(RegNumb, 2) 
      End If 
     Next i 
     SkipEvents = False 
    End If 
    End With 
End Sub 

到目前爲止,代碼能夠去除的點劃線如果用戶鍵入或拷貝+一次粘貼一個登記號。但是,當用戶每次複製+粘貼2個或多個註冊號碼時,只有該範圍內的第一個單元格將其點和短劃線移除,而其他單元格保持原樣。有人可以幫我解決這個問題嗎?

+2

它看起來好像你在迭代字符串。你可能會發現'替換(替換(字符串,「。」,「」),「 - 」,「」)' – Wilson

回答

2

只有該範圍中的第一個單元格正在被您的代碼更改,因爲您沒有遍歷該範圍。你可以這樣做:

For each c in Target 
    if c.column = 3 then 
     c.value = Replace(Replace(c.value, ".", ""), "-", "") 
    end if 
Next c 

在你的Worksheet_Change中。

+0

@Cojonni所以你可能已經完成了'Application.EnableEvents = False'。 – Wilson

0

您可以直接在整個期望的範圍內進行替換。您還需要禁用觸發事件,因爲您所做的更改將再次觸發代碼。而且,由於它是表級代碼,因此不需要參考表單。

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim rCheck as Range 
    Set rCheck = Application.Intersect(Target, Me.Range("C:C")) 

    If Not rCheck is Nothing 

     Application.EnableEvents = False 
     rCheck.Replace(".","",lookat:=xlPart) 
     rCheck.Replace("-","",lookat:=xlPart) 
     Application.EnableEvents = True 

    End If 


End Sub 

我也會發出警告,如果被檢查的數據集非常大,這種替換方法可能會有很差的性能。但是,如果複製/粘貼在細胞計數方面相對較小,則應該沒問題。

相關問題