Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Подстановка значений / 25 сообщений из 30, страница 1 из 2
12.10.2005, 12:18:28
    #33319551
talgat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
В фирме 43 моб. телефона. Для удобства вместо длинных номеров (например 5264857) используем короткие (например 4987). Распечатка переговоров приходит ежемесячно на мыло с длинными номерами. Обычно от 18000 до 25000 звонков (строк) в формате EXCEL. Подстановку т.е. замену длинных номеров на короткие делаю в лоб в цикле ( 2 цикла, один вложен в другой). Т.е. на втором листе таблица соответствия длинный короткому. Код молотит 45-60 минут. Может есть идеи как заменять/подменять один текст на другой по другому, не тупым перебором? Ведь цикл происходит в среднем 43*20000 раз.
...
Рейтинг: 0 / 0
12.10.2005, 14:21:24
    #33320119
Подстановка значений
Да, простой перебор работает очень долго, проверено.

Воспользуйся методами .Find и .FindNext, для того чтобы найти длинные номера и заменить их короткими из таблицы соответсвия.
...
Рейтинг: 0 / 0
12.10.2005, 14:54:40
    #33320243
Sinner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
Мысли вслух: а формулами низя?
ИМХО быстрее должно рулить...
+вопрос:эхо отображение небось включено?
...
Рейтинг: 0 / 0
12.10.2005, 15:12:49
    #33320319
Letter_D
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
А я подобную задачу решал так:
Оба списка запихнул в массивы, их сравнил и прописал соответсвие.
И взад выгрузил вместе с соответствием.
Работает ужас какбыстро.

Графический интерфейс же не привязан, все операции чисто в памяти проходят.
...
Рейтинг: 0 / 0
12.10.2005, 16:11:54
    #33320570
talgat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
Letter_DА я подобную задачу решал так:
Оба списка запихнул в массивы, их сравнил и прописал соответсвие.
И взад выгрузил вместе с соответствием.
Работает ужас какбыстро.

Графический интерфейс же не привязан, все операции чисто в памяти проходят.

Можно ПОПОДРОБНЕЕ. Или примерчик. Или на talgat@bsr.ee
...
Рейтинг: 0 / 0
12.10.2005, 16:13:25
    #33320573
talgat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
SinnerМысли вслух: а формулами низя?
ИМХО быстрее должно рулить...
+вопрос:эхо отображение небось включено?
Формулами не получилось. Что то громоздкое создал но толком не получилось
...
Рейтинг: 0 / 0
12.10.2005, 16:17:58
    #33320591
talgat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
Пользователь2Да, простой перебор работает очень долго, проверено.

Воспользуйся методами .Find и .FindNext, для того чтобы найти длинные номера и заменить их короткими из таблицы соответсвия.

Find использую в этой программке для определения конца списков ( распечатки и таблицы соответствия). А про findNext даже и не слыхал. Ща будем смотреть ! СпасибА !
...
Рейтинг: 0 / 0
12.10.2005, 17:08:22
    #33320790
talgat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
По поводу Find: использую при поиске так например
Set r = ActiveSheet.Range(B3:B1000")
Set g = r.Find(What:=искомое_значение)
А как используется FindNext ? В helpe чого то все о поиске файлов пишется.
Подскажитееее...
...
Рейтинг: 0 / 0
12.10.2005, 17:21:05
    #33320829
Letter_D
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
talgatМожно ПОПОДРОБНЕЕ. Или примерчик. Или на talgat@bsr.ee
Ну, я не знаю, как поподробнее.
Типа описываешь массив по количеству ячеек, там (30000,3), например.
Или через Redim Preserve, если не знаешь, сколько их там будет.
По одному циклу загоняешь ячейки в массив.
Имя_Массива(i,j)=Sheets("bla-bla").Cells(i,j)
И второй массив так же.
Далее все оперции с только массивами, можно даже легко сделать глобальную замену в модуле Sheets("bla-bla").Cells(i,j) на Имя_Массива(i,j) , синтаксис такой же! Чтобы не переписывать ручками.

А в конце получившийся массив выгружаешь назад в ячейки.
...
Рейтинг: 0 / 0
12.10.2005, 17:27:18
    #33320846
talgat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
Letter_D talgatМожно ПОПОДРОБНЕЕ. Или примерчик. Или на talgat@bsr.ee
Ну, я не знаю, как поподробнее.
Типа описываешь массив по количеству ячеек, там (30000,3), например.
Или через Redim Preserve, если не знаешь, сколько их там будет.
По одному циклу загоняешь ячейки в массив.
Имя_Массива(i,j)=Sheets("bla-bla").Cells(i,j)
И второй массив так же.
Далее все оперции с только массивами, можно даже легко сделать глобальную замену в модуле Sheets("bla-bla").Cells(i,j) на Имя_Массива(i,j) , синтаксис такой же! Чтобы не переписывать ручками.

А в конце получившийся массив выгружаешь назад в ячейки.

Идею понял. Классный метод и очень простой. ВОПРОС ЗАКРЫТ. ВСЕМ БОЛЬШОЕ СПАСИБО !!!
...
Рейтинг: 0 / 0
12.10.2005, 17:44:26
    #33320902
Подстановка значений
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Public Sub FindAndRepace()
    ' На Листе2 находится справочник.
    '      A         B
    ' 1 123456789   1234
    ' 2 987654321   9876
    ' 3 999999999   9999
    ' ...
    ' 20 ...
    ' На Листе1 наши 20000 строк с номерами.
    
    Dim firstAdress As String
    Dim rng As Range
    Dim intI As Integer
    Dim Start, Finish, TotalTime
    
    Start = Timer
    
    For intI =  1  To  20 
        Set rng = Worksheets("Лист1").Range("A1:A20000"). _
          Find(What:=CStr(Worksheets("Лист2").Range("A" & intI)), LookIn:=xlValues, _
          LookAt:=xlWhole, MatchCase:=False)
        If Not (rng Is Nothing) Then
            Do
                rng.Value = Worksheets("Лист2").Range("A" & intI).Offset( 0 ,  1 ).Value
                Set rng = Range("A1:A20000").FindNext(rng)
            Loop While Not (rng Is Nothing)
        End If
    Next intI
    
    Finish = Timer
    TotalTime = Finish - Start
    
    MsgBox "Всего времени: " & TotalTime
    ' У меня получается 27 сек. PIII-800.
End Sub

Попробуй с массивами, возможно время выполнения уменьшится. :)
...
Рейтинг: 0 / 0
12.10.2005, 18:14:07
    #33320989
talgat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
Private Sub CommandButton1_Click()
Dim r As Range, g As Range
Dim p As Variant
'' определение последней строки на Sheet1
Worksheets("Sheet1").Activate
Set r = ActiveSheet.Range("A3:A30000")
Set g = r.Find(What:="")
kon1 = g.Row
'' определение последней строки на Sheet3
Set r = Range("A3:A300")
Set g = r.Find(What:="")
kon2 = g.Row
''Определяем массивчик нужной размерности
Dim m1(3 To 20000) As Variant
Dim m2(1 To 50, 1 To 2) As Variant
''Загружаем таблицу соответствий в массив М2
For i = 1 To kon2
m2(i, 1) = Range("A" & i)
m2(i, 2) = Range("B" & i)
Next i
''Загружаем длинные номера в массив М1
For i = 3 To kon1
m1(i) = ActiveSheet.Range("A" & i)
Next i
''Сравниваем
For i = 3 To kon1
For j = 1 To kon2
If m2(j, 2) = m1(i) Then m1(i) = m2(j, 1)
Next j
Next i
''вставляем на место длинных короткие
For i = 3 To kon1
ActiveSheet.Range("A" & i) = m1(i)
Next i
MsgBox ("ГОТОВО!!!")
End Sub

У меня получилось около 5 секунд на P366 !!!
Большое всем спасибо !
...
Рейтинг: 0 / 0
12.10.2005, 18:18:12
    #33320998
talgat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
Ну вы только прикиньте, что значит ФОРУМ. С 1 часа с помощью Вас всех перешел на 5 секунд. Я просто балдею !
...
Рейтинг: 0 / 0
13.10.2005, 10:38:02
    #33321813
Letter_D
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
А еще рекомендуется ставить Exit For
Т.е. вместо
If m2(j, 2) = m1(i) Then m1(i) = m2(j, 1)
написать
If m2(j, 2) = m1(i) Then m1(i) = m2(j, 1) :Exit For
Совпадение уже найдено, зачем дальше сравнивать???

Будет еще быстрее, думаю я.
...
Рейтинг: 0 / 0
13.10.2005, 11:33:46
    #33322030
talgat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
Letter_DА еще рекомендуется ставить Exit For
Т.е. вместо
If m2(j, 2) = m1(i) Then m1(i) = m2(j, 1)
написать
If m2(j, 2) = m1(i) Then m1(i) = m2(j, 1) :Exit For
Совпадение уже найдено, зачем дальше сравнивать???

Будет еще быстрее, думаю я.

Нет не так. Совпадений может быть неизвестное кол-во раз. Т.е. с одного номера за месяц звонят не 1 раз.
...
Рейтинг: 0 / 0
13.10.2005, 11:37:57
    #33322047
sergeyvg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
а можно и текст процедуры подсократить:)

Private Sub CommandButton1_Click()
Dim kon1 As Long, kon2 As Long, i As Long, j As Long
''Определяем массивчик нужной размерности
Dim m1 As Variant, m2 As Variant
'' определение последней строки на Sheet1
Worksheets("Лист1").Activate
kon1 = ActiveSheet.Range("A3:A30000").Find(What:="").Row
'' определение последней строки на Sheet3
kon2 = Worksheets("Лист3").Range("A3:A300").Find(What:="").Row
''Загружаем таблицу соответствий в массив М2
m2 = Worksheets("Лист3").Range("A3:B" & kon2)
''Загружаем длинные номера в массив М1
m1 = ActiveSheet.Range("A3:A" & kon1)
''Сравниваем
For i = 1 To kon1 - 3
For j = 1 To kon2 - 3
If m2(j, 1) = m1(i, 1) Then m1(i, 1) = m2(j, 2)
Next j
Next i
''вставляем на место длинных короткие
ActiveSheet.Range("A3:A" & kon1) = m1
MsgBox ("ГОТОВО!!!")
End Sub
...
Рейтинг: 0 / 0
13.10.2005, 11:51:11
    #33322094
talgat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
sergeyvgа можно и текст процедуры подсократить:)
Точно так. Но на скорость это не влияет
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
29.03.2007, 19:19:00
    #34425811
KuskovS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
Можно ли реализовать такую же функцию поиска и замены, только чтобы поиск производился по части ячейке? Например: найти: *Аренда* Заменить: Аренда помещения.
...
Рейтинг: 0 / 0
29.03.2007, 19:33:55
    #34425841
f
f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
Подобную операцию СУБД делает за долю секунды.
...
Рейтинг: 0 / 0
29.03.2007, 20:07:51
    #34425907
KuskovS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
А в excel'e это возможно сделать? Какие СУБД делают такую операцию?
...
Рейтинг: 0 / 0
30.03.2007, 07:54:28
    #34426308
KuskovS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
Напишите пожалуйста, какие СУБД делают такие операции за секунды?! Т.е. мне надо, чтобы слова для поиска находились не в коде, а на отдельном листе. Например: на листе1, есть столбец который содержит по ячейкам разную информацию:одна ячейка - (бла..бла...Аренда..бла...бла), надо найти слово Аренда и заменить всю ячейку на слово Аренда. Все точно так как, вышеописанный код, но он не ищет по части ячейки. Помогите, если кто сталкивался.
...
Рейтинг: 0 / 0
30.03.2007, 09:36:33
    #34426460
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
нужно поменять значение LookAt:=xlWhole на LookAt:=xlPart тогда будет искать ячейку не целиком
...
Рейтинг: 0 / 0
30.03.2007, 10:15:58
    #34426586
f
f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
Любая СУБД быстро сделает такую операцию. Только они хранят
данные не на листах, как Excel, а в таблицах.
Именно это (благодаря табличным функциям и языку SQL) и
ускоряет обработку данных в десятки раз.
...
Рейтинг: 0 / 0
30.03.2007, 10:24:21
    #34426624
ВПР
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
talgat Подстановку т.е. замену длинных номеров на короткие делаю в лоб в цикле ( 2 цикла, один вложен в другой). Т.е. на втором листе таблица соответствия длинный короткому.

ребята, че ж Вы так себя мучаете - функцию ВПР() посмотри.
...
Рейтинг: 0 / 0
30.03.2007, 11:00:28
    #34426758
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подстановка значений
KuskovSА в excel'e это возможно сделать? Какие СУБД делают такую операцию?все, могут, это простое соединение таблиц. В access это вроде этого:

вариант для фрагмента строки
Код: plaintext
1.
SELECT ITEMS.ARTICLE
FROM GROUPS INNER JOIN ITEMS ON GROUPS.GROUPID LIKE "*" & ITEMS.GROUPID & "*";


вариант для полного соответсвия
Код: plaintext
1.
SELECT ITEMS.ARTICLE
FROM GROUPS INNER JOIN ITEMS ON GROUPS.GROUPID = ITEMS.GROUPID;
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Подстановка значений / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]