[VBA] Замена текста из списка в Excel

RedRabbit

Мой дом здесь!
Регистрация
11 Июл 2008
Сообщения
607
Реакции
256
Есть столбец А. В нем есть значения вида:
Код:
Sample, text&!?????
Нужно когда вводишь в этот столбец данные он автоматом или по кнопке удалял ненужные символы.
Код:
!"№;%:?*()_=+{}[]:;""'<>,./\|~*`
Удалял

Код:
Пробел
заменял на
Код:
-
.
А сам текст переводил в нижний регистр.
На выходе получаем
Код:
sample-text
 

diavolic

Постоялец
Регистрация
17 Мар 2010
Сообщения
519
Реакции
102
Код:
Columns("A:A").Select

st = "!№;:?()_=+{}[]:;""'<>,./\|~*`"

For i = 1 To Len(st)
    c = Mid(st, i, 1)
    Selection.Replace What:=c, Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
Next i
     Selection.Replace What:=" ", Replacement:="-", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
 

RedRabbit

Мой дом здесь!
Регистрация
11 Июл 2008
Сообщения
607
Реакции
256
Эхх, у меня Ваш скрипт очищает полностью столбец и не производит замены.

Сам сделал вчера ночью, хотя можно наверно и проще.
Код:
   For Each x In Range("A1:A1508,B1:B1508")
      x.Value = LCase(x.Value)
      x.Value = Replace(x.Value, "-", "")
      x.Value = Replace(x.Value, " ", "-")
      x.Value = Replace(x.Value, "~", "")
      x.Value = Replace(x.Value, "!", "")
      x.Value = Replace(x.Value, "@", "")
      x.Value = Replace(x.Value, "#", "")
      x.Value = Replace(x.Value, "$", "")
      x.Value = Replace(x.Value, "%", "")
      x.Value = Replace(x.Value, "^", "")
      x.Value = Replace(x.Value, "&", "")
      x.Value = Replace(x.Value, "*", "")
      x.Value = Replace(x.Value, "(", "")
      x.Value = Replace(x.Value, ")", "")
      x.Value = Replace(x.Value, "_", "")
      x.Value = Replace(x.Value, "=", "")
      x.Value = Replace(x.Value, "+", "")
      x.Value = Replace(x.Value, "`", "")
      x.Value = Replace(x.Value, "+", "")
      x.Value = Replace(x.Value, ":", "")
      x.Value = Replace(x.Value, ";", "")
      x.Value = Replace(x.Value, "'", "")
      x.Value = Replace(x.Value, "?", "")
      x.Value = Replace(x.Value, "{", "")
      x.Value = Replace(x.Value, "}", "")
      x.Value = Replace(x.Value, "[", "")
      x.Value = Replace(x.Value, "]", "")
      x.Value = Replace(x.Value, "«", "")
      x.Value = Replace(x.Value, "»", "")
      x.Value = Replace(x.Value, "\", "")
      x.Value = Replace(x.Value, "|", "")
      x.Value = Replace(x.Value, "<", "")
      x.Value = Replace(x.Value, ">", "")
      x.Value = Replace(x.Value, ".", "")
      x.Value = Replace(x.Value, ",", "")
      x.Value = Replace(x.Value, "¹", "")
      x.Value = Replace(x.Value, """", "")
      x.Value = Replace(x.Value, "’", "")
    
    Next
 

diavolic

Постоялец
Регистрация
17 Мар 2010
Сообщения
519
Реакции
102
Код:
st = "!№;:?()_=+{}[]:;""'<>,./\|~*`"
For Each x In Range("A1:A1508,B1:B1508")
x.Value = LCase(x.Value)
For i = 1 To Len(st)
    c = Mid(st, i, 1)
    x.Value = Replace(x.Value, c, "")
Next i
x.Value = Replace(x.Value, " ", "-")
Next
 

RedRabbit

Мой дом здесь!
Регистрация
11 Июл 2008
Сообщения
607
Реакции
256
Мда, странно, хоть и строк меньше, но мой скрипт быстрее выполняется.:bn: Точнее у вас он из цикла не выходит. И все время выполняется. Остановил его, все заменилось.
Спасибо за помощь;)
Осталось на этом примере написать такое.
Если ячейка А2 не пустая, тогда значение A2 копируется в ячейку B1 и происходит эта замена символов описанных выше.
Пример.
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
   
     If Target.Address = "$A$1" Then
     If IsEmpty(Target) Then Exit Sub
        IF Range("A1") = 1 THEN 
	CALL "Название запускаемого макроса" 'или сам код
     End If     
       
End Sub

А правильно ли будет так? Просто в VBA почти ни разу не сталкивался:)
И почему
If Target.Address = "$A$1" Then
$A$1 - пишется с $ ???
 

diavolic

Постоялец
Регистрация
17 Мар 2010
Сообщения
519
Реакции
102
$A$1 если мне не изменяет память это абсолютный адрес ячейки. в экселе еще можно сделать относительные адреса, которые будут вычисляться относительно какой то начальной ячейки.

а по поводу
Если ячейка А2 не пустая, тогда значение A2 копируется в ячейку B1 и происходит эта замена символов описанных выше.

можно использовать объект Cells. так быстрее и проще.

Код:
if Cells(2, 1) = "" then ' Row=2, Column=A (i.e. 1)
 Cells (1,2) = Cells(2, 1) 
end if

Кстати если нужно задавать Range динамически то это можно элегантно делать через Cells. например:

Код:
Range (Cells (1,1), Cells (10, 7)) ' Соответствует области листа A1:G10
 
Сверху