Excel VBA – 如何改变用户input的多个单元格的值?

我在Excel上有一个工作表,用户必须在列C中input一些注册号码。这些数字通常是由用户通过复制粘贴他们几个一次插入。 复制源的格式通常是格式“000.000.000-00”,但我希望它只是在工作表中的“00000000000”,没有点和破折号。

我正在尝试在Excel VBA中开发一个代码,以在用户input或粘贴注册号后自动删除这些点和短划线。 我需要它在同一个单元格中。 代码是:

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 

到目前为止,如果用户一次input或复制一个注册码,代码就可以删除点和破折号。 但是,当用户每次复制+粘贴2个或多个注册号码时,只有该范围内的第一个单元格将其点和短划线去除,而其他单元格保持原样。 有人可以帮我解决这个问题吗?

只有范围中的第一个单元格正在被您的代码更改,因为您没有遍历该范围。 你可以做这个:

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

在你的Worksheet_Change里面。

您可以直接在整个所需的范围内进行更换。 您还需要禁用触发事件,因为您所做的更改将再次触发代码。 而且,由于它是表级代码,所以不需要参考表单。

 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 

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