Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2009, 10:47   #1
Zhiltsov
Пользователь
 
Аватар для Zhiltsov
 
Регистрация: 04.06.2009
Сообщений: 56
По умолчанию Макрос с диалоговым окном. Возможно такое?

Касательно переноса данных. Задача следующая: необходим макрос при старте которого появлялось диалоговое окно в котором:
Поле 1:
выбор диапазона работы макроса
Поле2:
что ищем.
Поле три где вставляем.
Я вижу это так:
В поле 1 указываем например столбец "B", в поле 2 указываем "ул.", в поле 3 указываем ",".
Что делает макрос:
В выделенном диапазоне просматривает ячейки слева направо, если в начале ячейки находит "ул.", то переносит в место перед следующим символом ","
Например ул. Ленина, д1
Результат Ленинаул., д1

Господа помогите, а то необходимо ежедневно обрабатывать файл размером более 2000 строк с такой бедой, по полдня трачу на это дело, хотя подозреваю что можно сделать чтобы обрабатывалось гораздо быстрее.
Zhiltsov вне форума Ответить с цитированием
Старый 09.06.2009, 10:58   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
необходимо ежедневно обрабатывать файл размером более 2000 строк с такой бедой, по полдня трачу на это дело
С этого и надо было начинать разговор в предыдущей теме...
Я-то думал, тот файл - это единичный случай.

Можно сделать и без диалогового окна, если единственная его цель - выполнить обработку, описанную в этой теме.

Если будет время сегодня вечером - постараюсь сделать.

Если у Вас есть возможность разговаривать через Скайп - было бы очень неплохо (чтобы обсудить все нюансы обработки)
EducatedFool вне форума Ответить с цитированием
Старый 09.06.2009, 11:25   #3
Zhiltsov
Пользователь
 
Аватар для Zhiltsov
 
Регистрация: 04.06.2009
Сообщений: 56
По умолчанию

Skype к сожалению нет, работаю на режимном объекте доступ ко всему минимальный. Может повторюсь но суть такова, что мне присылают файл с адресами в одном из столбцов, мне необходимо подгрузить данный файл на сайт, и если ячейка начинается с "ул.", "б-р", "наб.", "пер." и тд. то отображается все некоректно. задача состоит в том, чтобы тип застройки (б-р, ул., наб, и тд.) если он стоит до названия шел после названия через пробел. Если типа застройки нет, то и не надо (потому как реализовать это даже не представляю как можно)
В предыдущей теме я в архив "Адреса" вкладывал Word файл с структурой которая должна быть.
Адреса которые нужно обработать прикреплены здесь.
Вложения
Тип файла: zip Адреса.zip (54.7 Кб, 15 просмотров)

Последний раз редактировалось Zhiltsov; 09.06.2009 в 11:31.
Zhiltsov вне форума Ответить с цитированием
Старый 09.06.2009, 12:38   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Посмотрите один из возможных вариантов во вложении. Запустите макрос "Main".
Вложения
Тип файла: rar Адреса_2.rar (46.0 Кб, 28 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 09.06.2009, 13:09   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вот ещё один вариант:
Код:
Option Compare Text

Function ОбработатьТекст(ByVal txt As String) As String
    arr = Array("б-р ", "наб ", "пер ", "пл ", "пр-д ", "пр-т ", "тупик ", "ул ", "ст ", "пос ", "п ", "пгт ")
    txt = Replace(txt, ",", ", "): txt = Replace(txt, ".", ". ")
    txt = Application.WorksheetFunction.Trim(txt)
    For i = LBound(arr) To UBound(arr)
        st = arr(i)
        If txt Like st & "*" Or txt Like Trim(st) & "." & "*" Then
            txt = Mid(txt, InStr(1, txt, " ") + 1):
            rst = Split(txt, ",")(0):    'rst = Replace(rst, ",", "")
            st = Trim(st): If Right$(st, 1) <> "." And Len(st) < 5 Then st = st & "."
            txt = Replace(txt, rst, rst & " " & st): txt = Replace(txt, " ,", ",")
            Exit For
        End If
    Next i
    txt = Replace(txt, ". ", ".")
    If Right$(txt, 1) = "," Then txt = Mid(txt, 1, Len(txt) - 1)
    ОбработатьТекст = txt
End Function

Sub ОбработкаАдресов()
    Dim ra As Range, cell As Range: Set ra = Range([a2], Range("a65000").End(xlUp))
    Application.ScreenUpdating = False
    For Each cell In ra.Cells
        ' If Application.WorksheetFunction.Trim(cell) <> ОбработатьТекст(cell) Then
        cell.Next = ОбработатьТекст(cell)
    Next
End Sub

Sub Очистка(): [b:b].ClearContents: End Sub
При необходимости список переносимых значений иожно пополнить.

Пример во вложении: (нажмите зелёную кнопочку)
Вложения
Тип файла: rar Адреса.rar (50.8 Кб, 26 просмотров)
EducatedFool вне форума Ответить с цитированием
Старый 09.06.2009, 13:42   #6
Zhiltsov
Пользователь
 
Аватар для Zhiltsov
 
Регистрация: 04.06.2009
Сообщений: 56
По умолчанию

Спасибо огромное!!!
В варианте адреса2 почему то не все строки обрабатывает.

EducatedFool, а можно в варианте Адреса сделать так чтобы результат изменений заменял исходный вариант?
Zhiltsov вне форума Ответить с цитированием
Старый 09.06.2009, 13:45   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
можно в варианте Адреса сделать так чтобы результат изменений заменял исходный вариант?
Конечно можно.
Вывод в соседнюю ячейку я сделал лишь для удобства сравнения исходных и обработанных строк.

Замените в макросе ОбработкаАдресов строку cell.Next = ОбработатьТекст(cell)
на строку cell = ОбработатьТекст(cell)
EducatedFool вне форума Ответить с цитированием
Старый 09.06.2009, 13:54   #8
Zhiltsov
Пользователь
 
Аватар для Zhiltsov
 
Регистрация: 04.06.2009
Сообщений: 56
По умолчанию

Отлично!
А если у меня изменится столбец в котором будут адреса, мне достаточно изменить данные здесь: Range([a2], Range("a65000") ?
Zhiltsov вне форума Ответить с цитированием
Старый 09.06.2009, 14:21   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Да.
Для столбца D это будет выглядеть так: Set ra = Range([d2], Range("d65000").End(xlUp))
(начиная с ячейки D2, и заканчивая последней заполненной ячейкой в столбце D)

Можете также указать любой другой диапазон:
Код:
Set ra = [a5:d258]
Или несколько:
Set ra = Range("a6, a8:a1200, a1205:a1209, b4:b664")
EducatedFool вне форума Ответить с цитированием
Старый 09.06.2009, 14:24   #10
Zhiltsov
Пользователь
 
Аватар для Zhiltsov
 
Регистрация: 04.06.2009
Сообщений: 56
По умолчанию

Все! Отлично работает!!!
Господа вы молодцы!
Браво вам!
Спасибо!
Zhiltsov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возможно ли такое выделение или нет xxxsas JavaScript, Ajax 4 17.03.2009 14:05
Проблема с диалоговым окном artemavd Общие вопросы Delphi 10 28.11.2008 19:33
Возможно реализовать такое Devourer12345 Microsoft Office Access 10 15.08.2008 08:08
Возможно ли такое? (Программирование станка) Az_ Микроконтроллеры, робототехника, схемотехника, 3D принтеры 4 07.04.2008 07:30
Возможно ли такое...если да то как это сделать?! prizrak1390 Общие вопросы Delphi 9 03.01.2008 10:14