Excel selection replace what

Замена подстроки, содержащейся в текстовых значениях ячеек указанного диапазона, другой подстрокой с помощью метода Range.Replace из кода VBA Excel.

Range.Replace – это метод, который находит по шаблону подстроку в содержимом ячеек указанного диапазона, заменяет ее на другую подстроку и возвращает значение типа Boolean.

Метод имеет некоторые особенности, которые заключаются в следующем:

  • при присвоении булева значения, возвращаемого методом Range.Replace, переменной, необходимо список параметров (аргументов) метода заключать в круглые скобки;
  • если метод используется без присвоения возвращаемого значения переменной, параметры должны быть указаны без заключения их в круглые скобки.

Синтаксис и параметры метода

Синтаксис

Синтаксис при замене подстроки и присвоении переменной возвращаемого значения типа Boolean:

variable = expression.Replace(What, Replacement, [LookAt], [SearchOrder], [MatchCase], [MatchByte], [SearchFormat], [ReplaceFormat])

Синтаксис при замене подстроки без присвоения переменной возвращаемого значения:

expression.Replace What, Replacement, [LookAt], [SearchOrder], [MatchCase], [MatchByte], [SearchFormat], [ReplaceFormat]

  • variable – переменная (тип данных — Boolean);
  • expression – выражение, возвращающее объект Range.

Параметры

Параметр Описание
What Искомая подстрока или шаблон*, по которому ищется подстрока в диапазоне ячеек. Обязательный параметр.
Replacement Подстрока, заменяющая искомую подстроку. Обязательный параметр.
LookAt Указывает правило поиска по полному или частичному вхождению искомой подстроки в текст ячейки:
1 (xlWhole) – поиск полного вхождения искомого текста;
2 (xlPart) – поиск частичного вхождения искомого текста.
Необязательный параметр.
SearchOrder Задает построчный или постолбцовый поиск:
1 (xlByRows) – построчный поиск;
2 (xlByColumns) – постолбцовый поиск.
Необязательный параметр.
MatchCase Поиск с учетом или без учета регистра:
0 (False) – поиск без учета регистра;
1 (True) – поиск с учетом регистра.
Необязательный параметр.
MatchByte Способы сравнения двухбайтовых символов:
0 (False) – двухбайтовые символы сопоставляются с однобайтовыми эквивалентами;
1 (True) – двухбайтовые символы сопоставляются только с двухбайтовым символами.
Необязательный параметр.
SearchFormat Формат поиска. Необязательный параметр.
ReplaceFormat Формат замены. Необязательный параметр.

* Смотрите знаки подстановки для шаблонов, которые можно использовать в параметре What.

Работа метода в VBA Excel

Исходная таблица для всех примеров:

Пример 1

Примеры записи строк кода с методом Range.Replace и поиском по частичному совпадению подстроки с содержимым ячейки:

Sub Primer1()

‘Запись 1:

Range(«A1:C6»).Replace «Лиса», «Рысь», 2

‘Запись 2:

Range(«A1:C6»).Replace What:=«Лиса», Replacement:=«Рысь», LookAt:=2

‘Запись 3:

If Range(«A1:C6»).Replace(«Лиса», «Рысь», 2) Then

End If

‘Запись 4:

Dim a

a = Range(«A1:C6»).Replace(«Лиса», «Рысь», 2)

End Sub

Результат выполнения любого из вариантов кода примера 1:

Пример 2

Поиск по шаблону с использованием знаков подстановки и по полному совпадению подстроки с содержимым ячейки:

Sub Primer2()

Range(«A1:C6»).Replace «Ли??», «Рысь», 1

End Sub

Обратите внимание, что слово «Лиса» заменено словом «Рысь» не во всех ячейках. Это произошло из-за того, что мы использовали параметр LookAt:=1 – поиск полного вхождения искомого текста в содержимое ячейки.

Содержание

  1. Поиск и замена текста или форматирования
  2. Поиск и выделение текста
  3. Поиск текста без изменения выделенного фрагмента
  4. Использование объекта Replacement
  5. Поддержка и обратная связь
  6. VBA Excel. Метод Range.Replace (замена текста в ячейках)
  7. Определение метода Range.Replace
  8. Синтаксис и параметры метода
  9. Синтаксис
  10. Параметры
  11. Массовая замена слов

Поиск и замена текста или форматирования

Поиск и замена предоставляется объектами Find и Replacement . Объект Find доступен из объектов Selection и Range . Действие поиска немного отличается в зависимости от того, из объекта Selection или Range вы обращаетесь к объекту Find.

Поиск и выделение текста

Если доступ к объекту Find осуществляется из объекта Selection , выделение изменяется при обнаружении условий поиска. В следующем примере выбирается следующее вхождение слова «Hello». Если конец документа достигается до того, как будет найдено слово «Hello», поиск останавливается.

Объект Find содержит свойства, связанные с параметрами в диалоговом окне Поиск и замена . Можно задать отдельные свойства объекта Find или использовать аргументы с методом Execute , как показано в следующем примере.

Поиск текста без изменения выделенного фрагмента

Если доступ к объекту Find осуществляется из объекта Range , выделение не изменяется, но диапазон переопределен при обнаружении условий поиска. В следующем примере показано, как найти первое вхождение слова «blue» в активном документе. Если операция поиска выполнена успешно, диапазон переопределен, а к слову «blue» применяется полужирное форматирование.

В следующем примере выполняется тот же результат, что и в предыдущем примере, используя аргументы метода Execute .

Использование объекта Replacement

Объект Replace представляет критерии замены для операции поиска и замены. Свойства и методы объекта Replace соответствуют параметрам в диалоговом окне Найти и заменить (меню Правка ).

Объект Replacement доступен в объекте Find . В следующем примере все вхождения слова «hi» заменяются на «hello». Выделение изменяется при обнаружении условий поиска, так как доступ к объекту Find осуществляется из объекта Selection .

В следующем примере в активном документе удаляется полужирное форматирование. Свойство Bold имеет значение True для объекта Find и False для объекта Replacement . Чтобы найти и заменить форматирование, задайте для текста для поиска и замены пустые строки («»), а для аргумента Format метода Execute задайте значение True. Выбор остается неизменным, так как доступ к объекту Find осуществляется из объекта Range (свойство Content возвращает объект Range ).

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

VBA Excel. Метод Range.Replace (замена текста в ячейках)

Замена подстроки, содержащейся в текстовых значениях ячеек указанного диапазона, другой подстрокой с помощью метода Range.Replace из кода VBA Excel.

Определение метода Range.Replace

Метод имеет некоторые особенности, которые заключаются в следующем:

  • при присвоении булева значения, возвращаемого методом Range.Replace, переменной, необходимо список параметров (аргументов) метода заключать в круглые скобки;
  • если метод используется без присвоения возвращаемого значения переменной, параметры должны быть указаны без заключения их в круглые скобки.

Синтаксис и параметры метода

Синтаксис

Синтаксис при замене подстроки и присвоении переменной возвращаемого значения типа Boolean:

variable = expression.Replace(What, Replacement, [LookAt], [SearchOrder], [MatchCase], [MatchByte], [SearchFormat], [ReplaceFormat])

Синтаксис при замене подстроки без присвоения переменной возвращаемого значения:

expression.Replace What, Replacement, [LookAt], [SearchOrder], [MatchCase], [MatchByte], [SearchFormat], [ReplaceFormat]

  • variable – переменная (тип данных — Boolean);
  • expression – выражение, возвращающее объект Range.

Параметры

Параметр Описание
What Искомая подстрока или шаблон*, по которому ищется подстрока в диапазоне ячеек. Обязательный параметр.
Replacement Подстрока, заменяющая искомую подстроку. Обязательный параметр.
LookAt Указывает правило поиска по полному или частичному вхождению искомой подстроки в текст ячейки:
1 (xlWhole) – поиск полного вхождения искомого текста;
2 (xlPart) – поиск частичного вхождения искомого текста.
Необязательный параметр.
SearchOrder Задает построчный или постолбцовый поиск:
1 (xlByRows) – построчный поиск;
2 (xlByColumns) – постолбцовый поиск.
Необязательный параметр.
MatchCase Поиск с учетом или без учета регистра:
0 (False) – поиск без учета регистра;
1 (True) – поиск с учетом регистра.
Необязательный параметр.
MatchByte Способы сравнения двухбайтовых символов:
0 (False) – двухбайтовые символы сопоставляются с однобайтовыми эквивалентами;
1 (True) – двухбайтовые символы сопоставляются только с двухбайтовым символами.
Необязательный параметр.
SearchFormat Формат поиска. Необязательный параметр.
ReplaceFormat Формат замены. Необязательный параметр.

* Смотрите знаки подстановки для шаблонов, которые можно использовать в параметре What.

Источник

Массовая замена слов

Предположим, что нам необходимо заменить все «ул.» на листе на «улица «. Или русское слово «дом» на английское «house». Или еще интереснее: все английские буквы на русские. Например, английская «а» должна быть заменена на русскую «a», английская «c» на русскую «с», английская «H» на русскую «Н» и т.д. А такое тоже нередко бывает и доставляет проблемы. Ведь если в одной таблице будут русские буквы, а в другой английские — то применение большинства встроенных функций поиска(та же ВПР) просто не найдут соответствия.
Если подобную замену надо сделать для одного сочетания, то все просто: жмем Ctrl+H и указываем что заменить и на что. Но если таких замен надо сделать 20? Или 120? Это надо будет 120 раз нажать и ввести что заменять и на что. А если это надо сделать еще и не в одном документе — то. Думаю сами справитесь с умножением количества замен на количество файлов, в которых это надо сделать. И вроде бы простая операция превращается в ваш личный ад на работе.
Недавно на форуме участнику потребовалось автоматизировать именно такую штуку. Т.к. код несложный — решил написать и чуть дополнив выложить для всех кому код может потребоваться:

Option Explicit Sub Replace_Mass() Dim s As String Dim lCol As Long Dim avArr, lr As Long Dim lLastR As Long Dim lToFindCol As Long, lToReplaceCol As Long, lLookAt As Long ‘запрашиваем направление перевода — с русского на англ. или наоборот lCol = Val(InputBox(«Укажите направление перевода:» & vbNewLine & _ » 1 — ru-en» & vbNewLine & _ » 2 — en-ru», «Запрос», 1)) If lCol = 0 Then Exit Sub ‘запрашиваем по части ячейки искать или по всему тексту ‘по умолчанию — по части lLookAt = Val(InputBox(«Искать соответствие по части ячейки или по всему тексту:» & vbNewLine & _ » 1 — по всему тексту» & vbNewLine & _ » 2 — по части ячейки», «Запрос», 2)) If lLookAt = 0 Then Exit Sub Select Case lCol Case 1 lToFindCol = 1 lToReplaceCol = 2 Case 2 lToFindCol = 2 lToReplaceCol = 1 End Select Application.ScreenUpdating = 0 ‘Получаем с листа Соответствия значения, которые надо заменить в выделенном диапазоне With ThisWorkbook.Sheets(«Соответствия») lLastR = .Cells(.Rows.Count, 1).End(xlUp).Row avArr = .Cells(1, 1).Resize(lLastR, 2) End With ‘заменяем For lr = 1 To UBound(avArr, 1) s = avArr(lr, lToFindCol) If Len(s) Then ‘если значение для замены не пустое Selection.Replace s, avArr(lr, lToReplaceCol), lLookAt End If Next lr Application.ScreenUpdating = 1 End Sub

Как это работает. В книге есть специальный лист с именем «Соответствия». На нем в столбце А записаны слова, которые необходимо заменить, а в столбце В — на что эти слова заменить. Если в столбце А пусто — то замена не будет произведена. Если в столбце В пусто — то значение из столбца А будет просто удалено.
Замены производятся исключительно в выделенных на листе ячейках. Ячейки могут быть несмежными.

Итак, необходимо сделать много замен. Скачиваете файл:

Массовая замена слов (54,5 KiB, 9 744 скачиваний)

Примечание: Я сделал файл как переводчик. Т.е. в первом столбце русские слова, во втором английские. Но в столбцах может быть что угодно — хоть слова, хоть символы, хоть числа.
На лист «Соответствия» записываете в столбец А — что заменять, в столбец В — на что заменять. Переходите на лист книги, в котором необходимо произвести замену. Выделяете ячейки, значения в которых надо найти и заменить. После чего жмете Alt+F8 и выбираете макрос «Tips_Macro_ReplaceMASS.xls!Replace_Mass»(или просто «Replace_Mass», если код в той же книге, что и ячейки для поиска и замены).
Первым появится окно с запросом направления перевода. По умолчанию 1(ru-en). Т.е. будет браться слово из столбца А и заменяться словом из столбца В. Но если указать 2 — то будет браться слово из столбца В и заменяться словом из столбца А. Т.е. аналог переводчика — с рус. на англ. и наоборот. Либо из А в В, либо из В в А.
Вторым появится запрос на метод просмотра данных:

  • если указать «1 — по всему тексту» — данные из столбца А будут заменять только в том случае, если ячейка в выделенном для замены диапазоне полностью совпадает со значением из столбца А листа «Соответствия». Например, в любой из выделенных ячеек записано «На столе книга», а на листе «Соответствия» в столбце А есть только слово «книга». Замена не будет произведена, т.к. необходимо, чтобы в столбце А было так же «На столе книга».
  • если указать «2 — по части ячейки» — данные из столбца А будут заменять в случае, если ячейка в выделенном для замены диапазоне содержит любое слово из столбца А листа «Соответствия». На том же примере — «На столе книга». Если выбрать 2, то в тексте «На столе книга» слово книга будет заменено на слово из столбца В — «book».

И еще один практический пример чуть модифицированного кода. Предположим, имеется таблица выручки по реализации продукции:

Как видно, здесь присутствую только номера статей, но нет их расшифровки. Зато расшифровка есть в отдельном листе «Справочник»:

Как видно, в справочнике присутствуют нужные номера статей и можно было бы применить ту же ВПР(VLOOKUP) для замен. Если бы не одно но: в таблице по реализации помимо номеров статьей есть еще лишний текст «Статья затрат:». Конечно, можно сначала заменить этот текст, потом в отдельном столбце применить ВПР, заменить формулу значениями и вернуть в исходный столбец. Если при этом надо еще оставить текст «Статья затрат:», то надо будет сделать еще доп.манипуляции либо при составлении формулы, либо после. В любом случае — слишком много лишних телодвижений. А значит бОльшие времязатраты.
Приложенный ниже файл поможет сделать это в разы быстрее:
Скачать файл с примером и кодом:

Массовая замена слов — статьи.xls (91,5 KiB, 2 627 скачиваний)

и в итоге за пару секунд получим следующий результат:

Достаточно выделить столбец со статьями на листе с реализацией и запустить код(либо нажатием кнопки заменить значения, либо нажав Alt+F8 и выбрав из списка макросов макрос Replace_Mass ).
После нажатия на кнопку будут запрошены следующие параметры:

  1. указать номер столбца значений в листе «Справочник», в котором искать соответствия номерам статей(в нашем случае это столбец 1(А))
  2. указать номер столбца, значениями которого заменять найденные в таблице реализации значения(это может быть один из трех столбцов справочника: Группа затрат, Статья затрат, Подстатьи затрат). Логичнее всего указать столбец 4, т.к. он наиболее детализирован и конкретнее указывает расшифровку статьи
  3. далее будет предложено указать точность поиска:
    • если указать » 1 — по всему тексту » — данные будут заменены только в том случае, если значение ячейки в выделенном для замены диапазоне полностью совпадает со значением из столбца А листа «Справочник». Т.е. если бы у нас в таблице реализации был бы записан только номер статьи(1.01), тогда можно было бы указать именно 1
    • если указать » 2 — по части ячейки » — данные будут заменены только в том случае, если значение ячейки в выделенном для замены диапазоне содержит любое значение из столбца А листа «Справочник». Это больше подходит к описанному случаю, т.к. нам необходимо заменить исключительно номер статьей на их расшифровку, оставив при этом текст «Статья затрат: «

Если все указано корректно, то на листе будут произведены все необходимые замены.
Возможные ошибки, которые предусмотрены кодом и о которых будет сообщено соответствующим сообщением(код прервется, замены не будут произведены):

  • на листе Справочник нет значений
  • в качестве столбца для поиска значений и для замены значений на листе Справочник указано одно и то же число
  • в качестве столбца значений для замены указано число, превышающее общее количество столбцов на листе Справочник

Особое внимание хочу уделить случаю, когда выбирается замена по части ячейки. В этом случае лучше список на листе Справочник отсортировать по длине текста по тому столбцу, в котором будут значения для поиска. Зачем это надо: т.к. значение по части ячейки будет заменять не полное соответствие, то есть вероятность неверных замен. Например, есть текст «Статья затрат: 1.011» . В то же время на листе Справочник есть статьи «1.01» и «1.011» . Т.к. «1.01» идет раньше в большинстве случаев, то текст будет заменен некорректно: «Статья затрат: ТВ 1 » .
Чтобы получить длину строки текста можно использовать функцию ДЛСТР(LEN):
=ДЛСТР( A2 )
=LEN(A2)

В отличие от кода, приведенного в начале статьи, код во втором файле позволяет производить замену не только на основании двух столбцов, но и ориентируясь на таблицу данных, как видно из реализации. Можно выбрать любой столбец Справочника для поиска значений и так же любой для замены, что предоставляет большую гибкость по замене значений.

Статья помогла? Поделись ссылкой с друзьями!

Источник

 

jfd

Пользователь

Сообщений: 302
Регистрация: 01.01.1970

Добрый день!
Есть ли возможность задать в качестве условия поиска любое числовое значение в ячейке?
Есть диапазон, в нем часть ячеек заполнена буквами, знаками, часть цифрами. Надо в ячейках с цифрами заменить цифры(у) на букву.
Мне приходит в голову только вариант с перечислением условий типа 0, 1, 2, и т.д., но как-то криво смотрится

 

ber$erk

Пользователь

Сообщений: 2735
Регистрация: 25.12.2012

#2

11.03.2013 16:33:55

Код
    For Each icell In Selection
        If IsNumeric(icell.Value) Then icell.Value = "'" & icell.Value
    Next

Так не подойдет?

Учимся сами и помогаем другим…

 

jfd

Пользователь

Сообщений: 302
Регистрация: 01.01.1970

#3

11.03.2013 16:38:27

ber$erk, я предполагал что-то типа вот такого

Код
Range(Cells(4, 5), Cells(LastRow, LastClm)).Replace What:="*", Replacement:="x", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, MatchByte:=True, SearchFormat:=False, _
        ReplaceFormat:=False 

только вместо * что-либо указывающее на число, а не на любое значение.
ЗЫ А можно как-то перечислить все цифры в What:= ? либо указать переменную в которой определен набор значений для поиска?

Изменено: jfd11.03.2013 16:41:51

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

А если так попробовать

Range(Cells(4, 5), Cells(LastRow, LastClm)).SpecialCells(xlCellTypeConstants, xlNumbers).Replace
и далее по тексту

 

jfd

Пользователь

Сообщений: 302
Регистрация: 01.01.1970

Kuzmich, спасибо, работает
Мы выбрали диапазон с заданными границами, но включающий только ячейки с цифрами и уже внутри него ищем любую заполненную ячейку?

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#6

11.03.2013 19:19:20

Цитата
jfd пишет:
любую заполненную ячейку?

Не любую, а только с цифрами

 

jfd

Пользователь

Сообщений: 302
Регистрация: 01.01.1970

Kuzmich, не сочтите за занудство, если можно поподробнее?
Range(Cells(4, 5), Cells(LastRow, LastClm)) — это диапазон ячеек
SpecialCells(xlCellTypeConstants, xlNumbers) это нам говорит о том, в заданном диапазоне только ячейки с цифрами
Replace What:=»*»  это говорит нам осуществлять поиск в любых заполненных ячейках диапазона, но поскольку мы ранее ограничили диапазон только ячейками с цифрами, то в ячейках с чем-то другим даже и не ищем.
Правильно?
Еще параллельный вопрос, цифры сохраненные как текст можно с помощью  SpecialCells задать или только преобразовывать?

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

Замените Replace на Select, и подглядите, что выделится.

 

jfd

Пользователь

Сообщений: 302
Регистрация: 01.01.1970

RAN, ну да, как я и думал

 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

Вопросы к jfd:
1. Требуется обрабатывать только текстовые ячейки, в которых могут быть цифры?
2. Каждую цифру в ячейке заменять на какой-то символ или группу подряд идущих цифр менять на этот символ?
3. Как учитывать символ десятичной точки, например, если в ячейке значение: ХАХА123.45 или ОГО99,88 ?

Приведите несколько примеров того, что было и что должно получиться с заменой на символ подчеркивания.

Изменено: ZVI12.03.2013 11:18:42

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#11

12.03.2013 11:45:24

Цитата
jfd пишет: цифры сохраненные как текст можно с помощью SpecialCells задать

Range(Cells(4, 5), Cells(LastRow, LastClm)).SpecialCells(xlCellTypeConstants, xlTextValues).Replace

 

jfd

Пользователь

Сообщений: 302
Регистрация: 01.01.1970

#12

12.03.2013 18:17:32

ZVI,

Цитата
1. Требуется обрабатывать только текстовые ячейки, в которых могут быть цифры?

Чтобы было проще. Есть файл выгруженный из 1С, в нем диапазон ячеек часть из которых содержит «х», а часть цифры. 1С выгружает цифры как текст. Мне надо заменить цифры на «х», можно тупо заменить все значения на «х», но не интересно.

Цитата
2. Каждую цифру в ячейке заменять на какой-то символ или группу подряд идущих цифр менять на этот символ?

Любое число в ячейке надо заменить на «х». Если заменять каждую цифру в ячейке надо использовать символ подстановки «?»

Цитата
3. Как учитывать символ десятичной точки, например, если в ячейке значение: ХАХА123.45 или ОГО99,88 ?

Поскольку перед заменой преобразовываю в числовой формат и меняю «,» на «.», с числами проблем нет. А как заменить цифры на «х» в случае ХАХА123.45 используя только Replace не нашел.

Цитата
Приведите несколько примеров того, что было и что должно получиться с заменой на символ подчеркивания.

Первый приложенный файл то что было, второй что стало.
UPD Код в последнем файле

Первого нет. Удален. Общий размер более 100 кБ [МОДЕРАТОР]

Прикрепленные файлы

  • 2013.03.13 стало.xls (58 КБ)

Изменено: jfd13.03.2013 22:30:58

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#13

12.03.2013 19:44:20

Для было/стало

Код
Sub Макрос1()
    Range("C1").Copy
    Range("E4:FW54").PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd, SkipBlanks:= _
        False, Transpose:=False
    Range("E4:FW54").SpecialCells(xlCellTypeConstants, xlNumbers).Replace What:="*", Replacement:="_", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, MatchByte:=True, SearchFormat:=False, _
        ReplaceFormat:=False
End Sub
 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

#14

13.03.2013 09:09:19

Вот такой макрос обработает лист выгрузки, заменив все текстовые фрагменты типа 12.34 или 56,78 или 9 на символ замены «X»:

Код
' Заменить все фрагменты типа #.# или #,# или # на символ ReplaceBy
Sub ReplaceNums()
  Const ReplaceBy = "X" ' <-- символ замены каждой серии цифр
  Dim a, c&, r&, Rng As Range
  Set Rng = ActiveSheet.UsedRange
  ' Считать диапазон в VBA-массив
  a = Rng.Value
  ' Произвести замены в массиве
  With CreateObject("vbscript.regexp")
    .Global = True
    ' Задать шаблон: Цифра(ы) ЗапятаяИлиТочка Цифра(ы) ИЛИ Цифра(ы)
    .Pattern = "(d+[,.]d+)|(d+)"
    ' Заменить по шаблону
    For r = 1 To UBound(a, 1)
      For c = 1 To UBound(a, 2)
        Select Case VarType(a(r, c))
          Case 2 To 6: a(r, c) = ReplaceBy  ' Числовые ячейки, на всякий случай
          Case 8:      a(r, c) = .Replace(a(r, c), ReplaceBy)
        End Select
      Next
    Next
  End With
  ' Переписать исправленный массив в диапазон
  Rng.Value = a
End Sub

Изменено: ZVI13.03.2013 09:11:22

 

jfd

Пользователь

Сообщений: 302
Регистрация: 01.01.1970

#15

13.03.2013 10:57:24

ZVI,  Спасибо за пример.Я так и думал что без регулярных выражений не обойтись.
Не могли бы Вы, в качестве гуманитарной помощи, эту конструкцию разобрать?

Код
For r = 1 To UBound(a, 1)
      For c = 1 To UBound(a, 2)
        Select Case VarType(a(r, c))
          Case 2 To 6: a(r, c) = ReplaceBy  ' Числовые ячейки, на всякий случай
          Case 8:      a(r, c) = .Replace(a(r, c), ReplaceBy)
        End Select
      Next
    Next
 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

#16

13.03.2013 16:10:41

Цитата
jfd: … эту конструкцию разобрать?

Для Вашего файла выгрузки указанный фрагмент кода можно заменить на упрощенный:

Код
    ' Заменить по шаблону
    For r = 1 To UBound(a, 1)   ' В каждой строке
      For c = 1 To UBound(a, 2) ' И каждом столбце
        ' Если тип значения - текстовый, то выполнить замену
        If VarType(a(r, c)) = vbString Then a(r, c) = .Replace(a(r, c), ReplaceBy)
      Next
    Next

Ну, а в том фрагменте такая же строка замены выглядит так:
Case 8: a(r, c) = .Replace(a(r, c), ReplaceBy)
Где 8 это числовое значение константы vbString – см. VBA-справку по функции VarType.

Кроме того, я на всякий случай там обработал и ситуацию, когда в выгрузке или в результате каких-то дополнительных манипуляций появятся ячейки с числовыми типами данных. Case 2 To 6 означает с 2 по 6 и равносильно Case vbInteger To vbCurrency , это охватывает все типы числовых данных (см. справку по VarType). При этом даты, которые, по сути, тоже числовые, пропускаются, так как vbDate = 7 , что не попадает в интервал с 2 по 6.

Изменено: ZVI13.03.2013 16:12:36

 

jfd

Пользователь

Сообщений: 302
Регистрация: 01.01.1970

#17

13.03.2013 22:27:52

ZVI, Спасибо за пояснения

Обнаружил что программа при выгрузке данных в данных столбцах всегда добавляет в конец числа
5 пробелов. т.е. «222.0000000000000     «
пока заменил пробелы тоже на пустоту, но к сожалению результата нет.

Может кому что придет в голову как проблему решить. В ручную не хочеться преобразовывать тем более что данные операции с файлом(не считаю других  операций) производятся каждый день, и обрабатывается не один файл.

Все решил проблему

Все дело в пробелах и опции формата вставки её вообще убрал и все заработало.
Тест прошел и заработал правильно на коде:

    ‘Selection.Replace What:=».0000000000000     «, Replacement:=»,», LookAt:=xlPart, _
    ‘    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True

            ‘Selection.Replace What:=».00000000000000     «, Replacement:=»,», LookAt:=xlPart, _
    ‘   SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True

Итоговый код:

    Selection.Replace What:=»     «, Replacement:=»», LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True

            Selection.Replace What:=».», Replacement:=»,», LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True

Вся трабла была в 5 пробелах, и вот этих опциях SearchFormat:=False,  ReplaceFormat:=False
Если их убить то все работает на ура… возможно даже и с пробелами ) щас проверю….

Не дело именно в 2х вещах совместно :)

Все всем спасибо… )))) Все решил.. Если у кого есть еще вариант решения данной проблеммы с удовольствием посмотрю. Пишите ЛС.

Пополняемый список полезных отрывков кода VBA для выполнения часто востребованных действий в MS Excel.

'Отключение отображения выполняемых действий
Application.ScreenUpdating = False
'Предотвращение появления предупреждающих сообщений
Application.DisplayAlerts = False
'Предотвращение появления предупреждения об обновлении связей данных
Application.AskToUpdateLinks = False
'Очистка буфера обмена
Application.CutCopyMode = False

Чтобы проверить, какой пользователь открыл книгу Excel можно использовать один из следующих вариантов:

If Application.UserName = "Имя_автора_документа"  Then ...
If Environ("username") = "user"  Then ...
Set myWSheet = ThisWorkbook.Sheets("Имя_листа")
With myWSheet
     'Определение индекса последней строки таблицы
     lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
     'Определение значения в ячейки последней строке столбца A
     lastARow = .Range("A" &amp; lastRow).Value
End With
Selection.Value = Selection.Value
Worksheets.Add (After:=Worksheets(Worksheets.Count)).Name = "Имя_листа"
LastMonthDay = DateAdd("d", -1, DateSerial(Year(dtDate), Month(dtDate), 1))
dToEndOfMonth = DateDiff("d", dFrom, DateAdd("d", -1, _
     DateSerial(Year(dFrom), Month(dFrom) + 1, 1)))
DayOfWeek = DatePart("w", dToday)
pathNewBook = "C:Temp"
nameNewBook = "Имя_нового_файла.xls"
Workbooks.Add
ActiveWorkbook.SaveAs Filename:=pathNewBook & nameNewBook
ActiveWorkbook.Close True

Чтобы при сохранении файла в формате CSV, вместо запятых в качестве разделителя использовалась точка с запятой, следует использовать подобный код:

ActiveWorkbook.SaveAs FileName:="Name.csv", FileFormat:=xlCSV, _
     CreateBackup:=False, Local:=True
ActiveWorkbook.Saved = True
ActiveWorkbook.Close True
wbPath = "C:Temp"
wbName = "Имя_файла_откуда_копируем.xls"
Workbooks.Open (wbPath & wbName)
Set WB = Workbooks(wbName)
WB.Sheets("Лист 1").Range("A1:С10").Copy
Sheet("Лист_в_текущем_файле").Range("A2").PasteSpecial xlPasteValues
Workbooks.Open (Filename:=wbPath & wbName, ReadOnly:=True)
Set DateRowObj = WB.Sheets("Имя_листа").Range("A:A")._
    Find(What:=dtToAsDate, LookIn:=xlFormulas)
If (DateRowObj Is Nothing) Then
    WB.Close False
    MsgBox "Данные не найдены."
Else
    DateRow = DateRowObj.Row 'Номер строки с искомым значением
End If

Как получить имя активной книги Excel без его расширения (без .xls либо без .xlsx):

wbName = Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".") - 1)
fPath = "C:Temp"
fName = "Файл.txt"
If Dir(fPath & fName) = "" Then
   MsgBox "Файл не найден:" & Chr(13) & fPath & fName
   Exit Sub
End If
Private Sub tbVid_Click()
Application.ScreenUpdating = False
If tbVid Then
   tbVid.Caption = "Скрыть"
   ActiveSheet.Rows("2:29").Hidden = False
Else
   tbVid.Caption = "Развернуть"
   ActiveSheet.Rows("2:29").Hidden = True
End If
End Sub
currPath = ThisWorkbook.Path
currWBName = ThisWorkbook.Name
ListName.PivotTables("СводнаяТаблица1").ChangePivotCache ActiveWorkbook. _
 PivotCaches.Create(SourceType:=xlDatabase, SourceData:=currPath & "[" & _
 currWBName & "]Лист1!R1C1:R10C5")
VK.Frame1.Controls("rBtn1")
Selection.Replace What:="#DIV/0!", Replacement:="", LookAt:=xlPart,_
 SearchOrder:=xlByRows, MatchCase:=False,_
 SearchFormat:=False, ReplaceFormat:=False
Sheet1.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Rows.Count
Selection.Value = Application.Trim(Selection.Value)
Sheet1.Unprotect ('password')
ThisWorkbook.Sheets(1).Range("A1:A10") = _
   ThisWorkbook.Sheets(1).Evaluate("A1:A10" & "*80")
ThisWorkbook.Range("A1:A10").Value = _
   Evaluate("=""" & addTxt & """ & " & ThisWorkbook.Range("A1:A10").Address)
Col = Selection.Column 'Номер выбранного столбца
ColMax = ActiveSheet.PivotTables("СводнаяТаблица").PivotColumnAxis. _
 PivotLines.Count
If Col - 1 &lt;= ColMax And Col  1 Then
 ActiveSheet.PivotTables("СводнаяТаблица").PivotFields("Label").AutoSort _
  xlDescending, " ", ActiveSheet.PivotTables("СводнаяТаблица"). _
  PivotColumnAxis.PivotLines(Col - 1), 1
End If
'Счётчик, ставится в начале процедуры
StartUpdDate = Now
'Сообщение, выводится в конце процедуры
MsgBox "Данные обновлены за " & Fix(1440 * (Now – StartUpdDate)) & " мин. " & 86400 * (Now – StartUpdDate) Mod 60 & " сек."
Function Translit(Txt As String) As String
 Txt = Txt
 Rus = Array("ий", "ый", "ъе", "ъя", "ъю", _
 "ъё", "ье", "ья", "ью", "ьё", "а", "б", "в", "г", _
 "д", "е", "ё", "ж", "з", "и", "й", "к", "л", _
 "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", _
 "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я", _
 "ИЙ", "ЫЙ", "ЪЕ", "ЪЯ", "ЪЮ", _
 "ЪЁ", "ЬЕ", "ЬЯ", "ЬЮ", "ЬЁ", "А", "Б", "В", "Г", _
 "Д", "Е", "Ё", "Ж", "З", "И", "Й", "К", "Л", _
 "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", _
 "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я", _
 " ", "_", "?", _
 "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", _
 "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "«", "»")
 
 Eng = Array("y", "y", "ye", "ya", "yu", _
 "yo", "ye", "ya", "yu", "yo", "a", "b", "v", "g", _
 "d", "e", "yo", "zh", "z", "i", "y", "k", "l", "m", _
 "n", "o", "p", "r", "s", "t", "u", "f", "h", "ts", _
 "ch", "sh", "sch", "", "y", "", "eh", "u", "ya", _
 "Y", "Y", "Ye", "Ya", "Yu", _
 "Yo", "Ye", "Ya", "Yu", "Yo", "A", "B", "V", "G", _
 "D", "E", "Yo", "Zh", "Z", "I", "Y", "K", "L", "M", _
 "N", "O", "P", "R", "S", "T", "U", "F", "H", "Ts", _
 "Ch", "Sh", "Sch", "", "Y", "", "Eh", "U", "Ya", _
 " ", "_", "?", _
 "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", _
 "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "", "")
 
 For i = 1 To Len(Txt)
  с = Mid(Txt, i, 1)
  flag = 0
  For J = 0 To 116
   If Rus(J) = с Then
    outchr = Eng(J)
    flag = 1
    Exit For
   End If
  Next J
  If flag Then outstr = outstr & outchr Else outstr = outstr & с
 Next i
 
 Translit = outstr
End Function
Dim strDirPath, strMaskSearch, strFileName as String
strDirPath = "C:/test/" 'Папка поиска
strMaskSearch = "*.xls*" 'Маска поиска
 
'Получаем первый файл соответствующий шаблону
strFileName = Dir(strDirPath & strMaskSearch) 
 
Do While strFileName <> "" 'До тех пор пока файлы "не закончатся"
    MsgBox strFileName 
    strFileName = Dir 'Следующий файл
Loop

Понравилась статья? Поделить с друзьями:
  • Excel select sheet and range
  • Excel shortcuts for deleting rows
  • Excel select if not blank
  • Excel select if function
  • Excel shortcuts excel shortcut