Страницы: 1
RSS
Поиск адресов домов в объединенных ячейках при помощи VBA
 
Прошу знатоков помочь в следующей проблеме:  
как найти в файле отчета все адреса домов, которые занимают 6 ячеек, объединенных в одну, и перенести эти адреса в другую книгу? Только адреса домов имеют формат в шесть ячеек Ai,Bi,Ci,Di,Ei,Fi.  
Пояснения в текстовом файле "Задача"  
Заранее благодарен за любую помощь в решении поставленных задач.
 
См. файл. Потестируйте его. Скажите что надо поправить или изменить, или добавить.
 
Pavel55. Огромное спасибо за помощь, скажите в вашем файле две кнопки - это разве не CommandButton? Я не могу войти в их свойства.  
В прикрепленном файле я подробно описал, чтобы я хотел от макроса,  
с уважением, Kuzmich
 
Уфф, что-то мой энтузиазм весь вышел, увидев ваш второй лист А4 с тех. заданием )  
Понимаете, помочь человеку с написанием одного маленького макроса - это одно, а вот такие отчёты полностью писать - это уже другое. Я вам итак уже написал 2 довольно больших макроса ).    
 
В общем выхода тут 3:  
 
1) Вы сами учитесь писать макросы. За основу можно взять мои 2 макроса. Т.е. вы сами пытаетесь что-нибудь сделать (напрограммировать), а мы вас поправляем и помогаем вам;  
2) Кто-то другой вам помогает на этом форуме (или других форумах);  
3) Вы платите деньги и вам целенаправленно пишут код под вас и за вас (я или другой человек, который за это возьмётся)  
 
Так что решайте, каким путём вы пойдёте.  
 
Прошу прощения, что не могу вам помочь в этом деле до конца! Надеюсь другие ребята вам помогут больше.
 
Да, почитал я тоже .DOC - работы навалом. А начиналось гораздо скромнее. Солидарен с Павлом.
 
Присоединяюсь к двум предыдущим постам
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Pavel55. Огромное Вам спасибо за помощь, буду пробовать сам дописать макрос,    
основные моменты Вы мне подсказали, ведь я еще только начинаю программировать в Excel. Если не получится самому, то возможен и третий вариант, предложенный Вами (как это осуществляется практически?). С уважением, Kuzmich
 
Pavel55. Пробую вытащить месяц из ячейки А4 отчета.  
В формулах Excel это может выглядеть так:  
=ПСТР(СЖПРОБЕЛЫ(A4);13;(ПОИСК(" ";СЖПРОБЕЛЫ(A4);13)-13))  
А как это реализовать средствами VBA и перенести месяц в ячейку А1 листа "Адреса"  
С уважением, Kuzmich
 
Вот этот подход с вашей стороны мне нравится )  
 
1) Вашу формулу    
 
=ПСТР(СЖПРОБЕЛЫ(A4);13;(ПОИСК(" ";СЖПРОБЕЛЫ(A4);13)-13))  
 
предлагаю переделать по VBA так  
 
Sub Макрос1()  
Dim iMonth As String  
   iMonth = Evaluate("MID(TRIM(A4),13,(SEARCH("" "",TRIM(A4),13)-13))")  
   MsgBox iMonth  
End Sub  
 
 
2) 2 кнопки в раннее выложенном файле - это кнопки с панели инструментов "Формы"  
т.е. меню Вид - Панели инструментов - Формы.    
Тут находите инструмент "Кнопка", щёлкаете по ней левой клавишей мыши. Переводите курсор на лист Exce и рисуете прямоугольник на листе удерживая левую клавишу мыши. На месте мнимо нарисованного прямоугольника появляется ваша кнопка. Она стразу запросит указать макрос, который будет запускаться с помощью неё.  
Данная кнопка с панели инструментов "Формы" мне больше нравится, чем кнопка с панели инструментов "Элементы управления" тем, что если я быстро нажму 10 раз на кнопку с "Форм", то у меня и обработается 10 нажатий, а если я быстро нажму 10 раз на кнопку с "Элементов управления", то не все мои 10 раз обработаются, а все лишь 6-7 нажатий. Т.е. вторая кнопка она как бы "подтормаживает". Хотя у неё больше различных свойств. Но они мне не нужны. Поэтому для запуска макросов кнопкой с листа Excel всегда пользуюсь кнопкой из панели инструментов "Формы"  
 
3) А "третий" вариант реализуется просто.    
- Создаёте тему на этом форуме или на любом другом, что вам требуется написать макрос,    
- выкладываете своё подробное техническое задание;    
- ваши контакты (телефон, аську, Email - что вам удобнее);    
- называете сроки в которые надо сделать задание;    
- и озвучиваете сумму, которую вы готовы заплатить на это задание;  
 
С вами связываются, обговаривают детали, сумму, способы передачи денег и кода и всё поехало.  
 
Если чего-то не дописал, ребята меня дополнят
 
Кузьмич, (не знаю вашего имени), я дополнил макрос "Список_адресов" (кнопка "Список адресов из отчётов") переносом названия месяца из отчёта в Ведомость в ячейку А1 на лист "Адреса".  
 
Так же я дополнил комментариями свои 2 макроса, которые написал вам  
- Выгрузка адресов (создание отдельных файлов в папке C:\Адреса)  
- Список адресов (перенос адресов из Отчёта в Ведомость на листа Адреса)  
 
надеюсь мои комментарии к коду будут полезными  
 
См. файл
 
Pavel55.  
Большое спасибо за комментарии к макросам. Мне импонирует Ваш стиль программирования. Вопрос по выделению месяца из ячейки А4 отчета:  
не понял конструкцию TRIM(" & """" & iMonth & """" & ")  
Функция TRIM устраняет все пробелы, почему нельзя было оставить TRIM(А4)  
С уважением, Kuzmich
 
Trim - удаляет начальные и конечные пробелы, а не все. Это, конечно, недостаток. Trim - это функция VBA. А вот функция СЖПРОБЕЛЫ - это функция рабочего листа Excel. И они различаются по своему функционалу.  
 
Можно было оставить и А4, но тогда бы надо было сперва отобразить файл с Отчётом, т.е. сделать его активным, а потом вытащить названия месяца, а так как мы запускаем макрос из файла "Ведомость", то книга с отчётом у нас неактивна и если мы попытаемся произвести расчёты с ячейка А4, то у нас ничего не выйдет, т.к. А4 - это адрес активной книги. Поэтому мы сперва считываем значение ячейка А4 файла Отчёт в переменную iMonth, а затем производим манипуляции с этой переменной, а не с ячейкой А4 неактивного файла.  
 
Как вы знаете в один и тот же момент не могут быть активны 2 листа или 2 различных книги. Т.е. Вы можете видеть лишь 1 лист и только одной активной книги.  
 
Ещё примеры для понимания  
 
Вопрос 1:  
Range("A1") - это ячейка А1 какой книги и какого листа?  
Ответ: ячейка активного листа активной книги  
 
Вопрос 2:  
Sheets("Лист3").Range("A1") - это ячейка А1 какой книги и какого листа?  
Ответ: ячейка листа 3 (необязательно активного в данный момент), но обязательно активной книги  
 
Вопрос 3:  
Worksheets("Отчёт.xls").Sheets("Лист3").Range("A1") - это ячейка А1 какого листа и какой книги?  
Ответ: ячейка листа 3 (необязательно активного в данный момент) книги "Отчёт.xls" (необязательно активной в данной момент времени)  
 
Таким образом, если открыт файл "Ведомость" и я напишу Range("A4"), то все дальнейшие манипуляции у меня пойдут с файлом "Ведомости" активного листа, а не файлом "Отчёты" листом "Sheet1".  
 
Надеюсь, я не сильно сложно объяснил
 
Дополню, что переменная iMonth у нас имеет такое значени "за период с Июль 2 008 по Июль 2 008 ", а чтобы произвести расчёты с помощью метода Evaluate() эту переменную нужно взять в двойные кавычки.  
 
'берём значение ячейка А4 из Отчёта  
iMonth = "за период с Июль 2 008 по Июль 2 008 "  
 
'берём слово начиная с 13-го символа  
iMonth = Evaluate("MID(TRIM(" & """" & iMonth & """" & "),13,(SEARCH("" "",TRIM(" & """" & iMonth & """" & "),13)-13))")  
 
'вставляем это слово в книгу Ведомость  
AddressSht.Range("A1") = iMonth  
 
Мне кажется вам пока не стоит заострять на этом внимание. Это пока сложная конструкция. Главное понят смысл, а понимание придёт потом. Если бы мне это всё показали бы 2 года назад, я бы сам из выше написанного не понял
 
Pavel55.    
Спасибо за объяснение, но я не понял  
зачем в конструкцию TRIM(" & """" & iMonth & """" & ")  
вставлены два пробела & """" &  
Почему нельзя оставить TRIM(iMonth), ведь в переменной  
iMonth и так хватает пробелов?    
С уважением, Kuzmich
 
Где вы видите вставку двух пробелов? Вставляются двойные кавычки. Необходимость их вставки Павел описал выше.
 
Кузьмич, там нем пробелов. Там 2 двойные кавычки ( " " ) взяты в двойные кавычки ( " " ), в сумме получается 4 двойные кавычки ( " "" " ). Это нужно в данном случае для метода Evaluate  
 
и как я уже писал выше:  
 
"Мне кажется, вам пока не стоит заострять на этом внимание. Это пока для вас сложная конструкция. Главное понят смысл, а понимание отдельных частей придёт потом"  
 
Для грамотного написания макросов, Вам надо больше заострять внимание на объектной модели Excel (т.е. понять 3 вопроса которых я задавал ранее про ячейку Range("A1")), а не на построение сложных формул под VBA.  
 
Дополню про объектную модель VBA (от верхнего (1-го уровня) вниз):  
 
Application  
Workbooks  
Worksheets  
Range  
Cells  
 
Вот это надо обязательно понимать. Это основа программирования.
 
Кстати, я завтра уезжаю в Санкт-Петербург на неделю. Там у меня компьютера не будет. Так что если у вас есть другие вопросы по моему коду и дальнейшему программированию вашего задания, задавайте сегодня и завтра до обеда.
 
Павел, в Питере нет компов? Это просто ужасно!!! А ещё претендуют на звание культурной столицы...    
P.S. Кузьмич, подарите Павлу ноутбук. Простенький, недорогой... :-)))  
Тогда, находясь даже на Мальдивах, он сможет Вам помогать.
 
)) ну, я уверен, что там есть компы) Просто у меня в гостинице его не будет )  
Жена хочет провести Новый год без телевизора и компов, говорит я и так не отхожу от компа ни на минуту ((. Как я проживу без компа и телевизора неделю... не знаю. Я же все макросы забуду )))  
 
Кстати, я заметил, что пишу макросы кому-то, а через день уже забываю, что я написал)) и когда люди через день-два благодарят меня за макросы или просят их подкорректировать или объяснить, я понимаю, что я вообще не помню, что им писал)) Лишь по стилистике кода понимаю, что это мой собственный макрос )) и приходится заново "въезжать" в то, что я им написал, чтобы снова им помочь) Наверное, это потому, что сижу на многих форумах, просматриваю сразу много тем, многим что-то пишу, поэтому через день уже не помню кому чего делал )
 
Неа, совсем не поэтому. Помните, что говорил почтальон Печкин: "Я почему раньше злой был? - потому, что у меня велосипеда не было..." И далее по тексту. А применительно к данному случаю - Я почему через пару дней всё, что подсказал забываю? - потому, что у меня ноутбука нет! Вот я тоненько и намекнул Кузьмичу...
 
)) Мне тогда придётся пожизненно писать Кузьмичу макросы ))
 
Pavel55. Вопрос не по теме.  
В какой гостинице Вы решили остановиться?  
У Вас это турпутевка или Вы в свободном полете?  
Были ли Вы раньше в Питере и что собираетесь  
посетить и посмотреть?  
С уважением, Kuzmich
 
эм.. у меня организацией этой поездки жена занимается ))  
 
Гостиница - названия не знаю (жена спит сейчас), адрес Московский пр. д.53  
 
Это "свободный полёт" ), так дешевле получается. Думаю на месте купим билеты на экскурсии какие-нибудь. Собираемся посетить музеи и театры) Так сказать духовно и культурно обогатиться )  
 
Да, в Питере был пару раз, студентом ездил на экскурсии от института. Очень понравилось. Завтра вечером уезжаю, там буду с 30/12 по 3/01 число )
 
Pavel55.  
По алресу Московский пр.53 находится салон  красоты "Анви" и    
кафе "Флай", гостиницы не увидел. На фотографии это Ваше фото    
или сетевой НИК? В Питере позвоните после 19 часов    
по тел. 434-54-57  Помогу, чем могу. С уважением Kuzmich
 
Вот нашёл ссылку на отель http://www.goodhotel.ru/location.html  
 
На аватарке - Freddie Mercury, солист группы Queen  
Сетевой ник Pavel55  
а в жизни просто Павел )  
Спасибо за предложение помочь.  
Вы так и не сказали мне, как вас зовут )
 
Pavel55. Какой-то мини-отель, его даже нет на топ-плане.  
Вообще-то в Санкт-Петербург едут в период белых ночей, на праздник    
"Алые паруса" в июне.  
Меня зовут Владимир. С уважением, KuzmichVladimir@mail.ru
 
))) сам боюсь )) но жена заставляет ))  
 
Я бы тоже хотел пересечься с вами на пару часиков, чтобы вы наглядно мне показали, что вы хотите сделать с вашими файлами, я думаю часа за 2-3 (в идеале) я бы написал, что вы хотите. Но боюсь моя девушка будет против макросов на отдыхе )) она итак каждый день только и слышит "макросы... макросы..." )) Я конечно попробую её уломать... если не получится, не серчайте на меня сильно)
Страницы: 1
Наверх