Добрый день, впервые на вашем форуме и, к сожалению, вынужден просить совета или ответа. Необходимо решить с помощью макроса следующую проблему. Уважаемые форумчане, прочёл на форуме про сравнение двумерных массивов и вывод совпадений и несовпадений. Однако мне не совсем понятно, как при совпадении на 1 листе можно перезаписать данные баллами рядом. С массивами я только начал разбираться, так что прошу прощения за нарушение логики. Буду благодарен за любые подсказки. Прилагаю код и файл. Заранее благодарен за ответ.
[vba]
Код
' тут происходит транспонирование с листа "+++++" на лист result Const Lines = 8, SpaceLine = 5, Col = 3 Dim endRow&, startRow&, cRow&, resRow& endRow = pluslist.Cells(pluslist.Rows.Count, Col).End(xlUp).Row resRow = 1
For startRow = 5 To endRow Step Lines If startRow + Lines > endRow Then cRow = endRow - startRow + 1 Else cRow = Lines resultlist.Cells(resRow, 1).Resize(Col, cRow).Value = _ WorksheetFunction.Transpose(pluslist.Cells(startRow, 1).Resize(cRow, Col).Value) resRow = resRow + Col + SpaceLine Next resultlist.Select End If
'тут сравнение массивов и должна быть перезапись значениями Dim A(), C() As Boolean Dim k, l As string ReDim Preserve A(resultlist.Cells(Rows.Count, 1).End(xlUp).Row, Lines) ReDim Preserve C(criterialist.Cells(Rows.Count, 1).End(xlUp).Row, criterialist.Cells(2, Columns.Count).End(xlToLeft).Column) For k = 1 To Lines For l = 1 To 4 If A(8, k) = C(7, l) Then resultlist.Cells(l, k).Value = criterialist.Cells(k, l + 1).Value k = k + 1 l = l + 2 End If Next l Next k
[/vba]
Добрый день, впервые на вашем форуме и, к сожалению, вынужден просить совета или ответа. Необходимо решить с помощью макроса следующую проблему. Уважаемые форумчане, прочёл на форуме про сравнение двумерных массивов и вывод совпадений и несовпадений. Однако мне не совсем понятно, как при совпадении на 1 листе можно перезаписать данные баллами рядом. С массивами я только начал разбираться, так что прошу прощения за нарушение логики. Буду благодарен за любые подсказки. Прилагаю код и файл. Заранее благодарен за ответ.
[vba]
Код
' тут происходит транспонирование с листа "+++++" на лист result Const Lines = 8, SpaceLine = 5, Col = 3 Dim endRow&, startRow&, cRow&, resRow& endRow = pluslist.Cells(pluslist.Rows.Count, Col).End(xlUp).Row resRow = 1
For startRow = 5 To endRow Step Lines If startRow + Lines > endRow Then cRow = endRow - startRow + 1 Else cRow = Lines resultlist.Cells(resRow, 1).Resize(Col, cRow).Value = _ WorksheetFunction.Transpose(pluslist.Cells(startRow, 1).Resize(cRow, Col).Value) resRow = resRow + Col + SpaceLine Next resultlist.Select End If
'тут сравнение массивов и должна быть перезапись значениями Dim A(), C() As Boolean Dim k, l As string ReDim Preserve A(resultlist.Cells(Rows.Count, 1).End(xlUp).Row, Lines) ReDim Preserve C(criterialist.Cells(Rows.Count, 1).End(xlUp).Row, criterialist.Cells(2, Columns.Count).End(xlToLeft).Column) For k = 1 To Lines For l = 1 To 4 If A(8, k) = C(7, l) Then resultlist.Cells(l, k).Value = criterialist.Cells(k, l + 1).Value k = k + 1 l = l + 2 End If Next l Next k
Яесмь, Всё-таки, мне с такой постановкой задачи разбираться сложно. Опишите, пожалуйста, исходные данные и чего Вы с ними хотите сделать. Ещё раз и проще.
Яесмь, Всё-таки, мне с такой постановкой задачи разбираться сложно. Опишите, пожалуйста, исходные данные и чего Вы с ними хотите сделать. Ещё раз и проще.Roman777
Roman777, Благодарю за стремление помочь. Есть массив на листе "Criteria", показывающий вес критериев для юр лиц и ИП, и есть массив неопределенной размерности на листе "Result". На листе Result он образуется с помощью транспонирования 3 первых столбцов с листа "+++++" и парсинга с сайта критериев по этим клиентам и критерии записываются под ИНН на листе "Result" (это сделано, так как количество критериев может быть от 0 до lines, где он для простоты равен 8). Но как видно из цикла, каждые 8 строк с листа "+++++" транспонируются и также критерии (их всегда разное количество) записываются под ними, то есть количество строк неизвестно, а количество столбцов всегда lines = 8 у массива на странице "Result". Общая задача стоит передо мной: сравнить массив на листе "Result" с массивом на листе Criteria, при совпадении критерия на листе "Result", критерий перезаписывается соответствующим ему баллом на листе "Criteria". То есть при сравнении каждому критерию присваивается его значение в "Criteria". Затем эти баллы суммируются по каждому клиенту и записываются в поле индекс. Вроде всё. Еще раз благодарю
Roman777, Благодарю за стремление помочь. Есть массив на листе "Criteria", показывающий вес критериев для юр лиц и ИП, и есть массив неопределенной размерности на листе "Result". На листе Result он образуется с помощью транспонирования 3 первых столбцов с листа "+++++" и парсинга с сайта критериев по этим клиентам и критерии записываются под ИНН на листе "Result" (это сделано, так как количество критериев может быть от 0 до lines, где он для простоты равен 8). Но как видно из цикла, каждые 8 строк с листа "+++++" транспонируются и также критерии (их всегда разное количество) записываются под ними, то есть количество строк неизвестно, а количество столбцов всегда lines = 8 у массива на странице "Result". Общая задача стоит передо мной: сравнить массив на листе "Result" с массивом на листе Criteria, при совпадении критерия на листе "Result", критерий перезаписывается соответствующим ему баллом на листе "Criteria". То есть при сравнении каждому критерию присваивается его значение в "Criteria". Затем эти баллы суммируются по каждому клиенту и записываются в поле индекс. Вроде всё. Еще раз благодарюЯесмь
Сообщение отредактировал Яесмь - Воскресенье, 11.02.2018, 18:56
Т.е. на листе Result нужно найти, например, "Критерий 4" и заменить его на "61". Так? upd попробуйте:
[vba]
Код
Sub ertert() Dim x, i&, j&, r As Range, adr$
With Sheets("Criteria").Range("A2").CurrentRegion x = .Offset(1).Resize(.Rows.Count - 1).Value End With
With Sheets("Result(было)").UsedRange For i = 1 To UBound(x) For j = 1 To UBound(x, 2) Step 2 If Len(x(i, j)) Then Set r = .Find(x(i, j), LookIn:=xlValues, lookat:=xlWhole) If Not r Is Nothing Then adr = r.Address Do r.Value = x(i, j + 1) Set r = .FindNext(r) If r Is Nothing Then Exit Do Loop While r.Address <> adr End If End If Next j Next i End With End Sub
[/vba]
Т.е. на листе Result нужно найти, например, "Критерий 4" и заменить его на "61". Так? upd попробуйте:
[vba]
Код
Sub ertert() Dim x, i&, j&, r As Range, adr$
With Sheets("Criteria").Range("A2").CurrentRegion x = .Offset(1).Resize(.Rows.Count - 1).Value End With
With Sheets("Result(было)").UsedRange For i = 1 To UBound(x) For j = 1 To UBound(x, 2) Step 2 If Len(x(i, j)) Then Set r = .Find(x(i, j), LookIn:=xlValues, lookat:=xlWhole) If Not r Is Nothing Then adr = r.Address Do r.Value = x(i, j + 1) Set r = .FindNext(r) If r Is Nothing Then Exit Do Loop While r.Address <> adr End If End If Next j Next i End With End Sub