Sub Пересчет_наличия_строк()
Dim List_smeta, List_materials, List_works, List_materialsVC, List_worksVC As Worksheet
Dim VB_Smeta_full(), VB_Smeta_m_full(), VB_Smeta_w_full() As Variant
Dim SmetaFinalRow, SmetaFinalColumn As String
Dim i, n As Long
Set List_smeta = Application.ThisWorkbook.Sheets("Смета")
Set List_materials = Application.ThisWorkbook.Sheets("Материалы")
Set List_works = Application.ThisWorkbook.Sheets("Работы")
Set List_materialsVC = Application.ThisWorkbook.Sheets("Материалы ВиК")
Set List_worksVC = Application.ThisWorkbook.Sheets("Работы ВиК")
VB_Smeta_m_full() = Range("Smeta_m_full").Value
VB_Smeta_w_full() = Range("Smeta_w_full").Value
With List_smeta
VB_Smeta_full = .Range("B14:BX" & .Cells(.Rows.Count, "BX").End(xlUp).Row).Value
VB_Smeta_contractor = .Range("Smeta_contractor").Value
VB_Smeta_contractor_fix = .Range("Smeta_contractor_fix").Value
End With
ReDim VB_Smeta_full_new(1 To UBound(VB_Smeta_full), 0): n = 1
For i = 1 To UBound(VB_Smeta_full)
If Not IsEmpty(VB_Smeta_full(i, 14)) Then
If VB_Smeta_full(i, 20) = "да" Then
If VB_Smeta_contractor = VB_Smeta_contractor_fix Then
If VB_Smeta_full(i, 74) = VB_Smeta_contractor Then
VB_Smeta_full_new(n, 0) = Round(VB_Smeta_full(i, 14) * VB_Smeta_full(i, 15), 0)
End If
End If
End If
End If
Next
Debug.Print VB_Smeta_full_new(3, 0)
Range("Smeta_mat_volume") = VB_Smeta_full
End Sub
Задача разбивается на несколько этапов (все операции выполняются на листе "Смета"): 1. определяем наличие объёма в столбце N соответствующей ячейки. Если значение отсутствует, смысла считать нет. 2. проверяем столбец U, если стоит "да" продолжаем расчёты дальше. 3. проверяем столбец bW, если в ячейке соответствует человеку в ячейке $V$4, или в ячейке $V$4=BZ$20 стоит эталон, продолжаем расчеты дальше 4. И последнее условие, выполняет ли соответствующий человек в ячейке bw соответствующую работу из диапазона by1:h20. Если все ок. То берем значение из ячейки N, умножаем на значение ячейки P и округляем вверх до целого значения. Спасибо за помощь Александру в корректировке макроса по первой части.
5. Проверяем массив VB_Smeta_full, столбец 2 и сравниваем с массивом VB_Smeta_m_full столбец 2, если массивы совпадают 6. Проверяем VB_Smeta_contractor с массивом VB_Smeta_m_full строка 1 7. При совпадении значение пересечения заносится в массив VB_Smeta_full столбец 5 6. Перемножаем в массиве VB_Smeta_full столбец 4 5 и проставляем значение в столбец 6 округлённое значение до копеек. 7. Затем данные из массива ячеек 4,5,6 вставляем в столбцы E,F,G листа Смета
Smeta_full = Смета B13:BX6123 диапазону присвоил имя Smeta_m_full = Материалы A2:AB1166 диапазону присвоил имя Smeta_w_full = Работы A2:X451 диапазону присвоил имя Занёс их в пямять макроса
Станислав Вьюжанин написал: Код ? 123 VB_Smeta_full() = Range("Smeta_full").Value VB_Smeta_m_full() = Range("Smeta_m_full").Value VB_Smeta_w_full() = Range("Smeta_w_full").ValueSmeta_full = Смета B13:BX6123 диапазону присвоил имяSmeta_m_full = Материалы A2:AB1166 диапазону присвоил имяSmeta_w_full = Работы A2:X451 диапазону присвоил имяЗанёс их в пямять макроса
Полный код:
Код
Sub Пересчет_наличия_строк()
Dim List_smeta, List_materials, List_works, List_materialsVC, List_worksVC As Worksheet
Dim VB_Smeta_full(), VB_Smeta_m_full(), VB_Smeta_w_full() As Variant
Dim SmetaFinalRow, SmetaFinalColumn As Long
Dim i, j As Long
Set List_smeta = Application.ThisWorkbook.Sheets("Смета")
Set List_materials = Application.ThisWorkbook.Sheets("Материалы")
Set List_works = Application.ThisWorkbook.Sheets("Работы")
Set List_materialsVC = Application.ThisWorkbook.Sheets("Материалы ВиК")
Set List_worksVC = Application.ThisWorkbook.Sheets("Работы ВиК")
VB_Smeta_full() = Range("Smeta_full").Value
VB_Smeta_m_full() = Range("Smeta_m_full").Value
VB_Smeta_w_full() = Range("Smeta_w_full").Value
VB_Smeta_contractor_fix = Range("Smeta_contractor_fix").Value
VB_Smeta_contractor = Range("Smeta_contractor").Value
For i = 1 To 6110
If VB_Smeta_full(i, 14) <> 0 And VB_Smeta_full(i, 20) = "да" Then
If VB_Smeta_full(i, 74) = VB_Smeta_contractor_fix Or VB_Smeta_full(i, 74) = VB_Smeta_contractor Then
VB_Smeta_full(i, 4) = VB_Smeta_full(i, 14) * VB_Smeta_full(i, 15)
End If
End If
Next
Range("Smeta_mat_volume") = VB_Smeta
End Sub
С трудом посмотрел Ваш файл. Там точно все листы нужны для решения этого конкретного вопроса? Не переусердствовали-ли Вы с именованием всё и вся? 561 имя!!! Смысл давать имя диапазону, а потом заносить его в массив и уже работать с массивом? Смысл такого именования? Мало того, что от этого сильно разбухает файл, так и разобраться в таком количестве имен то еще извращение.
По теме
Цитата
Станислав Вьюжанин написал: 1. определяем наличие объёма в столбце N соответствующей ячейки. Если значение отсутствует, смысла считать нет. 2. проверяем столбец U, если стоит "да" продолжаем расчёты дальше. 3. проверяем столбец bW, если в ячейке соответствует человеку в ячейке $V$4, или в ячейке $V$4=BZ$20 стоит эталон, продолжаем расчеты дальше 4. И последнее условие, выполняет ли соответствующий человек в ячейке bw соответствующую работу из диапазона by1:h20. Если все ок. То берем значение из ячейки N, умножаем на значение ячейки P и округляем вверх до целого значения.
Строго по Вашему алгоритму
Код
Sub NameCount()
Dim arr(), iVal, I&, N&, arrNew()
With Worksheets("Смета")
arr = .Range("B14:BX" & .Cells(.Rows.Count, "N").End(xlUp).Row).Value
iVal = .Range("V4").Value
End With
ReDim arrNew(1 To UBound(arr), 0): N = 1
For I = 1 To UBound(arr)
If Not IsEmpty(arr(I, 13)) Then '1.определяем наличие объёма в столбце N соответствующей ячейки. Если значение отсутствует, смысла считать нет.
If arr(I, 20) = "да" Then '2. проверяем столбец U, если стоит "да" продолжаем расчёты дальше
If arr(I, 74) = iVal Then 'или в ячейке $V$4=BZ$20 стоит эталон ??? что ЭТО? Какой эталон?
'тут вообще непонятно о чем речь:
'выполняет ли соответствующий человек в ячейке bw соответствующую работу из диапазона by1:h20
'какой человек? что за хитрый диапазон такой?
'If .... then
arrNew(N, 0) = Round(arr(I, 13) * arr(I, 15)) 'То берем значение из ячейки N, умножаем на значение ячейки P и округляем вверх до целого значения.
N = N + 1
'end if
End If
End If
End If
Next
'дальше полученый массив значений нужно куда-то выгрузить?
MsgBox "В Вашей книге " & ThisWorkbook.Names.Count & " имен!" & vbNewLine & _
"Вы уверены?"
End Sub
Sanja написал: С трудом посмотрел Ваш файл. Там точно все листы нужны для решения этого конкретного вопроса? Не переусердствовали-ли Вы с именованием всё и вся? 561 имя!!! Смысл давать имя диапазону, а потом заносить его в массив и уже работать с массивом? Смысл такого именования? Мало того, что от этого сильно разбухает файл, так и разобраться в таком количестве имен то еще извращение.
Спасибо большое что посмотрели. Но вначале к сожалению не работал с массивами. Присваивал диапазону имя, а потом в нем производил расчёты With Range("Smeta_volume_area_wall_tile") .Formula = "=SUMIFS(Volume,Volume_name,RC[-14],Volume_name_area,""Настенная плитка"")" .Calculate .Value = .Value End With Но когда файл начал считаться 5 мин. решил переделать. Теперь разбираюсь с массивами. Постепенно лишние имена уберу.
Подскажите пожалуйста как можно 6111 при переборе заменить SmetaFinalRow = VB_Smeta_full(Rows.Count, 20).End(xlUp).Row For i = 1 To SmetaFinalRow Не работает. (((
Sanja написал: Sub NameCount()Dim arr(), iVal, I&, N&, arrNew()With Worksheets("Смета") arr = .Range("B14:BX" & .Cells(.Rows.Count, "N").End(xlUp).Row).Value iVal = .Range("V4").ValueEnd WithReDim arrNew(1 To UBound(arr), 0): N = 1For I = 1 To UBound(arr) If Not IsEmpty(arr(I, 13)) Then '1.определяем наличие объёма в столбце N соответствующей ячейки. Если значение отсутствует, смысла считать нет. If arr(I, 20) = "да" Then '2. проверяем столбец U, если стоит "да" продолжаем расчёты дальше If arr(I, 74) = iVal Then 'или в ячейке $V$4=BZ$20 стоит эталон ??? что ЭТО? Какой эталон? 'тут вообще непонятно о чем речь: 'выполняет ли соответствующий человек в ячейке bw соответствующую работу из диапазона by1:h20 'какой человек? что за хитрый диапазон такой? 'If .... then arrNew(N, 0) = Round(arr(I, 13) * arr(I, 15)) 'То берем значение из ячейки N, умножаем на значение ячейки P и округляем вверх до целого значения. N = N + 1 'end if End If End If End IfNext 'дальше полученый массив значений нужно куда-то выгрузить? MsgBox "В Вашей книге " & ThisWorkbook.Names.Count & " имен!" & vbNewLine & _ "Вы уверены?"End Sub
Станислав Вьюжанин, зачем Вы цитируете мои сообщения? Модераторы будут не довольны. Вы можете вернуться в свои сообщения и исправить их. Что-бы ответить на сообщение совсем необязательно его цитировать
Согласие есть продукт при полном непротивлении сторон
Sanja написал: 12345678910111213141516171819202122232425262728Sub NameCount()Dim arr(), iVal, I&, N&, arrNew()With Worksheets("Смета") arr = .Range("B14:BX" & .Cells(.Rows.Count, "N").End(xlUp).Row).Value iVal = .Range("V4").ValueEnd WithReDim arrNew(1 To UBound(arr), 0): N = 1For I = 1 To UBound(arr) If Not IsEmpty(arr(I, 13)) Then '1.определяем наличие объёма в столбце N соответствующей ячейки. Если значение отсутствует, смысла считать нет. If arr(I, 20) = "да" Then '2. проверяем столбец U, если стоит "да" продолжаем расчёты дальше If arr(I, 74) = iVal Then 'или в ячейке $V$4=BZ$20 стоит эталон ??? что ЭТО? Какой эталон? 'тут вообще непонятно о чем речь: 'выполняет ли соответствующий человек в ячейке bw соответствующую работу из диапазона by1:h20 'какой человек? что за хитрый диапазон такой? 'If .... then arrNew(N, 0) = Round(arr(I, 13) * arr(I, 15)) 'То берем значение из ячейки N, умножаем на значение ячейки P и округляем вверх до целого значения. N = N + 1 'end if End If End If End IfNext 'дальше полученый массив значений нужно куда-то выгрузить? MsgBox "В Вашей книге " & ThisWorkbook.Names.Count & " имен!" & vbNewLine & _ "Вы уверены?"End Sub
По строке 11 макроса. Попробую пояснить, когда стоит Условный человек то таблица отражает весь перечень работ которые присутствуют на объекте, а на листах с материалами и работами показаны все люди, которые хотят в этом безобразии поучавствовать. Если в V4 меняем человека, то оставляем только те ячейки в BW на которые он заявлялся и соответственно на листах с материалами и работами остается только он. Спасибо за понимание.
Пожалуйста, вот только с Вашей стороны его нет. Повторю
Цитата
Sanja написал: Станислав Вьюжанин , зачем Вы цитируете мои сообщения? Модераторы будут не довольны. Вы можете вернуться в свои сообщения и исправить их. Что-бы ответить на сообщение совсем необязательно его цитировать
За помощь в темах с нарушениями Правил перепадает и помогающим
Согласие есть продукт при полном непротивлении сторон
Sub Пересчет_наличия_строк()
Dim List_smeta, List_materials, List_works, List_materialsVC, List_worksVC As Worksheet
Dim VB_Smeta_full(), VB_Smeta_m_full(), VB_Smeta_w_full() As Variant
Dim SmetaFinalRow, SmetaFinalColumn As String
Dim i, n As Long
Set List_smeta = Application.ThisWorkbook.Sheets("Смета")
Set List_materials = Application.ThisWorkbook.Sheets("Материалы")
Set List_works = Application.ThisWorkbook.Sheets("Работы")
Set List_materialsVC = Application.ThisWorkbook.Sheets("Материалы ВиК")
Set List_worksVC = Application.ThisWorkbook.Sheets("Работы ВиК")
VB_Smeta_m_full() = Range("Smeta_m_full").Value
VB_Smeta_w_full() = Range("Smeta_w_full").Value
With List_smeta
VB_Smeta_full = .Range("B14:BX" & .Cells(.Rows.Count, "BX").End(xlUp).Row).Value
VB_Smeta_contractor = .Range("Smeta_contractor").Value
VB_Smeta_contractor_fix = .Range("Smeta_contractor_fix").Value
End With
ReDim VB_Smeta_full_new(1 To UBound(VB_Smeta_full), 0): n = 1
For i = 1 To UBound(VB_Smeta_full)
If Not IsEmpty(VB_Smeta_full(i, 14)) Then
If VB_Smeta_full(i, 20) = "да" Then
If VB_Smeta_contractor = VB_Smeta_contractor_fix Then
If VB_Smeta_full(i, 74) = VB_Smeta_contractor Then
VB_Smeta_full_new(n, 0) = Round(VB_Smeta_full(i, 14) * VB_Smeta_full(i, 15), 0)
End If
End If
End If
End If
Next
Debug.Print VB_Smeta_full_new(3, 0)
Range("Smeta_mat_volume") = VB_Smeta_full
End Sub
Поскольку п.5 для меня сложен попробую сначала отсортировать массив VB_Smeta_m_full() строка 1 по значению в ячейке Smeta_contractor_finish. Далее данные отсортированного столбца перенести в столбец 5 массива VB_Smeta_m_full(). Видимо для этого придётся переопределить массив. А далее уже из столбца 5 массива VB_Smeta_m_full(), переносить значения в столбец 5 массива VB_Smeta_full, значения сравниваться будут из 2 столбцов обеих таблиц.
Код
With List_materials
VB_Smeta_contractor_finish = .Range("Smeta_contractor_finish").Value
End With
If VB_Smeta_m_full(1, j) = VB_Smeta_contractor_finish Then
End If
Не буду мудрить, сделаю по аналогии уже с выше работающим макросом
Код
With List_materials
VB_Smeta_m_full = .Range("A2:AB" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value
VB_Smeta_contractor_finish = .Range("Smeta_contractor_finish").Value
End With
ReDim VB_Smeta_m_full_new(1 To UBound(VB_Smeta_m_full), 0): m = 1
For j = 1 To UBound(VB_Smeta_m_full)
If VB_Smeta_m_full(1, j) = VB_Smeta_contractor_finish Then
End If
Next
Sub Пересчет_наличия_строк()
Dim List_smeta, List_materials, List_works, List_materialsVC, List_worksVC As Worksheet
Dim VB_Smeta_full(), VB_Smeta_full_new(), VB_Smeta_m_full(), VB_Smeta_w_full() As Variant
Dim SmetaFinalRow, SmetaFinalColumn As String
Dim i, n, j As Long
Set List_smeta = Application.ThisWorkbook.Sheets("Смета")
Set List_materials = Application.ThisWorkbook.Sheets("Материалы")
Set List_works = Application.ThisWorkbook.Sheets("Работы")
Set List_materialsVC = Application.ThisWorkbook.Sheets("Материалы ВиК")
Set List_worksVC = Application.ThisWorkbook.Sheets("Работы ВиК")
VB_Smeta_w_full() = Range("Smeta_w_full").Value
With List_smeta
VB_Smeta_full = .Range("B14:BX" & .Cells(.Rows.Count, "BX").End(xlUp).Row).Value
VB_Smeta_contractor = .Range("Smeta_contractor").Value
VB_Smeta_contractor_fix = .Range("Smeta_contractor_fix").Value
VB_Smeta_contractor_finish = .Range("Smeta_contractor_finish").Value
End With
ReDim VB_Smeta_full_new(1 To UBound(VB_Smeta_full), 0): n = 1
For i = 1 To UBound(VB_Smeta_full)
If Not IsEmpty(VB_Smeta_full(i, 14)) Then
If VB_Smeta_full(i, 20) = "да" Then
If VB_Smeta_contractor = VB_Smeta_contractor_fix Then
If VB_Smeta_full(i, 74) = VB_Smeta_contractor Then
VB_Smeta_full_new(n, 0) = Round(VB_Smeta_full(i, 14) * VB_Smeta_full(i, 15), 0)
n = n + 1
End If
End If
End If
End If
Next
With List_materials
VB_Smeta_m_full = .Range("A2:AB" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value
End With
For j = 1 To UBound(VB_Smeta_m_full)
If VB_Smeta_m_full(1, j) = VB_Smeta_contractor_finish Then
VB_Smeta_m_full(i, 5) = VB_Smeta_m_full(i, j)
End If
If VB_Smeta_full(i, 2) = VB_Smeta_m_full(i, 2) Then
VB_Smeta_full(i, 5) = VB_Smeta_m_full(i, 5)
End If
Next
VB_Smeta_full(i, 6) = Round(VB_Smeta_full(i, 4) * VB_Smeta_full(i, 5), 2)
Range("Smeta_mat_volume") = VB_Smeta_full(i, 5)
Range("Smeta_mat_price") = VB_Smeta_full(i, 6)
Range("Smeta_mat_summa") = VB_Smeta_full(i, 7)
End Sub
Друзья. Проблема, оператор j определяется правильно, 7 А вот со строкой не правильно:
Как можно определить правильно строку? Спасибо.
Код
For j = 1 To UBound(VB_Smeta_m_full)
If VB_Smeta_m_full(1, j) = VB_Smeta_contractor_finish Then
For k = 2 To UBound (VB_Smeta_m_full)
VB_Smeta_m_full(k, 5) = VB_Smeta_m_full(k, j)
Next
End if
Next
Sub Пересчет_наличия_строк()
Dim List_smeta, List_materials, List_works, List_materialsVC, List_worksVC As Worksheet
Dim VB_Smeta_full(), VB_Smeta_full_new(), VB_Smeta_m_full(), VB_Smeta_w_full() As Variant
Dim VB_Smeta_contractor, VB_Smeta_contractor_fix, VB_Smeta_contractor_finish As String
Dim i, m, n, j As Long
Set List_smeta = Application.ThisWorkbook.Sheets("Смета")
Set List_materials = Application.ThisWorkbook.Sheets("Материалы")
Set List_works = Application.ThisWorkbook.Sheets("Работы")
Set List_materialsVC = Application.ThisWorkbook.Sheets("Материалы ВиК")
Set List_worksVC = Application.ThisWorkbook.Sheets("Работы ВиК")
VB_Smeta_w_full() = Range("Smeta_w_full").Value
With List_smeta
VB_Smeta_full = .Range("B14:BX" & .Cells(.Rows.Count, "BX").End(xlUp).Row).Value
VB_Smeta_contractor = .Range("Smeta_contractor").Value
VB_Smeta_contractor_fix = .Range("Smeta_contractor_fix").Value
VB_Smeta_contractor_finish = .Range("Smeta_contractor_finish").Value
End With
ReDim VB_Smeta_full_new(1 To UBound(VB_Smeta_full), 0): n = 1
For i = 1 To UBound(VB_Smeta_full)
If Not IsEmpty(VB_Smeta_full(i, 14)) Then
If VB_Smeta_full(i, 20) = "да" Then
If VB_Smeta_contractor = VB_Smeta_contractor_fix Then
If VB_Smeta_full(i, 74) = VB_Smeta_contractor Then
VB_Smeta_full_new(n, 0) = Round(VB_Smeta_full(i, 14) * VB_Smeta_full(i, 15), 0)
n = n + 1
End If
End If
End If
End If
Next
With List_materials
VB_Smeta_m_full = .Range("A2:AB" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value
End With
For j = 6 To UBound(VB_Smeta_m_full)
For k = 2 To UBound(VB_Smeta_m_full, 5)
If VB_Smeta_m_full(1, j) = VB_Smeta_contractor_finish Then
VB_Smeta_m_full(k, 5) = VB_Smeta_m_full(k, j)
End If
Next
Next
VB_Smeta_full(i, 6) = Round(VB_Smeta_full(i, 4) * VB_Smeta_full(i, 5), 2)
Range("Smeta_mat_volume") = VB_Smeta_full(i, 5)
Range("Smeta_mat_price") = VB_Smeta_full(i, 6)
Range("Smeta_mat_summa") = VB_Smeta_full(i, 7)
End Sub
VB_Smeta_m_full индексируется правильно, а вот со строками возникает проблема.
Согласен Александр, но я считал что j номер столбцу, который уже подобран по условию, а k перебор строки. И значения из столбца j строки k, должны были поставляться в столбце 5 и строку k этой же таблицы и столбец 6 и при условии совпадении строк в таблицу VB_Smeta_full
Меня не Александр зовут, Ник наверное в заблуждение вводит
В функции Ubound второй аргумент не обязателен, и по умолчанию равен - 1, поэтому, если Вы работаете с первой размерностью он может быть опущен т.е. UBound(arr, 1) = UBound(arr)
Перебор значение двумерного массива, в общем случае, будет выглядеть так
Код
'цикл по записям первой размерности двумерного массива (грубо - по строкам)
For I = 1 To UBound(arr, 1)
'цикл по записям второй размерности двумерного массива (грубо - по столбцам)
For J = 1 To UBound(arr, 2)
Debug.Print arr(I, J)
Next
Next
Согласие есть продукт при полном непротивлении сторон
Станислав Вьюжанин написал: перебора строк по второму столбцу для сравнения
Если Вам известен столбец, по которому нужно сравнивать, то перебирать столбцы не нужно, сразу указывайте его номер. Может так?
Код
'перебираем СТРОКИ массива VB_Smeta_m_full
For k = 2 To UBound(VB_Smeta_m_full)
'если k-ая строка второго столбца чему-то там равна,
If VB_Smeta_m_full(k, 2) = VB_Smeta_contractor_finish Then
'то что-то делаем
End If
Next
Согласие есть продукт при полном непротивлении сторон
Sanja написал: Если Вам известен столбец, по которому нужно сравнивать, то перебирать столбцы не нужно, сразу указывайте его номер.Может так?
Столбец не известен, я его нахожу так
Код
For j = 6 To UBound(VB_Smeta_m_full)
If VB_Smeta_m_full(1, j) = VB_Smeta_contractor_finish Then
И нахожу правильно, далее хочу перебирать строки уже по столбцу 2
Код
For k = 2 To LBound(VB_Smeta_m_full) 'ОПРЕДЕЛЯЕМ количество строк
VB_Smets_m_full (k, 5) = VB_Smeta_m_full (k,j) ' данные из столбца j построчно, переноски в столбец 5 этой же таблицы
' и параллельно
If VB_Smeta_full(i, 2) = VB_Smeta_m_full(k, 2) Then 'если в массиве VB_Smeta_full столбца 2, значение совпадает со строкой массива VB_Smeta_m_full столбца 2, то
VB_Smeta_full(i, 5) = VB_Smeta_m_full(k, j) ' данные из столбца j переносим в массив VB_Smeta_full
For j = 6 To UBound(VB_Smeta_m_full)
If VB_Smeta_m_full(1, j) = VB_Smeta_contractor_finish Then
For k = 1 To LBound(VB_Smeta_m_full)
VB_Smeta_m_full(k, 5) = VB_Smeta_m_full(k, j)
If VB_Smeta_full(i, 2) = VB_Smeta_m_full(k, 2) Then
VB_Smeta_full(i, 5) = VB_Smeta_m_full(k, j)
End If
Next
End If
Next
Где то в этом коде зарыта великая сила......
k необходимо начинать со второй строки, но при For k = 2 To LBound(VB_Smeta_m_full) перестает правильно определяться столбец j