Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите ускорить работу макроса поиска и замены значений в Excel на о
Форум программистов > Системное программирование > Visual Basic
FriendProg
Приветствую Вас всех! Помогите с проблемой есть код, который подставляет ФИО за место номера внутреннего телефона, НО делает он это (а именно он обрабатывает 1100 ячеек в столбце C, а диапазон внутренних телефонных номеров абонентов "101-600") нереально долго, каким путем посоветуете пойти!?
Заранее я очень сильно всем Вам благодарен!!!


Код
Sub Edit1()

Dim rng1 As Range, rng2 As Range, s1(500, 2) As String

'Заполнение массива для замены

For i = 101 To 600

    s1(i - 100, 1) = i
    
Next i

    s1(242 - 100, 2) = "Гирнык Наталья (242)"
    s1(230 - 100, 2) = "Городецкая Ольга (230)"
    s1(216 - 100, 2) = "Гуцул Александр (216)"
    s1(251 - 100, 2) = "Данильчук Ирина (251)"
    s1(208 - 100, 2) = "Кузьмина Анна (208)"
    s1(240 - 100, 2) = "Орлов Валерий (240)"
    s1(248 - 100, 2) = "Половьева Элеонора (248)"
    s1(255 - 100, 2) = "Аглаганов Роман (255)"
    s1(416 - 100, 2) = "Асланова Мария (416)"
    s1(217 - 100, 2) = "Козлова Юлия (217)"
    s1(227 - 100, 2) = "Кулаева Яна (227)"
    s1(218 - 100, 2) = "Москвичев Роман (218)"
    s1(404 - 100, 2) = "Овчинникова Екатерина (404)"
    s1(231 - 100, 2) = "Фомичева Людмила (231)"
    s1(266 - 100, 2) = "Байсалканов Борис (266)"
    s1(268 - 100, 2) = "Байсалканов Борис (268)"
    s1(269 - 100, 2) = "Байсалканов Борис (269)"
    s1(234 - 100, 2) = "Вихляева Татьяна (234)"
    s1(413 - 100, 2) = "Вихляева Татьяна (413)"
    s1(250 - 100, 2) = "Загорулькина Юлия (250)"
    s1(409 - 100, 2) = "Загорулькина Юлия (409)"
    s1(215 - 100, 2) = "Илюхина Марина (215)"
    s1(239 - 100, 2) = "Ларина Виктория (239)"
    s1(246 - 100, 2) = "Машина Наталья (246)"
    s1(247 - 100, 2) = "Машина Наталья (247)"
    s1(232 - 100, 2) = "Охрана - Двор (232)"
    s1(236 - 100, 2) = "Охрана - ОперЗал (236)"
    s1(253 - 100, 2) = "Охрана - ОперЗал (253)"
    s1(200 - 100, 2) = "Сизикова Ирина (200)"
    s1(265 - 100, 2) = "Сизикова Ирина (265)"
    s1(258 - 100, 2) = "Сорочан Александр (258)"
    s1(267 - 100, 2) = "Факс - Кредитный отдел (267)"
    s1(228 - 100, 2) = "Факс - ОперЗал (228)"
    
'Замена

For i = 1 To 500

Set rng1 = Range("C2:C1100").Find(s1(i, 1))
If Not (rng1 Is Nothing) Then
    rng1.Value = s1(i, 2)
    
    Do
    
        Set rng2 = Range("C2:C1100").FindNext
        If Not (rng2 Is Nothing) Then rng2.Value = s1(i, 2)
        
    Loop While Not (rng2 Is Nothing)
    
End If

Next i

End Sub


Ироглифы это ФИО абонентов, а в скобках их корпоративные внутренние телефонные номера...
Morpheus
Цитата(FriendProg @ 4:06:2008 - 09:50) *
Set rng2 = Range("C2:C1100").FindNext
If Not (rng2 Is Nothing) Then rng2.Value = s1(i, 2)

идете дальше, юзайте Replace!
Tanya
еще как вариант:
1) создается массив с количеством элементов явно большим, чем требуется (по-крайней мере в примере)
то есть требуется 33 элемента, а массив объявляется на 501 элемент
2) если такой массив и требуется, то в цикле можно проверять содержит ли элемент что-нибудь:
Код
if len(s1(i, 2)) >0 then 'выполняем поиск и замену


3) может это не совсем то, но: если значения список номеров телефонов и ФИО хранятся на листе Excel,
и требуется подставить эти значения в другом диапазоне, то можно использовать функцию Excel ВПР()

=ВПР(Искомое_Значение; Таблица; Номер_Столбца; Интервальный_Просмотр)
Искомое_Значение - в данном случае, ячейка с искомым номером телефона
Таблица - указываем диапазон, где содержится список телефонов и ФИО.
Нужно, чтобы в первой колонке обязательно было значение, по которому ведется поиск - то есть номер телефона,
и обязательно! таблица должна быть отсортирована по номерам телефонов
Номер_Столбца - номер колонки в списке с ФИО, то есть номер колонки относительно номера колонки с телефонами,
если считать, что у нас только телефон; ФИО, то номер колонки = 2
Интервальный_Просмотр - Ложь, если мы ищем точные значения

в общем, это оч хорошая функция, если к ней приспособиться :-)
и все зависит от того, что требуется делать
Jumpy
Палюбому встроенная функция фаинд тупит...
лучше пробегаться по масиву мамому...

Dim MAS(1 to 100, 1 to 2) as string
'двумерный массив в 100 элементов, 1ый - это номер телефон, 2ой - это собственно фамилия
'терь задаем массив
MAS(1, 1) = "242" 'здесь на самом деле чо угодно, то самое что будет заменяться
MAS(1,2) = "Гирнык Наталья (242)" 'а здесь НА то что будет заменяться

MAS(2,1) = "230"
MAS(2,2) ="Городецкая Ольга (230)"

'два элемента для примера достаточно, теперь цикл по всему столбику

dim a as integer 'переменная цикла
dim b as integer 'внутренний цикл
dim STROKA as string 'рабочая строка, шобы пошустрее сравнивало

for a = 1 to 1000 'цикл с первой по последнюю строчку
STROKA = Range("C" & a)

for b = 1 to 100 'цикл по всему массиву, ессно лучше идти до последнего элемента, если фамилий 40, то и идти до 40ого

'если в нашей ячейке то самое, что надо заменить и мы нашли это в массиве,
'то вписываем в ячейку собственно замену и выходим из внутреннего цикла
if STROKA = MAS(b,1) then
Range("C" &a) = MAS(b,2)
exir for
end if

next 'конец внутреннего цикла
next 'конец внешнего цикла

ИМХО гораздо проще модицифируется, а работать будет быстрее чем любой вызов встроенной функции - это проверено.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2008 IPS, Inc.