Здравствуйте! Возможно, для знатоков VBA данный вопрос будет выглядеть довольно просто и забавно, но для малоопытного пользователя VBA - вопрос видится очень сложным :)
Ситуация примерно такова: в экселе есть ячейка, в которой записан образно такого вида текст: А.10,Бв.25 В основном, тескт записан в таком виде. Однако, могут встречать ячейки, в который текст имеет такой вид: 10,Бв25 (то есть, без первой буквы). Буквы Бв.25 (цифры всегда разные, 25 - выбрана в качестве примера), присутствуют в ячейке всегда. Подскажите, пожалуйста, возможно ли макросом разделить данный текст так, чтобы удалялись буквы "А." и "Бв.", а цифры, следующие за буквами, переносились в разные указанные ячейки, то есть, удаляется буква "А.", цифра 10 переносится в одну ячейку, удаляется слово "Бв.", а 25 переносится в другую ячейку?
Все, что пришло на ум - это проверять ячейку справа налево на наличие слова Бв., если слово в ячейке есть, то удалять его, а все, что правее от "Бв.", переносить в соседнюю ячейку. После этой процедуры опять проверять ячейку на наличие буквы "А." и есть такая буква есть, то удалить ее и все, что правее от нее, переносить в другую соседнюю ячейку. Наверняка это далеко не самое оптимальное решение) Если не сложно, помогите, пожалуйста, в решении данной задачи.
Спасибо! [moder]Покажите файл. И приведите несколько примеров, как может выглядеть исходный текст.[/moder]
Исходный текст может быть соедующего вида: А.5,Бв.12 А.108,Бв.3 А.218,Бв.140 Если есть слово "Бв.", то в ячейке точно за этим словом следует число. Чисто может быть от 1 до 999.
Здравствуйте! Возможно, для знатоков VBA данный вопрос будет выглядеть довольно просто и забавно, но для малоопытного пользователя VBA - вопрос видится очень сложным :)
Ситуация примерно такова: в экселе есть ячейка, в которой записан образно такого вида текст: А.10,Бв.25 В основном, тескт записан в таком виде. Однако, могут встречать ячейки, в который текст имеет такой вид: 10,Бв25 (то есть, без первой буквы). Буквы Бв.25 (цифры всегда разные, 25 - выбрана в качестве примера), присутствуют в ячейке всегда. Подскажите, пожалуйста, возможно ли макросом разделить данный текст так, чтобы удалялись буквы "А." и "Бв.", а цифры, следующие за буквами, переносились в разные указанные ячейки, то есть, удаляется буква "А.", цифра 10 переносится в одну ячейку, удаляется слово "Бв.", а 25 переносится в другую ячейку?
Все, что пришло на ум - это проверять ячейку справа налево на наличие слова Бв., если слово в ячейке есть, то удалять его, а все, что правее от "Бв.", переносить в соседнюю ячейку. После этой процедуры опять проверять ячейку на наличие буквы "А." и есть такая буква есть, то удалить ее и все, что правее от нее, переносить в другую соседнюю ячейку. Наверняка это далеко не самое оптимальное решение) Если не сложно, помогите, пожалуйста, в решении данной задачи.
Спасибо! [moder]Покажите файл. И приведите несколько примеров, как может выглядеть исходный текст.[/moder]
Исходный текст может быть соедующего вида: А.5,Бв.12 А.108,Бв.3 А.218,Бв.140 Если есть слово "Бв.", то в ячейке точно за этим словом следует число. Чисто может быть от 1 до 999.giovanni
Сообщение отредактировал giovanni - Вторник, 17.05.2016, 12:40
Совсем неважно макрос или формула :-) Подскажите, возможно ли формулу внедрить в макрос? Т.к. указанная задача - это часть более крупного макроса.
В файлике все работает отлично :-) Но есть установить в ячейке более крупное чисто (не 10, а 100), то в итоге выдается ошибка(
Файла с примером как такового нет. В принципе, задача только разделить указанный выше текст.
Извиняюсь за неправильное цитирование, не сорентировался)
[moder]Читайте Правила форума. Запрещено: излишнее цитирование, несколько разных вопросов в одной теме. Необходим Ваш файл-пример, как уже было указано в комментарии модератора выше. Исправляйте этот пост.[/moder]
Совсем неважно макрос или формула :-) Подскажите, возможно ли формулу внедрить в макрос? Т.к. указанная задача - это часть более крупного макроса.
В файлике все работает отлично :-) Но есть установить в ячейке более крупное чисто (не 10, а 100), то в итоге выдается ошибка(
Файла с примером как такового нет. В принципе, задача только разделить указанный выше текст.
Извиняюсь за неправильное цитирование, не сорентировался)
[moder]Читайте Правила форума. Запрещено: излишнее цитирование, несколько разных вопросов в одной теме. Необходим Ваш файл-пример, как уже было указано в комментарии модератора выше. Исправляйте этот пост.[/moder]giovanni
Сообщение отредактировал giovanni - Вторник, 17.05.2016, 14:21
giovanni, добавил еще функции uuu3 и uuu4 в столбцах E и F соответственно
Огромное спасибо! Работает отлично)) Уровень знаний в VBA не позволил ничего понять из указанного кода, но работает прекрасно! Был бы очень признателен, если по возможности Вы бы расписали что означают различные значения в коде функции, очень интересно понять)
Подскажите, пожалуйста, возможно ли внести некоторые изменения в код, чтобы происходило следующее: в ячейке, перед указанным ранее в примере текстом А.5,Бв.12, практически всегда будет присутствовать текст - одно-два слова (например, Абвгдежз А.5,Бв.12) Возможно ли сделать так, чтобы, как в Вашем примере, цифры 5 и 12 переносились в отдельные ячейки, данные цифры удалялись бы из исходной ячейки и слово Абвгдежз также удалялось из исходной ячейки и переносилось в еще одну отдельную ячейку. Если сказать на примере, то примерно так: в исходной ячейке текст "Абвгдежз А.5,Бв.12", а после исполнения макроса - "Абвгдежз" в отдельной ячейке, цифра "5" в отдельной ячейке и цифра "12" также в отдельной ячейке.
Спасибо за помощь еще раз!) [moder]Вот, как мы все с нетерпением и ожидали, начинается комедия "А у меня в файле всё не так". Вам уже 2 раза сказали про файл с вариантами заполнения. Что не понятно?
giovanni, добавил еще функции uuu3 и uuu4 в столбцах E и F соответственно
Огромное спасибо! Работает отлично)) Уровень знаний в VBA не позволил ничего понять из указанного кода, но работает прекрасно! Был бы очень признателен, если по возможности Вы бы расписали что означают различные значения в коде функции, очень интересно понять)
Подскажите, пожалуйста, возможно ли внести некоторые изменения в код, чтобы происходило следующее: в ячейке, перед указанным ранее в примере текстом А.5,Бв.12, практически всегда будет присутствовать текст - одно-два слова (например, Абвгдежз А.5,Бв.12) Возможно ли сделать так, чтобы, как в Вашем примере, цифры 5 и 12 переносились в отдельные ячейки, данные цифры удалялись бы из исходной ячейки и слово Абвгдежз также удалялось из исходной ячейки и переносилось в еще одну отдельную ячейку. Если сказать на примере, то примерно так: в исходной ячейке текст "Абвгдежз А.5,Бв.12", а после исполнения макроса - "Абвгдежз" в отдельной ячейке, цифра "5" в отдельной ячейке и цифра "12" также в отдельной ячейке.
Спасибо за помощь еще раз!) [moder]Вот, как мы все с нетерпением и ожидали, начинается комедия "А у меня в файле всё не так". Вам уже 2 раза сказали про файл с вариантами заполнения. Что не понятно?giovanni
Сообщение отредактировал _Boroda_ - Среда, 18.05.2016, 10:18
Sub test() Dim z(), z1(), i&, t, t1, t2, t3 z = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Value ReDim z1(1 To UBound(z), 1 To 3) With CreateObject("VBScript.RegExp"): .Pattern = "([а-яё]+) А\.(\d+),Бв\.(\d+)": .IgnoreCase = True: .Global = True For i = 1 To UBound(z): t = z(i, 1) t1 = .Execute(t)(0).Submatches(0): t2 = .Execute(t)(0).Submatches(1): t3 = .Execute(t)(0).Submatches(2) z(i, 1) = Replace(Replace(Replace(t, t1, ""), t2, ""), t3, "") z1(i, 1) = t1: z1(i, 2) = t2: z1(i, 3) = t3 Next End With Range("A1").Resize(UBound(z), 1).Value = z Range("B1").Resize(UBound(z1), 3).Value = z1 End Sub
Sub test() Dim z(), z1(), i&, t, t1, t2, t3 z = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Value ReDim z1(1 To UBound(z), 1 To 3) With CreateObject("VBScript.RegExp"): .Pattern = "([а-яё]+) А\.(\d+),Бв\.(\d+)": .IgnoreCase = True: .Global = True For i = 1 To UBound(z): t = z(i, 1) t1 = .Execute(t)(0).Submatches(0): t2 = .Execute(t)(0).Submatches(1): t3 = .Execute(t)(0).Submatches(2) z(i, 1) = Replace(Replace(Replace(t, t1, ""), t2, ""), t3, "") z1(i, 1) = t1: z1(i, 2) = t2: z1(i, 3) = t3 Next End With Range("A1").Resize(UBound(z), 1).Value = z Range("B1").Resize(UBound(z1), 3).Value = z1 End Sub
giovanni, добрый вечер,для Вашего нового файл-примера,вариант макроса кнопки test1 и повтор
[vba]
Код
Sub test1() Dim z(), z1(), i&, t, t1, t2, t3 z = Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row).Value ReDim z1(1 To UBound(z), 1 To 3) With CreateObject("VBScript.RegExp") For i = 1 To UBound(z): t = z(i, 1) .Pattern = "[а-яё]+": .IgnoreCase = True t1 = .Execute(t)(0) .Pattern = "\d+": .Global = True If .Execute(t).Count > 1 Then t2 = .Execute(t)(.Execute(t).Count - 2): t3 = .Execute(t)(.Execute(t).Count - 1) Else t2 = .Execute(t)(.Execute(t).Count - 1): t3 = "" z(i, 1) = Replace(Replace(Replace(t, t1, ""), t2, ""), t3, "") z1(i, 1) = t1: z1(i, 2) = t2: z1(i, 3) = t3 Next End With Range("A3").Resize(UBound(z), 1).Value = z Range("B3").Resize(UBound(z1), 3).Value = z1 End Sub
[/vba]
giovanni, добрый вечер,для Вашего нового файл-примера,вариант макроса кнопки test1 и повтор
[vba]
Код
Sub test1() Dim z(), z1(), i&, t, t1, t2, t3 z = Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row).Value ReDim z1(1 To UBound(z), 1 To 3) With CreateObject("VBScript.RegExp") For i = 1 To UBound(z): t = z(i, 1) .Pattern = "[а-яё]+": .IgnoreCase = True t1 = .Execute(t)(0) .Pattern = "\d+": .Global = True If .Execute(t).Count > 1 Then t2 = .Execute(t)(.Execute(t).Count - 2): t3 = .Execute(t)(.Execute(t).Count - 1) Else t2 = .Execute(t)(.Execute(t).Count - 1): t3 = "" z(i, 1) = Replace(Replace(Replace(t, t1, ""), t2, ""), t3, "") z1(i, 1) = t1: z1(i, 2) = t2: z1(i, 3) = t3 Next End With Range("A3").Resize(UBound(z), 1).Value = z Range("B3").Resize(UBound(z1), 3).Value = z1 End Sub
giovanni, добрый вечер,для Вашего нового файл-примера,вариант макроса кнопки test1 и повтор
Здравствуйте!
Макрос работает отлично, именно то, что нужно! Огромное спасибо за помощь!
Если можно, помогите, пожалуйста в одном моменте, связанном с работой данного макроса. К примеру, если текст "Абвгдежз" цельный, то все работает отлично. Но, к примеру, если в слове "Абвгдежз" присутствует точка ("Абвг.дежз"), то макрос переносит только часть слова, а именно ту часть, которая до точки ("Абвг"). Возможно ли в рамках данного макроса сделать так, чтобы слово "Абвгдежз" переносилось полностью, вне зависимости от наличия в слове точки?
giovanni, добрый вечер,для Вашего нового файл-примера,вариант макроса кнопки test1 и повтор
Здравствуйте!
Макрос работает отлично, именно то, что нужно! Огромное спасибо за помощь!
Если можно, помогите, пожалуйста в одном моменте, связанном с работой данного макроса. К примеру, если текст "Абвгдежз" цельный, то все работает отлично. Но, к примеру, если в слове "Абвгдежз" присутствует точка ("Абвг.дежз"), то макрос переносит только часть слова, а именно ту часть, которая до точки ("Абвг"). Возможно ли в рамках данного макроса сделать так, чтобы слово "Абвгдежз" переносилось полностью, вне зависимости от наличия в слове точки?
giovanni, добрый вечер,поменяйте шаблон(Pattern) в макросе,например,скопировав, на такой вариант
Здравствуйте!
Внес изменения, как Вы сказали, все работает отлично! Огромное спасибо!)
Если не сложно, подскажите, пожалуйста, по одному моменту в данном макросе. Думал разберусь сам, т.к. чуток дружу с VBA, но не получается)
В данном макросе обрабатывается исходный текст, находящийся в начиная с ячейки "А3" и далее по всему столбцу "А". Обработанный макросом текст вставляется в соседние ячейки, правее от исходного текста. Можно ли внести в макрос изменения, чтобы его можно было применить к исходному тексту, находящегося в любой другой ячейке? К примеру, если исходный текст будет находиться не в столбце "А", а, например, в ячейке "N2". Вижу в коде макроса строку:
Код
z = Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row).Value
когда изменяю адрес ячейки "А3" на другой, текст находящийся в указанной ячейке не обрабатывается макросом. Наверняка что-то делаю не так)
giovanni, добрый вечер,поменяйте шаблон(Pattern) в макросе,например,скопировав, на такой вариант
Здравствуйте!
Внес изменения, как Вы сказали, все работает отлично! Огромное спасибо!)
Если не сложно, подскажите, пожалуйста, по одному моменту в данном макросе. Думал разберусь сам, т.к. чуток дружу с VBA, но не получается)
В данном макросе обрабатывается исходный текст, находящийся в начиная с ячейки "А3" и далее по всему столбцу "А". Обработанный макросом текст вставляется в соседние ячейки, правее от исходного текста. Можно ли внести в макрос изменения, чтобы его можно было применить к исходному тексту, находящегося в любой другой ячейке? К примеру, если исходный текст будет находиться не в столбце "А", а, например, в ячейке "N2". Вижу в коде макроса строку:
Код
z = Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row).Value
когда изменяю адрес ячейки "А3" на другой, текст находящийся в указанной ячейке не обрабатывается макросом. Наверняка что-то делаю не так)
z = Range("N2:N" & Range("N" & Rows.Count).End(xlUp).Row).Value и , возможно надо изменить диапазон выгрузки
Вы правы, изменение данной строки работает: [vba]
Код
z = Range("N2:N" & Range("N" & Rows.Count).End(xlUp).Row).Value
[/vba] Однако, выгрузка результатов работы макроса происходит в те же ячейки, что и раньше. Возможно ли изменить диапазон выгрузки? [moder]для оформления кода - используйте тег #[/moder]
z = Range("N2:N" & Range("N" & Rows.Count).End(xlUp).Row).Value и , возможно надо изменить диапазон выгрузки
Вы правы, изменение данной строки работает: [vba]
Код
z = Range("N2:N" & Range("N" & Rows.Count).End(xlUp).Row).Value
[/vba] Однако, выгрузка результатов работы макроса происходит в те же ячейки, что и раньше. Возможно ли изменить диапазон выгрузки? [moder]для оформления кода - используйте тег #[/moder]giovanni
Сообщение отредактировал SLAVICK - Среда, 25.05.2016, 21:42
Воспользуйтесь UDF, которые вам представил sv2014 в сообщениях 5 и 6
Указанный Вами UDF работают немного не так, как нужно. В то же время макрос, указанный в сообщении №10 форматирует текст именно так, как нужно:
[vba]
Код
Sub test1() Dim z(), z1(), i&, t, t1, t2, t3 z = Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row).Value ReDim z1(1 To UBound(z), 1 To 3) With CreateObject("VBScript.RegExp") For i = 1 To UBound(z): t = z(i, 1) .Pattern = "[а-яё]+": .IgnoreCase = True t1 = .Execute(t)(0) .Pattern = "\d+": .Global = True If .Execute(t).Count > 1 Then t2 = .Execute(t)(.Execute(t).Count - 2): t3 = .Execute(t)(.Execute(t).Count - 1) Else t2 = .Execute(t)(.Execute(t).Count - 1): t3 = "" z(i, 1) = Replace(Replace(Replace(t, t1, ""), t2, ""), t3, "") z1(i, 1) = t1: z1(i, 2) = t2: z1(i, 3) = t3 Next End With Range("A3").Resize(UBound(z), 1).Value = z Range("B3").Resize(UBound(z1), 3).Value = z1 End Sub
[/vba]
Единственный момент с данным макросом - это то, что если применить его к количеству строк меньшему, чем указано в файле (в файле примера 5 строк), то VBA выдает ошибку "Type missmatch". Если заставить данный макрос работать только с одной указанной ячейкой, то это будет на 100% то, что нужно) По мере своих знаний в VBA пытался изменить диапазон работы макроса, но не получается.
Воспользуйтесь UDF, которые вам представил sv2014 в сообщениях 5 и 6
Указанный Вами UDF работают немного не так, как нужно. В то же время макрос, указанный в сообщении №10 форматирует текст именно так, как нужно:
[vba]
Код
Sub test1() Dim z(), z1(), i&, t, t1, t2, t3 z = Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row).Value ReDim z1(1 To UBound(z), 1 To 3) With CreateObject("VBScript.RegExp") For i = 1 To UBound(z): t = z(i, 1) .Pattern = "[а-яё]+": .IgnoreCase = True t1 = .Execute(t)(0) .Pattern = "\d+": .Global = True If .Execute(t).Count > 1 Then t2 = .Execute(t)(.Execute(t).Count - 2): t3 = .Execute(t)(.Execute(t).Count - 1) Else t2 = .Execute(t)(.Execute(t).Count - 1): t3 = "" z(i, 1) = Replace(Replace(Replace(t, t1, ""), t2, ""), t3, "") z1(i, 1) = t1: z1(i, 2) = t2: z1(i, 3) = t3 Next End With Range("A3").Resize(UBound(z), 1).Value = z Range("B3").Resize(UBound(z1), 3).Value = z1 End Sub
[/vba]
Единственный момент с данным макросом - это то, что если применить его к количеству строк меньшему, чем указано в файле (в файле примера 5 строк), то VBA выдает ошибку "Type missmatch". Если заставить данный макрос работать только с одной указанной ячейкой, то это будет на 100% то, что нужно) По мере своих знаний в VBA пытался изменить диапазон работы макроса, но не получается.giovanni