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

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

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

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

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

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

Find использую в этой программке для определения конца списков ( распечатки и таблицы соответствия). А про findNext даже и не слыхал. Ща будем смотреть ! СпасибА !
...
Рейтинг: 0 / 0
Подстановка значений
    #33320790
Фотография talgat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу Find: использую при поиске так например
Set r = ActiveSheet.Range(B3:B1000")
Set g = r.Find(What:=искомое_значение)
А как используется FindNext ? В helpe чого то все о поиске файлов пишется.
Подскажитееее...
...
Рейтинг: 0 / 0
Подстановка значений
    #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
Подстановка значений
    #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
Подстановка значений
    #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
Подстановка значений
    #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
Подстановка значений
    #33320998
Фотография talgat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вы только прикиньте, что значит ФОРУМ. С 1 часа с помощью Вас всех перешел на 5 секунд. Я просто балдею !
...
Рейтинг: 0 / 0
Подстановка значений
    #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
Подстановка значений
    #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
Подстановка значений
    #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
Подстановка значений
    #33322094
Фотография talgat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergeyvgа можно и текст процедуры подсократить:)
Точно так. Но на скорость это не влияет
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Подстановка значений
    #34425811
KuskovS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли реализовать такую же функцию поиска и замены, только чтобы поиск производился по части ячейке? Например: найти: *Аренда* Заменить: Аренда помещения.
...
Рейтинг: 0 / 0
Подстановка значений
    #34425841
f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подобную операцию СУБД делает за долю секунды.
...
Рейтинг: 0 / 0
Подстановка значений
    #34425907
KuskovS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в excel'e это возможно сделать? Какие СУБД делают такую операцию?
...
Рейтинг: 0 / 0
Подстановка значений
    #34426308
KuskovS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Напишите пожалуйста, какие СУБД делают такие операции за секунды?! Т.е. мне надо, чтобы слова для поиска находились не в коде, а на отдельном листе. Например: на листе1, есть столбец который содержит по ячейкам разную информацию:одна ячейка - (бла..бла...Аренда..бла...бла), надо найти слово Аренда и заменить всю ячейку на слово Аренда. Все точно так как, вышеописанный код, но он не ищет по части ячейки. Помогите, если кто сталкивался.
...
Рейтинг: 0 / 0
Подстановка значений
    #34426460
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно поменять значение LookAt:=xlWhole на LookAt:=xlPart тогда будет искать ячейку не целиком
...
Рейтинг: 0 / 0
Подстановка значений
    #34426586
f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любая СУБД быстро сделает такую операцию. Только они хранят
данные не на листах, как Excel, а в таблицах.
Именно это (благодаря табличным функциям и языку SQL) и
ускоряет обработку данных в десятки раз.
...
Рейтинг: 0 / 0
Подстановка значений
    #34426624
ВПР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
talgat Подстановку т.е. замену длинных номеров на короткие делаю в лоб в цикле ( 2 цикла, один вложен в другой). Т.е. на втором листе таблица соответствия длинный короткому.

ребята, че ж Вы так себя мучаете - функцию ВПР() посмотри.
...
Рейтинг: 0 / 0
Подстановка значений
    #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
25 сообщений из 30, страница 1 из 2
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Подстановка значений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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