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

внутри вашего рабочего листа_Изменить.

+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 

Я также предупреждаю, что если проверенный набор данных очень велик, этот метод замены может иметь низкую производительность. Однако, если копирование/вставка относительно небольшая с точки зрения количества клеток, это должно быть хорошо.

Смежные вопросы