2016-12-07 28 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 

我也会发出警告,如果被检查的数据集非常大,这种替换方法可能会有很差的性能。但是,如果复制/粘贴在细胞计数方面相对较小,则应该没问题。

相关问题