Подскажите, пожалуйста, как решить задачу. Есть данные (пример во вложении), нужно данные на листе 1 загнать в массив и из этого массива по условиям на листе 2 вывести значения в столбец G. Например, если в массиве столбец 1 равен условию на втором листе в столбце B и столбец 2 из массива равен условию на листе 2 из столбца С и т. д. то выводится значение в стоблец G. Для первого варианта ответ 100, для второго 170. Значения в столбцах на первом листе могут повторяться, но все пять значений одновременно они уникальны. Спасибо за любой совет.
Здравствуйте,
Подскажите, пожалуйста, как решить задачу. Есть данные (пример во вложении), нужно данные на листе 1 загнать в массив и из этого массива по условиям на листе 2 вывести значения в столбец G. Например, если в массиве столбец 1 равен условию на втором листе в столбце B и столбец 2 из массива равен условию на листе 2 из столбца С и т. д. то выводится значение в стоблец G. Для первого варианта ответ 100, для второго 170. Значения в столбцах на первом листе могут повторяться, но все пять значений одновременно они уникальны. Спасибо за любой совет.Bregra1
неправда Ваша :) коды символов для Условия1: 65 и 192 Pelena, видать за Вас отредактировала, и в примере привели совпадающие наборы строки 5-6 и последние 4строки совпадают.
неправда Ваша :) коды символов для Условия1: 65 и 192 Pelena, видать за Вас отредактировала, и в примере привели совпадающие наборы строки 5-6 и последние 4строки совпадают.
Предлагаю такой вариант, пример во вложении. Даже если будет ошибка уникальности - возьмёт первое попавшееся значение при просмотре строк сверху вниз.
[vba]
Код
Sub Transition() Dim A, B, i&, j&, k& A = ThisWorkbook.Worksheets(1).Cells(1, 1).CurrentRegion B = ThisWorkbook.Worksheets(2).Cells(1, 1).CurrentRegion For j = 2 To UBound(B, 1) For i = 2 To UBound(A, 1) For k = 1 To 5 If A(i, k) <> B(j, k + 1) Then Exit For Next k If k = 6 Then B(j, k + 1) = A(i, k) Exit For End If Next i Next j ThisWorkbook.Worksheets(2).Cells(1, 1).CurrentRegion.Value = B End Sub
[/vba]
Bregra1, здравствуйте.
Предлагаю такой вариант, пример во вложении. Даже если будет ошибка уникальности - возьмёт первое попавшееся значение при просмотре строк сверху вниз.
[vba]
Код
Sub Transition() Dim A, B, i&, j&, k& A = ThisWorkbook.Worksheets(1).Cells(1, 1).CurrentRegion B = ThisWorkbook.Worksheets(2).Cells(1, 1).CurrentRegion For j = 2 To UBound(B, 1) For i = 2 To UBound(A, 1) For k = 1 To 5 If A(i, k) <> B(j, k + 1) Then Exit For Next k If k = 6 Then B(j, k + 1) = A(i, k) Exit For End If Next i Next j ThisWorkbook.Worksheets(2).Cells(1, 1).CurrentRegion.Value = B End Sub
Rioran, все отлично работает, спасибо, поясните пожалуйста только, как мне в макросе в условии отбора написать адрес ячейки. Т. е. чтобы первое условие равнялось Сеlls(2,2) или Range("B2"), чтобы второе условие равнялось Сеlls(2,3) или Range("C2"). Мне пока сложновато понимать код макроса. Спасибо.
Rioran, все отлично работает, спасибо, поясните пожалуйста только, как мне в макросе в условии отбора написать адрес ячейки. Т. е. чтобы первое условие равнялось Сеlls(2,2) или Range("B2"), чтобы второе условие равнялось Сеlls(2,3) или Range("C2"). Мне пока сложновато понимать код макроса. Спасибо.Bregra1
вот сделал с ловлей ошибок, правда диапазоны жёстко прописал [vba]
Код
Option Explicit Public Sub test() Dim arr1() Dim i As Integer, j%, k%, buffRaw% Dim buffBool As Boolean Dim buff2 As Byte Const strL1 = "Лист1" Const strL2 = "Лист2"
With Worksheets(strL1) arr1 = .Range("A2:F13").Value End With With Worksheets(strL2) For i = 2 To 4 buff2 = 0 For j = 1 To UBound(arr1) buffBool = True For k = 1 To 5 buffBool = (buffBool And arr1(j, k) = .Cells(i, k + 1).Value) Next k If buffBool Then buff2 = buff2 + 1 buffRaw = j End If Next j Select Case buff2 Case 0 .Cells(i, 7).Value = "Not Find" Case 1 .Cells(i, 7).Value = arr1(buffRaw, 6)
Case Else .Cells(i, 7).Value = "doubles"
End Select Next i End With
[/vba]
вот сделал с ловлей ошибок, правда диапазоны жёстко прописал [vba]
Код
Option Explicit Public Sub test() Dim arr1() Dim i As Integer, j%, k%, buffRaw% Dim buffBool As Boolean Dim buff2 As Byte Const strL1 = "Лист1" Const strL2 = "Лист2"
With Worksheets(strL1) arr1 = .Range("A2:F13").Value End With With Worksheets(strL2) For i = 2 To 4 buff2 = 0 For j = 1 To UBound(arr1) buffBool = True For k = 1 To 5 buffBool = (buffBool And arr1(j, k) = .Cells(i, k + 1).Value) Next k If buffBool Then buff2 = buff2 + 1 buffRaw = j End If Next j Select Case buff2 Case 0 .Cells(i, 7).Value = "Not Find" Case 1 .Cells(i, 7).Value = arr1(buffRaw, 6)
Хотел бы уточнить, условия отбора будут не подряд, а например первое условие в ячейки A1, второе условие в ячейки U15, третье условие в ячейке D8
Хотел бы уточнить, условия отбора будут не подряд, а например первое условие в ячейки A1, второе условие в ячейки U15, третье условие в ячейке D8Bregra1
Udik, извините) Думал, что в коде будут прописаны адреса и я смогу адреса условий поменять на свои. Мне казалось, что в макросе будут прописаны условия отбора для каждого столбца массива) Но сейчас поразбираюсь, может получиться ваш код как то преобразовать. Спасибо за помочь.
Udik, извините) Думал, что в коде будут прописаны адреса и я смогу адреса условий поменять на свои. Мне казалось, что в макросе будут прописаны условия отбора для каждого столбца массива) Но сейчас поразбираюсь, может получиться ваш код как то преобразовать. Спасибо за помочь.Bregra1
Bregra1, зачастую структура исходных данных значительно влияет на способ решения. В моём варианте был расчёт, что все условия идут подряд друг за другом. Если же условия могут находится в разнесённых друг от друга столбцах, то можно либо их сгруппировать в одном месте для применения моего кода, либо ввести дополнительный массив-указатель, определяющий номера столбцов с условиями.
Если в коде что-то не понятно - готов пояснить.
Поддерживаю товарища Udik'а, форумчанам будет гораздо удобнее отвечать на Ваши вопросы, если они будут чётко сформулированы, максимально близко к реальной задаче.
Bregra1, зачастую структура исходных данных значительно влияет на способ решения. В моём варианте был расчёт, что все условия идут подряд друг за другом. Если же условия могут находится в разнесённых друг от друга столбцах, то можно либо их сгруппировать в одном месте для применения моего кода, либо ввести дополнительный массив-указатель, определяющий номера столбцов с условиями.
Если в коде что-то не понятно - готов пояснить.
Поддерживаю товарища Udik'а, форумчанам будет гораздо удобнее отвечать на Ваши вопросы, если они будут чётко сформулированы, максимально близко к реальной задаче.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Неправильно поставил задачу,извините. А можно ли написать код в котором в массив записываются данные с листа 1 и после значения выбираются по условию, например если объединенные значения 5 столбцов массива равны значению a1&s10&b4&f1&b1 или чтобы циклом каждый столбец массива сравнивался с определенной ячейкой. Спасибо
Неправильно поставил задачу,извините. А можно ли написать код в котором в массив записываются данные с листа 1 и после значения выбираются по условию, например если объединенные значения 5 столбцов массива равны значению a1&s10&b4&f1&b1 или чтобы циклом каждый столбец массива сравнивался с определенной ячейкой. СпасибоBregra1
У меня сейчас такой алгоритм: считываем в массив основную табличку, потом каждую строку проверяемой сравниваем с каждой "строкой" массива. Непонятно что Вы хотите поменять.
У меня сейчас такой алгоритм: считываем в массив основную табличку, потом каждую строку проверяемой сравниваем с каждой "строкой" массива. Непонятно что Вы хотите поменять.Udik
вот вам барабан яд 41001231307558 wm R419131876897 udik1968@gmail.com
buffBool And arr1(j, k) — это произвольно выдранный вами из кода набор символов, а buffBool And arr1(j, k) = .Cells(i, k + 1).Value проверка того, что предыдущий массив совпадает с текущим.
buffBool And arr1(j, k) — это произвольно выдранный вами из кода набор символов, а buffBool And arr1(j, k) = .Cells(i, k + 1).Value проверка того, что предыдущий массив совпадает с текущим.StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.
buffBool = (buffBool And arr1(j, k) = .Cells(i, k + 1).Value)
[/vba] запоминает результат логического умножения buffBool и результата сравнения очередного столбца листа и очередного "столбца" массива. Это чтобы ручками не писать пять проверок в одном операторе, засунуто в цикл. В принципе при первом False можно выходить из цикла, но это уже оптимизация кода.
строка [vba]
Код
buffBool = (buffBool And arr1(j, k) = .Cells(i, k + 1).Value)
[/vba] запоминает результат логического умножения buffBool и результата сравнения очередного столбца листа и очередного "столбца" массива. Это чтобы ручками не писать пять проверок в одном операторе, засунуто в цикл. В принципе при первом False можно выходить из цикла, но это уже оптимизация кода.Udik
вот вам барабан яд 41001231307558 wm R419131876897 udik1968@gmail.com