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

Тема в разделе ".NET", создана пользователем RedRabbit, 12 июл 2010.

  1. RedRabbit

    RedRabbit

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

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

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    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
     
  3. RedRabbit

    RedRabbit

    Регистр.:
    11 июл 2008
    Сообщения:
    606
    Симпатии:
    251
    Эхх, у меня Ваш скрипт очищает полностью столбец и не производит замены.

    Сам сделал вчера ночью, хотя можно наверно и проще.
    Код:
       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
     
  4. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    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 нравится это.
  5. RedRabbit

    RedRabbit

    Регистр.:
    11 июл 2008
    Сообщения:
    606
    Симпатии:
    251
    Мда, странно, хоть и строк меньше, но мой скрипт быстрее выполняется.: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 почти ни разу не сталкивался:)
    И почему
    $A$1 - пишется с $ ???
     
  6. diavolic

    diavolic

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

    а по поводу
    можно использовать объект 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
     
    RedRabbit нравится это.
  7. triniwild

    triniwild Писатель

    Регистр.:
    23 июн 2015
    Сообщения:
    2
    Симпатии:
    0