Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 09.06.2011
Сообщений: 7
1

Использование цикла в .find

09.06.2011, 18:52. Показов 4762. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Столкнулся с необходимостью совмещения двух таблиц с одинаковой номенклатурой, но разными показателями. Для удобства взял первую за основу, куда посредством макроса решил перетянуть нехватающие сведения. Вроде бы ничто сложностей не предвещало... Хотел сделать поиск, перебирая в цикле наименования, затем, посредством Mid () выуживать номер строки с результатом, ну и копировать, что нужно. Код получился следующим:
Sub sootv()
Dim n
Dim i As Integer
Dim chto
Dim sht As Worksheet, ipr As Worksheet
Dim y As Range
Set sht = Workbooks("Копия.xlsm").Worksheets("База")
Set ipr = Workbooks("Копия.xlsm").Worksheets("Лист1")
For i = 1 To 13000
If sht.Cells(i, 3).Interior.ColorIndex = sht.Cells(44, 3).Interior.ColorIndex Then 'соответствие заливки шаблону
chto = sht.Cells(i, 7).Value
With Workbooks("копия.xlsm").Worksheets("Лист1").Columns(6)
Set y = .Cells.Find(chto)
If Not y Is Nothing Then
n = Mid(y.Address, (InStr(2, y.Address, "$") + 1)) 'получаю номер искомой строки
sht.Cells(i, 46).Value = ipr.Cells(n, 91).Value
sht.Cells(i, 47).Value = ipr.Cells(n, 93).Value
sht.Cells(i, 48).Value = ipr.Cells(n, 94).Value
sht.Cells(i, 49).Value = ipr.Cells(n, 95).Value
sht.Cells(i, 50).Value = ipr.Cells(n, 96).Value
End If
End With
End If
Next i
End Sub

(обе таблицы в одной книге на разных листах- пилотный вариант, в жизни это будут в разных)

При попытке запуска Basic выдает ошибку 13 Type mismatch на
"Set y = .Cells.Find(chto)". Подскажите пожалуйста, в чем может быть дело.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2011, 18:52
Ответы с готовыми решениями:

Использование метода Find
Уважаемые программисты. Подскажите пожалуйста. У меня в коде встречается такая вот строчка: ...

Использование функции find
Здравствуйте, решил начать осваивать работу с 3d графикой в матлаб Покажите, как можно с помощью...

Использование цикла
Что-то не могу врубиться как сделать проверку на все числа от 0 до 9, понятно, что можно на каждую...

Использование цикла FOR..
Помогите с заданиями уже неделю мучаюсь над ними, чуть обьяснят материал и делай как хочешь дальше...

17
1389 / 530 / 67
Регистрация: 10.04.2009
Сообщений: 8,724
09.06.2011, 19:08 2
Цитата Сообщение от DmitriySA Посмотреть сообщение
Cells
если не ошибаюсь Cells (********)
** - заменить на нужное
1
0 / 0 / 0
Регистрация: 09.06.2011
Сообщений: 7
09.06.2011, 20:10  [ТС] 3
Cells вообще удалил- он от безысходности там появился =) А ларчик просто открывался- длина искомых значений просто на просто превышала допустимую для Find. Решил ограничиться 150 символами: chto = Left(CStr(sht.Cells(i, 7).Value), 150).
0
1389 / 530 / 67
Регистрация: 10.04.2009
Сообщений: 8,724
09.06.2011, 20:15 4
Цитата Сообщение от DmitriySA Посмотреть сообщение
просто на просто превышала допустимую для Find.
и какая же допустимая???

Добавлено через 1 минуту
Цитата Сообщение от DmitriySA Посмотреть сообщение
Left(CStr(sht.Cells(i, 7).Value), 150)
это первые 150 знаков ячейки??
0
0 / 0 / 0
Регистрация: 09.06.2011
Сообщений: 7
09.06.2011, 20:36  [ТС] 5
Получается 255 символов- максимум. Да, первые 150 знаков.
0
1389 / 530 / 67
Регистрация: 10.04.2009
Сообщений: 8,724
09.06.2011, 20:40 6
Получается 255 символов
не знал, просто нужды не было
а что Мид не устраивает
0
1563 / 364 / 100
Регистрация: 13.11.2008
Сообщений: 754
09.06.2011, 20:44 7
Учитесь явно указывать все аргументы:
Visual Basic
1
Set y = .Find(chto,,xlValues,xlWhole)
Т.е. ищем в значениях ячеек и просматриваем значение ячейки целиком.
Visual Basic
1
2
3
'n = Mid(y.Address, (InStr(2, y.Address, "$") + 1)) 'получаю номер искомой строки
'Лучше получать номер строки так:
n = y.Row
Цикл лучше делать только по заполненным ячейкам, а не по всем:
Visual Basic
1
2
'For i = 1 To 13000
For i = 1 To sht.Cells(sht.rows.count,7).End(xlUp).row
Короче, у меня бы получилось так:
Visual Basic
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
Sub sootv()
    Dim n
    Dim i As Long, lColor As Long
    Dim chto
    Dim sht As Worksheet, ipr As Worksheet
    Dim y As Range
    Set sht = Workbooks("Копия.xlsm").Worksheets("База")
    Set ipr = Workbooks("Копия.xlsm").Worksheets("Лист1")
    lColor = sht.Cells(44, 3).Interior.ColorIndex
    For i = 1 To sht.Cells(sht.Rows.Count, 7).End(xlUp).Row
        If sht.Cells(i, 3).Interior.ColorIndex = lColor Then    'соответствие заливки шаблону
            chto = sht.Cells(i, 7).Value
            With ipr
                Set y = .Columns(6).Find(chto, , xlValues, xlWhole)
                If Not y Is Nothing Then
                    n = y.Row    'получаю номер искомой строки
                    sht.Cells(i, 46).Value = ipr.Cells(n, 91).Value
                    sht.Cells(i, 47).Value = ipr.Cells(n, 93).Value
                    sht.Cells(i, 48).Value = ipr.Cells(n, 94).Value
                    sht.Cells(i, 49).Value = ipr.Cells(n, 95).Value
                    sht.Cells(i, 50).Value = ipr.Cells(n, 96).Value
                End If
            End With
        End If
    Next i
End Sub
1
0 / 0 / 0
Регистрация: 09.06.2011
Сообщений: 7
09.06.2011, 20:50  [ТС] 8
Эм, в силу своего дилетантства воспользовался первым пришедшим на ум- left =) Если посоветуете как код сделать рациональнее буду очень признателен.

Добавлено через 2 минуты
The_Prist, спасибо!
0
1389 / 530 / 67
Регистрация: 10.04.2009
Сообщений: 8,724
09.06.2011, 20:54 9
если следовать строго заданию, то и от цифирок 46-50 и 91-96 надо избавится
0
0 / 0 / 0
Регистрация: 09.06.2011
Сообщений: 7
09.06.2011, 21:05  [ТС] 10
Дело в том, что таблицы строго унифицированы, и прорабатывать логику нахождения соответствующих граф незачем, их номера являются константами.
0
1563 / 364 / 100
Регистрация: 13.11.2008
Сообщений: 754
09.06.2011, 21:05 11
Кстати, если поиск организовать на массивах - будет и быстрее и без всяких MID.
А если уж с Mid, то строку надо так сделать, наверное:
Visual Basic
1
chto = Mid(sht.Cells(i, 7).Value,1,254) & "*"
Это применимо для кода, который я выложил.
1
1389 / 530 / 67
Регистрация: 10.04.2009
Сообщений: 8,724
09.06.2011, 21:28 12
Цитата Сообщение от DmitriySA Посмотреть сообщение
строго унифицированы, и прорабатывать логику нахождения соответствующих граф незачем
рад за Вас
у меня такое редко бывает строго унифицированное как правило приходится деунифицировать
Ну ничего поменяете потом

Добавлено через 11 минут
на седьмой строке кода в седьмом сообщении у меня так:
Visual Basic
1
Set sht = Workbooks("Book.xlsm").Worksheets("Sheet1")
ошибка 9 выход за пределы Рэнжа
???????
0
1563 / 364 / 100
Регистрация: 13.11.2008
Сообщений: 754
09.06.2011, 21:40 13
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
на седьмой строке кода в седьмом сообщении у меня так:
Visual Basic
1
Set sht = Workbooks("Book.xlsm").Worksheets("Sheet1")
ошибка 9 выход за пределы Рэнжа
???????
А книга "Book.xlsm" существует? А она открыта? Если да - лист "Sheet1" в ней есть?
Готов поспорить, что нет либо одного из перечисленного, либо всего вместе.
0
1389 / 530 / 67
Регистрация: 10.04.2009
Сообщений: 8,724
09.06.2011, 21:55 14
ой не надо спорить, Вы правы
0
0 / 0 / 0
Регистрация: 09.06.2011
Сообщений: 7
09.06.2011, 23:05  [ТС] 15
The_Prist, а у Вас случаем не найдется примера поиска в массиве, или чего-либо схожего? Не имел дела с массивами, а с нуля тяжко начинать. Нынешний вариант, при всех плюсах, действительно работает достаточно медленно, так что возможность ускорение процесса очень актуальна
0
695 / 236 / 18
Регистрация: 17.01.2011
Сообщений: 583
Записей в блоге: 1
10.06.2011, 01:05 16
А файл с данными выложить слабо ?
Или мы сделаем, а Вы потом скажете: у меня столбцы не в таком порядке расположены ?? :black_eye.:
0
1563 / 364 / 100
Регистрация: 13.11.2008
Сообщений: 754
10.06.2011, 10:40 17
Цитата Сообщение от DmitriySA Посмотреть сообщение
The_Prist, а у Вас случаем не найдется примера поиска в массиве, или чего-либо схожего? Не имел дела с массивами, а с нуля тяжко начинать. Нынешний вариант, при всех плюсах, действительно работает достаточно медленно, так что возможность ускорение процесса очень актуальна
Если честно, то у меня если и есть примеры с массивами - то Вы ни фига в них не поймете, раз работать с ними не умеете. И можно было бы догадаться, что помочь Вам с ВАШИМИ файлами проще. Посему переделал макрос наугад, исходя из одного только Вашего кода:
Visual Basic
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
Sub sootv_arr()
    Dim avArrFindIn, li As Long
    Dim avTmpArr(1 To 5)
    Dim i As Long, lColor As Long
    Dim chto
    Dim sht As Worksheet
    Set wsFindIn = Workbooks("Копия.xlsm").Worksheets("База")
    'заносим данные листа в массив
    avArrFindIn = Workbooks("копия.xlsm").Worksheets("Лист1").UsedRange.Value
    For i = 1 To sht.Cells(sht.Rows.Count, 7).End(xlUp).Row
        If sht.Cells(i, 3).Interior.ColorIndex = lColor Then 'соответствие заливки шаблону
            chto = sht.Cells(i, 7).Value
            For li = LBound(avArrFindIn, 1) To UBound(avArrFindIn, 1)
                If chto = avArrFindIn(li, 6) Then
                'заносим во временый массив данные
                    avTmpArr(1) = avArrFindIn(li, 91)
                    avTmpArr(2) = avArrFindIn(li, 93)
                    avTmpArr(3) = avArrFindIn(li, 94)
                    avTmpArr(4) = avArrFindIn(li, 95)
                    avTmpArr(5) = avArrFindIn(li, 96)
                    'записываем данные из массива на лист
                    sht.Cells(i, 46).Resize(, 5).Value = avTmpArr
                    Exit For
                End If
            Next li
        End If
    Next i
End Sub
Рабирайтесь.
1
0 / 0 / 0
Регистрация: 09.06.2011
Сообщений: 7
10.06.2011, 11:24  [ТС] 18
Благодарю!
0
10.06.2011, 11:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.06.2011, 11:24
Помогаю со студенческими работами здесь

использование цикла
Помогите с алгоритмом, плз Используя цикл, написать программу, обеспечивающую ввод n...

Использование цикла while
Дано натуральное число. Определить номер цифры 8 в нем, считая от конца числа. Если такой цифры...

Использование цикла while
Доброго времени суток! Подскажите пожалуйста можно ли организовать последовательный переход от...

Использование цикла for
Добрый день. Подскажите как мне хорошо разобраться с цыком for.:help: Я понимаю самое элементарное,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru