Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / массив макрос / 21 сообщений из 21, страница 1 из 1
27.04.2010, 14:20
    #36600697
-O_o-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
Добрый день, уважаемые Гуру.
Нуждаюсь в помощи и объяснениях.
На сегодняшний день я столкнулся с задачей которую хочу решить именно макросом. Не знаю как задать поиск по массивам определенного значения. Помогите примерами и комментариями.
Пример в приложении.


Ждешь то, о чем мечтаешь, а получишь - что заслужил!!!
...
Рейтинг: 0 / 0
27.04.2010, 15:55
    #36600958
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
-O_o-,
Вроде так лучше:
Код: plaintext
1.
2.
3.
4.
5.
Dim i As Long ' Variant
Dim Iskomoe  As String 'Integer 'искомое значение
Dim DiaPazon As Range 'Integer 'диапазон
'Dim x As Integer

а во-вторых, я не понял, что где искать - значения из А в С?
...
Рейтинг: 0 / 0
27.04.2010, 16:02
    #36600973
-O_o-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
Hugo121-O_o-,
Вроде так лучше:
Код: plaintext
1.
2.
3.
4.
5.
Dim i As Long ' Variant
Dim Iskomoe  As String 'Integer 'искомое значение
Dim DiaPazon As Range 'Integer 'диапазон
'Dim x As Integer

а во-вторых, я не понял, что где искать - значения из А в С?
Да, найти совпадение А в С и вывести если совпало значение (С1) в ячейку (В31). Но я сейчас пытаюсь понять как сделать это в цикле... перебора. Подскажите пожалуйста.
...
Рейтинг: 0 / 0
27.04.2010, 16:03
    #36600976
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
И вообще тогда так, лишнего было много
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub pioisk2()
Dim DiaPazon As Range 'диапазон
Dim cc As Range, Fnd As Object

Set DiaPazon = [a31:a49]

For Each cc In DiaPazon
Set Fnd = ThisWorkbook.Sheets( 1 ).Columns( 3 ).Find(cc.Value, , xlValues, xlWhole)
  If Not Fnd Is Nothing Then
    Debug.Print Fnd.Address
  End If
Next
End Sub
...
Рейтинг: 0 / 0
27.04.2010, 16:06
    #36600990
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
Так?
Код: plaintext
1.
2.
3.
4.
5.
6.
For Each cc In DiaPazon
Set Fnd = ThisWorkbook.Sheets( 1 ).Columns( 3 ).Find(cc.Value, , xlValues, xlWhole)
        If Not Fnd Is Nothing Then
        Cells( 31 ,  2 ).Value = Cells( 1 ,  3 ).Value
        End If
Next
...
Рейтинг: 0 / 0
27.04.2010, 16:08
    #36600998
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
Или может вместо
Cells(31, 2).Value = Cells(1, 3).Value
надо

Код: plaintext
1.
        Cells(cc.Row,  2 ).Value = Cells( 1 ,  3 ).Value
...
Рейтинг: 0 / 0
27.04.2010, 16:36
    #36601087
-O_o-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
2 Hugo121,

Вот 3-й вариант хорош. Но у меня вопрос есть.
1-й: Set DiaPazon = [a31:a49] что делает эта команда?
2-й: For Each cc In DiaPazon - мы ищим переменную cc в заданном диапазоне. Но для cc не задано же значение, что он искать будет?
3-й:
Код: plaintext
1.
2.
If Not Fnd Is Nothing Then
        Cells( 31 ,  2 ).Value = Cells( 1 ,  3 ).Value
        End If
Объясните пожалуйста. Как оно работет. Спасибо.
...
Рейтинг: 0 / 0
27.04.2010, 16:50
    #36601149
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
1. Set - это задаёт диапазон. Просто = не работает.
2. For Each cc In DiaPazon - переведите на русский :) (что-то гугль спасовал... а на нерусский перевёл: "для каждого сс в DiaPazon". Так что считай значение задано.
...
Рейтинг: 0 / 0
27.04.2010, 17:01
    #36601190
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
Угадайте, на какой язык переводилось

Код: plaintext
For Each ЦК Дыяпазон
...
Рейтинг: 0 / 0
27.04.2010, 17:10
    #36601233
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
...у меня вопрос есть.
1-й: Set DiaPazon = [a31:a49] что делает эта команда?
2-й: For Each cc In DiaPazon - мы ищим переменную cc в заданном диапазоне. Но для cc не задано же значение, что он искать будет?
3-й:
Код: plaintext
1.
If Not Fnd Is Nothing Then
...

-O_o-, все три Ваших вопроса имеют отношение к объектным переменным (переменным типа Object)

1. Переменной DiaPazon (тип объект-диапазон) присваивается ссылка на диапазон [a31:a49].
При присвоении ссылки объектным переменным используется оператор Set.

2. Для наглядности лучше переписать строку так
Код: plaintext
For Each cc In DiaPazon.Cells
Перебираем в цикле все ячейки диапазона [a31:a49].

3. Здесь проверяется, содержит ли объектная переменная ссылку на объект, т.е. инициализирована ли она. Сравните с аналогичной проверкой для обычной переменной:
Код: plaintext
If IsEmpty(Переменная) then
...
Рейтинг: 0 / 0
27.04.2010, 17:47
    #36601342
-O_o-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
2 vlth and Hugo121

Спасибо вам за объяснения. Но я вот еще чего не понял...
Код: plaintext
1.
If Not Fnd Is Nothing Then
        Cells( 31 ,  2 ).Value = Cells( 1 ,  3 ).Value
Дословно: Если не найдено значение Fnd тогда ничего потом (если нашло)
значение ячейки (31, 2)= значение ячейки (1, 3). Правильно я понял???
И вопрос еще один. Как сделать так, что бы он еще и по массивам прошелся??? и вівел значение других массивов?
То есть
Код: plaintext
Set Fnd = ThisWorkbook.Sheets( 1 ).Columns( 3 ).Find(cc.Value, , xlValues, xlWhole)
Код: plaintext
Set Fnd = ThisWorkbook.Sheets( 1 ).Columns( 4 ).Find(cc.Value, , xlValues, xlWhole)
Код: plaintext
Set Fnd = ThisWorkbook.Sheets( 1 ).Columns(...n).Find(cc.Value, , xlValues, xlWhole)
...
Рейтинг: 0 / 0
27.04.2010, 18:03
    #36601387
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
Дословно: Если не найдено значение Fnd тогда ничего потом (если нашло)
значение ячейки (31, 2)= значение ячейки (1, 3). Правильно я понял???
Правильно, но немного не в том порядке получается:
Если диапазон Fnd (состоящий из одной ячейки) найден, то присваиваем ячейке [31, 2] значение ячейки [1, 3];
если нет - то ищем следующее значение.
...
Рейтинг: 0 / 0
27.04.2010, 18:11
    #36601409
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
Код: plaintext
Если (Fnd не ничего) то
Тоесть если Fnd определился.
Так имхо понятнее.
2. Задать Range из этих колонок, искать в этом Range, выводить Cells(1, Fnd.Column).Value
...
Рейтинг: 0 / 0
27.04.2010, 18:17
    #36601430
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Dim oCol As Range, oCell As Range, Fnd As Range
With ThisWorkbook.Sheets( 1 )
    For Each oCol In Range(.Columns( 1 ), .Columns( 4 )).Columns
        For Each oCell In DiaPazon.Cells
            Set Fnd = .Find(cc, , xlValues, xlWhole)
            ...
        Next oCell
    Next oCol
End With
...
Рейтинг: 0 / 0
27.04.2010, 18:26
    #36601453
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
Пардон, вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim i As Integer, n As Integer, oCell As Range, Fnd As Range
n =  4 
For i =  1  To n
    With ThisWorkbook.Sheets( 1 ).Columns(i)
            For Each oCell In DiaPazon.Cells
                Set Fnd = .Find(cc, , xlValues, xlWhole)
                ...
            Next oCell
    End With
Next i
...
Рейтинг: 0 / 0
27.04.2010, 20:09
    #36601601
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Sub poisk2()
Dim DiaPazon As Range, ForFun As Range 'äčąļąēīķ
Dim cc As Range, Fnd As Object

Set DiaPazon = [a31:a49]
Set ForFun = [c2:d49]

For Each cc In DiaPazon
Set Fnd = ForFun.Find(cc.Value, , xlValues, xlWhole)
  If Not Fnd Is Nothing Then
  Cells(cc.Row,  2 ).Value = Cells( 1 , Fnd.Column).Value

  End If
Next
End Sub
...
Рейтинг: 0 / 0
28.04.2010, 15:07
    #36603186
-O_o-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
Hugo121
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Sub poisk2()
Dim DiaPazon As Range, ForFun As Range 'äčąļąēīķ
Dim cc As Range, Fnd As Object

Set DiaPazon = [a31:a49]
Set ForFun = [c2:d49]

For Each cc In DiaPazon
Set Fnd = ForFun.Find(cc.Value, , xlValues, xlWhole)
  If Not Fnd Is Nothing Then
  Cells(cc.Row,  2 ).Value = Cells( 1 , Fnd.Column).Value

  End If
Next
End Sub

Да, спасибо вы все правильно поняли кроме одного.
Значение D1 нужно вносить в С31:С49... А не в В31:В49. Как это сделать?
...
Рейтинг: 0 / 0
28.04.2010, 15:23
    #36603226
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
-O_o-,
можно анализировать Fnd.Column, а можно тупо 2/3/сколько_нужно раз поставить цикл поиска по разным диапазонам, соотв. меняя двойку в Cells(cc.Row, 2).Value.
Но лучше первый вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Sub poisk2()
Dim DiaPazon As Range, ForFun As Range 'диапазон
Dim cc As Range, Fnd As Object

Set DiaPazon = [a31:a49]
Set ForFun = [c2:d49]

For Each cc In DiaPazon
Set Fnd = ForFun.Find(cc.Value, , xlValues, xlWhole)
  If Not Fnd Is Nothing Then
  Cells(cc.Row, Fnd.Column -  1 ).Value = Cells( 1 , Fnd.Column).Value

  End If
Next
End Sub
...
Рейтинг: 0 / 0
29.04.2010, 13:56
    #36605217
-O_o-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
Hugo121,

Хоть убей не могу понять каким образом задать цикл для диапазонов поиска...
Подскажите ребята!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
29.04.2010, 14:03
    #36605239
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
-O_o-, по каким диапазонам? Последний вариант не годится? Он правда ищет по всем диапазонам сразу - зачем тут цикл.
А фразой "тупо 2/3/сколько_нужно раз поставить цикл поиска" я так и подразумевал - тупо повторить немного изменённый код.
...
Рейтинг: 0 / 0
29.04.2010, 14:15
    #36605272
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив макрос
А можно так задать цикл по ячейкам заранее заданных диапазонов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Option Explicit

Sub test4Dia()
Dim DiaPazon As Range, ForFun As Range, ForFun2 As Range ' диапазоны
Dim cc As Range
Dim arr(), i As Long

Set DiaPazon = [a1:a9]
Set ForFun = [c2:d15]
Set ForFun2 = [b2:d10]

arr = Array(DiaPazon, ForFun, ForFun2)

For i =  0  To UBound(arr)
    For Each cc In arr(i)
        Debug.Print cc.Address
    Next
Next

End Sub
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / массив макрос / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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