Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2019, 16:31   #11
СтаниславАВ
Форумчанин
 
Регистрация: 10.10.2010
Сообщений: 107
По умолчанию

Макрос в модуле Smeta. А сам имеет имя Пересчет_пустых_строк
СтаниславАВ вне форума Ответить с цитированием
Старый 31.03.2019, 22:23   #12
СтаниславАВ
Форумчанин
 
Регистрация: 10.10.2010
Сообщений: 107
По умолчанию

Код:
Sub Test3()
Dim a As Variant, i As Long
  VB_Smeta = Range("Smeta").Value
    For i = 1 To 5
      VB_Smeta(i, 5) = VB_Smeta(i, 1) * VB_Smeta(i, 2)
    Next
  Range("Smeta") = VB_Smeta
End Sub
Попробую так.

Последний раз редактировалось СтаниславАВ; 01.04.2019 в 16:53.
СтаниславАВ вне форума Ответить с цитированием
Старый 01.04.2019, 06:02   #13
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
В 5 столбце массива мне надо рассчитать формулу
а дальше нужна не формула, что вы написали, а словестное описаное того, что нужно сосчитать
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 01.04.2019, 09:29   #14
СтаниславАВ
Форумчанин
 
Регистрация: 10.10.2010
Сообщений: 107
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
а дальше нужна не формула, что вы написали, а словестное описаное того, что нужно сосчитать
Спасибо Игорь. Попробую описать словами.
Формула расчета была такая: =если(и(U15="да";или(BW15=$V$4;$V$4 =BZ$20));округлвверх(O15*P15;0);0)* если(индекс(Smeta_contractor_all_wo rks;поискпоз(Smeta_contractor_finis h;Smeta_all_contractor;0);поискпоз( $BX15;Smeta_contractor_works;0))="д а";1;0)

В столбце E расположены материалы, в строке E15 материал нужного вида, количество материала берется из ячейки O15, округляется вверх до целого значения но при условии если в ячейке U15 стоит надпись "да", соблюдается одно из условий ячейки BW15=$V$4 (выбранный человек сравнивается сам с собой) или $V$4=BZ$20 (выбранный человек сравнивается с эталоном), и еще одно сравнение, делает ли этот человек вообще такие работы =если(индекс(Smeta_contractor_all_w orks;поискпоз(Smeta_contractor_fini sh;Smeta_all_contractor;0);поискпоз ($BX15;Smeta_contractor_works;0))=" да";1;0), если делает данные умножаются на 1, если не делает, то умножаются на 0.
СтаниславАВ вне форума Ответить с цитированием
Старый 01.04.2019, 09:53   #15
СтаниславАВ
Форумчанин
 
Регистрация: 10.10.2010
Сообщений: 107
По умолчанию

Код:
Sub Пересчет_наличия_строк()
    Dim List_smeta, List_materials, List_works, List_materialsVC, List_worksVC As Worksheet
    Dim VB_Smeta_works_volume, VB_Smeta_mat_volume, VB_Smeta_wm_volume As Variant
    Dim i, Smeta_wm_volume 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_wm_volume = Range("Smeta_wm_volume").Value
    For i = 1 To 6123
    'Само значение объёма работ берётся из ячейки VB_Smeta_wm_volume(i, 17)
        VB_Smeta_wm_volume(i, 5) = IF(VB_Smeta_wm_volume(i, 21)=""да"",OR(VB_Smeta_wm_volume(i, 75)=Smeta_contractor,Smeta_contractor=R20C[70])),VB_Smeta_wm_volume(i, 14)*IF(INDEX(Smeta_contractor_all_works, MATCH(Smeta_contractor_finish,Smeta_all_contractor,0), MATCH(RC[68],Smeta_contractor_works,0))=""да"",1,0),0)
    Next
    Range("Smeta_wm_volume") = VB_Smeta
End Sub
Пока выдаёт ошибку.

Последний раз редактировалось СтаниславАВ; 01.04.2019 в 16:53.
СтаниславАВ вне форума Ответить с цитированием
Старый 01.04.2019, 10:24   #16
СтаниславАВ
Форумчанин
 
Регистрация: 10.10.2010
Сообщений: 107
Счастье Первая итеррация

Задача разбивается на несколько этапов:
1. определяем наличие объёма в столбце N соответствующей ячейки. Если значение отсутствует, смысла считать нет.
2. проверяем столбец U, если стоит "да" продолжаем расчёты дальше.
3. проверяем столбец bW, если в ячейке соответствует человеку в ячейке $V$4, или в ячейке $V$4=BZ$20 стоит эталон, продолжаем расчеты дальше
4. И последнее условие, выполняет ли соответствующий человек в ячейке bw соответствующую работу из диапазона by1h20.

Если все ок. То берем значение из ячейки N, умножаем на значение ячейки P и округляем вверх до целого значения.
СтаниславАВ вне форума Ответить с цитированием
Старый 01.04.2019, 12:40   #17
СтаниславАВ
Форумчанин
 
Регистрация: 10.10.2010
Сообщений: 107
По умолчанию

Первый пункт попробую отработать так: If VB_Smeta_wm_volume(i, 17) <> 0 Then
Код:
Sub Пересчет_наличия_строк()
Dim List_smeta, List_materials, List_works, List_materialsVC, List_worksVC As Worksheet
Dim VB_Smeta_works_volume, VB_Smeta_mat_volume, VB_Smeta_wm_volume As Variant
Dim i, Smeta_wm_volume 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_wm_volume = Range("Smeta_wm_volume").Value
For i = 1 To 6123
'Само значение объёма работ берётся из ячейки VB_Smeta_wm_volume(i, 17)
If VB_Smeta_wm_volume(i, 17) <> 0 Then

Next
Range("Smeta_wm_volume") = VB_Smeta
End Sub

Последний раз редактировалось СтаниславАВ; 01.04.2019 в 16:52.
СтаниславАВ вне форума Ответить с цитированием
Старый 01.04.2019, 12:47   #18
СтаниславАВ
Форумчанин
 
Регистрация: 10.10.2010
Сообщений: 107
По умолчанию

Второй вопрос попробую решить так
If VB_Smeta_wm_volume(i, 23) = "да" Then

Третий вопрос попробую решить так
Ячейке v4 даю имя Smeta_contractor
Ячейке bz20 даю имя Smeta_contractor_fix
Далее копирую её в память
VB_Smeta_contractor = Range("Smeta_contractor").Value
И сортирую
If VB_Smeta_wm_volume(i, 75) = VB_Smeta_contractor Then

Код:
Sub Пересчет_наличия_строк()
Dim List_smeta, List_materials, List_works, List_materialsVC, List_worksVC As Worksheet
Dim VB_Smeta_works_volume, VB_Smeta_mat_volume, VB_Smeta_wm_volume As Variant
Dim i, Smeta_wm_volume 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_wm_volume = Range("Smeta_wm_volume").Value
VB_Smeta_contractor = Range("Smeta_contractor").Value
VB_Smeta_contractor_fix = Range("Smeta_contractor_fix").Value
For i = 1 To 6123
'Само значение объёма работ берётся из ячейки VB_Smeta_wm_volume(i, 15)
If VB_Smeta_wm_volume(i, 15) <> 0 and VB_Smeta_wm_volume(i, 21) = "да" Then
If VB_Smeta_wm_volume(i, 75) = VB_Smeta_contractor_fix or VB_Smeta_wm_volume(i, 75) = VB_Smeta_contractor Then
VB_Smeta_wm_volume(i, 5) = ROUNDUP (VB_Smeta_wm_volume(i, 15) * VB_Smeta_wm_volume(i, 16),0)
End If
End If
Next
Range("Smeta_wm_volume") = VB_Smeta_wm_volume
End Sub

Последний раз редактировалось СтаниславАВ; 02.04.2019 в 09:18.
СтаниславАВ вне форума Ответить с цитированием
Старый 02.04.2019, 15:19   #19
СтаниславАВ
Форумчанин
 
Регистрация: 10.10.2010
Сообщений: 107
По умолчанию

Код:
    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, 16:02   #20
СтаниславАВ
Форумчанин
 
Регистрация: 10.10.2010
Сообщений: 107
По умолчанию

Код:
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:45.
СтаниславАВ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись с вариантами andrei_belko Паскаль, Turbo Pascal, PascalABC.NET 2 03.06.2014 17:12
Записи вариантами. alexeu121 Паскаль, Turbo Pascal, PascalABC.NET 7 28.05.2014 10:26
Записи с вариантами megabobik Помощь студентам 0 31.01.2010 16:17
Запись с вариантами Rusl92 Помощь студентам 1 14.11.2009 10:27
MainMenu с вариантами beegl Компоненты Delphi 4 08.06.2008 12:09