Страницы: 1 2 3 След.
RSS
Excel VBA расчет в массиве, Расчет в массиве с помощью VBA
 
Код
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
Ссылка на файл: https://yadi.sk/i/2EWvgYPWaI6XSw

Задача разбивается на несколько этапов (все операции выполняются на листе "Смета"):
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 листа Смета
Изменено: Станислав Вьюжанин - 02.04.2019 17:38:17
 
Все эти 'определяем/проверяем' на каком листе?
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал:
Все эти 'определяем/проверяем' на каком листе?
Спасибо. Подправил.
 
Код
    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

Smeta_full = Смета B13:BX6123 диапазону присвоил имя
Smeta_m_full = Материалы A2:AB1166 диапазону присвоил имя
Smeta_w_full = Работы A2:X451 диапазону присвоил имя
Занёс их в пямять макроса
Изменено: Станислав Вьюжанин - 02.04.2019 15:19:49
 
Цитата
Станислав Вьюжанин написал:
Код ? 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
Изменено: Станислав Вьюжанин - 02.04.2019 15:50:06
 
С трудом посмотрел Ваш файл. Там точно все листы нужны для решения этого конкретного вопроса? Не переусердствовали-ли Вы с именованием всё и вся? 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 - 02.04.2019 16:05:46
Согласие есть продукт при полном непротивлении сторон
 
Цитата
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 мин. решил переделать.
Теперь разбираюсь с массивами. Постепенно лишние имена уберу.
Изменено: Станислав Вьюжанин - 02.04.2019 16:07:07
 
Подскажите пожалуйста как можно 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
Сейчас попробую. Спасибо большое.
 
Станислав Вьюжанин, зачем Вы цитируете мои сообщения? Модераторы будут не довольны. Вы можете вернуться в свои сообщения и исправить их. Что-бы ответить на сообщение совсем необязательно его цитировать
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Станислав Вьюжанин написал:
SmetaFinalRow = VB_Smeta_full(Rows.Count, 20).End(xlUp).Row
Не работает. (((
Вы путаете диапазон с массивом.
Согласие есть продукт при полном непротивлении сторон
 
Цитата
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


Изменено: Станислав Вьюжанин - 02.04.2019 17:37:50
 
Поскольку п.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
Изменено: Станислав Вьюжанин - 02.04.2019 21:48:50
 
Попробую такой код:
Код
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
Изменено: Станислав Вьюжанин - 03.04.2019 10:28:33
 
Тихо сам с собою я веду беседу...
Согласие есть продукт при полном непротивлении сторон
 
Добрый день Александр. Разбираюсь с проблемой. Спасибо вчера за помощь. Сегодня пробую доработать таблицу дальше.
 
Друзья. Проблема, оператор 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
Изменено: Станислав Вьюжанин - 03.04.2019 20:30:14
 
Так тоже не работает
Код
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 индексируется правильно, а вот со строками возникает проблема.
Изменено: Станислав Вьюжанин - 03.04.2019 22:29:15
 
Вот это что? У Вас пятимерный массив!? Вам бы теорию почитать...
Цитата
UBound(VB_Smeta_m_full, 5)
Согласие есть продукт при полном непротивлении сторон
 
Согласен Александр, но я считал что j номер столбцу, который уже подобран по условию, а k перебор строки. И значения из столбца j строки k, должны были поставляться в столбце 5 и строку k этой же таблицы и столбец 6 и при условии совпадении строк в таблицу VB_Smeta_full
 
Цитата
Станислав Вьюжанин написал: Согласен Александр
Меня не Александр зовут, Ник наверное в заблуждение вводит ;)

В функции Ubound второй аргумент не обязателен, и по умолчанию равен - 1,
поэтому, если Вы работаете с первой размерностью он может быть опущен
т.е. UBound(arr, 1) = UBound(arr)

http://www.excelworld.ru/stuff/vba_function/array/ubound/19-1-0-28

Перебор значение двумерного массива, в общем случае, будет выглядеть так
Код
'цикл по записям первой размерности двумерного массива (грубо - по строкам)
For I = 1 To UBound(arr, 1)
    'цикл по записям второй размерности двумерного массива (грубо - по столбцам)
    For J = 1 To UBound(arr, 2)
        Debug.Print arr(I, J)
    Next
Next
Согласие есть продукт при полном непротивлении сторон
 
Прошу прощения за имя.
Код
 For j = 6 To UBound(VB_Smeta_m_full)
        If VB_Smeta_m_full(1, j) = VB_Smeta_contractor_finish Then

Данное действие отрабатывает верно. Находит нужный столбец и присваивает j=7
Но как только я начинаю перебирать по срокам (оператор k)
Код
    For k = 2 To LBound(VB_Smeta_m_full)
   If VB_Smeta_m_full(k, 2) = VB_Smeta_m_full(k, j) Then
      VB_Smeta_m_full(k, 5) = VB_Smeta_m_full(k, j)
J становиться 29, а вместо перебор строк( перебора строк по второму столбцу для сравнения) выдается ошибка.
Изменено: Станислав Вьюжанин - 04.04.2019 07:51:16
 
Цитата
Станислав Вьюжанин написал: перебора строк по второму столбцу для сравнения
Если Вам известен столбец, по которому нужно сравнивать, то перебирать столбцы не нужно, сразу указывайте его номер.
Может так?
Код
'перебираем СТРОКИ массива 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

 


   
Изменено: Станислав Вьюжанин - 04.04.2019 08:28:50
 
Цитата
Столбец не известен, я его нахожу так....И нахожу правильно
Да я ж не спорю, правильно так правильно. Только скажите, что по Вашему вы делаете в этой строке?
Код
For k = 2 To LBound(VB_Smeta_m_full) 'ОПРЕДЕЛЯЕМ количество строк
Что такое по Вашему LBound()?
Изменено: Sanja - 04.04.2019 08:38:43
Согласие есть продукт при полном непротивлении сторон
 
Определяю нижнюю границу массива VB_Smeta_m_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
Изменено: Станислав Вьюжанин - 04.04.2019 08:48:37
 
Цитата
Sanja написал:
Что такое по Вашему LBound()?
Согласие есть продукт при полном непротивлении сторон
Страницы: 1 2 3 След.
Наверх