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


Ждешь то, о чем мечтаешь, а получишь - что заслужил!!!
...
Рейтинг: 0 / 0
массив макрос
    #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
массив макрос
    #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
массив макрос
    #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
массив макрос
    #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
массив макрос
    #36600998
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или может вместо
Cells(31, 2).Value = Cells(1, 3).Value
надо

Код: plaintext
1.
        Cells(cc.Row,  2 ).Value = Cells( 1 ,  3 ).Value
...
Рейтинг: 0 / 0
массив макрос
    #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
массив макрос
    #36601149
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Set - это задаёт диапазон. Просто = не работает.
2. For Each cc In DiaPazon - переведите на русский :) (что-то гугль спасовал... а на нерусский перевёл: "для каждого сс в DiaPazon". Так что считай значение задано.
...
Рейтинг: 0 / 0
массив макрос
    #36601190
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Угадайте, на какой язык переводилось

Код: plaintext
For Each ЦК Дыяпазон
...
Рейтинг: 0 / 0
массив макрос
    #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
массив макрос
    #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
массив макрос
    #36601387
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дословно: Если не найдено значение Fnd тогда ничего потом (если нашло)
значение ячейки (31, 2)= значение ячейки (1, 3). Правильно я понял???
Правильно, но немного не в том порядке получается:
Если диапазон Fnd (состоящий из одной ячейки) найден, то присваиваем ячейке [31, 2] значение ячейки [1, 3];
если нет - то ищем следующее значение.
...
Рейтинг: 0 / 0
массив макрос
    #36601409
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
Если (Fnd не ничего) то
Тоесть если Fnd определился.
Так имхо понятнее.
2. Задать Range из этих колонок, искать в этом Range, выводить Cells(1, Fnd.Column).Value
...
Рейтинг: 0 / 0
массив макрос
    #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
массив макрос
    #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
массив макрос
    #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
массив макрос
    #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
массив макрос
    #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
массив макрос
    #36605217
Фотография -O_o-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121,

Хоть убей не могу понять каким образом задать цикл для диапазонов поиска...
Подскажите ребята!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
массив макрос
    #36605239
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-O_o-, по каким диапазонам? Последний вариант не годится? Он правда ищет по всем диапазонам сразу - зачем тут цикл.
А фразой "тупо 2/3/сколько_нужно раз поставить цикл поиска" я так и подразумевал - тупо повторить немного изменённый код.
...
Рейтинг: 0 / 0
массив макрос
    #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
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / массив макрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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