0 / 0 / 0
Регистрация: 05.09.2024
Сообщений: 7
1

Формула в макрос

05.09.2024, 05:14. Показов 744. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Люди помогите в решении проблемы.
Признаюсь что в области различных формул и макросов я профан, по этому обращаюсь сюда.
Уверен решение где то на поверхности.
И так: есть формула в Эксель: =СУММ(СЧЁТЕСЛИМН('[31)Трассовка Автоналивная 405..xlsb]405'!$H:$H;"*"&C75&"*";'[31)Трассовка Автоналивная 405..xlsb]405'!$AH:$AH;"ремонт";'[31)Трассовка Автоналивная 405..xlsb]405'!$AJ:$AJ;"I";'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V;">="&$U$2;'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V;"<="&$W$2))+(СЧЁТЕСЛИМН('[31)Трассовка Автоналивная 405..xlsb]405'!$H:$H;"*"&C75&"*";'[31)Трассовка Автоналивная 405..xlsb]405'!$AH:$AH;"";'[31)Трассовка Автоналивная 405..xlsb]405'!$AQ:$AQ;"рк";'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V;">="&$U$2;'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V;"<="&$W$2))+(СЧЁТЕСЛИМН('[31)Трассовка Автоналивная 405..xlsb]405'!$H:$H;"*"&C75&"*";'[31)Трассовка Автоналивная 405..xlsb]405'!$AH:$AH;"";'[31)Трассовка Автоналивная 405..xlsb]405'!$BG:$BG;"рк";'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V;">="&$U$2;'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V;"<="&$W$2))

Подскажите как ее вписать в макрос. Или как то упростить и вписать в макрос.
Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2024, 05:14
Ответы с готовыми решениями:

формула + макрос
если(инкрементируемая ячейка(увеличивается с растяжением формулы)=статичной ячейке(она с...

Макрос или формула
У нас есть 2 файла (&quot;План&quot; и &quot;Факт&quot;). Хочу, чтобы в новом файле &quot;Сравнение&quot; производилась проверка...

Формула или макрос?
Ребят приветствую, такой к вам вопрос. Есть таблица 12 колонок, 362 строки. В некоторых строках...

Формула или макрос
Доброго времени суток! Вновь обращаюсь к вам за помощью. Прилагаю таблицу, в которой в столбцы А и...

17
Модератор
Эксперт MS Access
12059 / 4921 / 789
Регистрация: 07.08.2010
Сообщений: 14,399
Записей в блоге: 4
05.09.2024, 07:42 2
Цитата Сообщение от Egor55rus Посмотреть сообщение
Подскажите как ее вписать в макрос. Или как то упростить и вписать в макрос.
для начала - выложите пример книги, в которой это надо сделать

Добавлено через 22 минуты
Цитата Сообщение от Egor55rus Посмотреть сообщение
Или как то упростить и вписать в макрос.
для начала - разбить на подстроки, чтобы проверить то ли вы хотели получить
Код
=СУММ(СЧЁТЕСЛИМН(
'[31)Трассовка Автоналивная 405..xlsb]405'!$H:$H;"*"&C75&"*";
'[31)Трассовка Автоналивная 405..xlsb]405'!$AH:$AH;"ремонт";
'[31)Трассовка Автоналивная 405..xlsb]405'!$AJ:$AJ;"I";
'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V;">="&$U$2;
'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V;"<="&$W$2))
+(СЧЁТЕСЛИМН(
'[31)Трассовка Автоналивная 405..xlsb]405'!$H:$H;"*"&C75&"*";
'[31)Трассовка Автоналивная 405..xlsb]405'!$AH:$AH;"";
'[31)Трассовка Автоналивная 405..xlsb]405'!$AQ:$AQ;"рк";
'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V;">="&$U$2;
'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V;"<="&$W$2))
+(СЧЁТЕСЛИМН(
'[31)Трассовка Автоналивная 405..xlsb]405'!$H:$H;"*"&C75&"*";
'[31)Трассовка Автоналивная 405..xlsb]405'!$AH:$AH;"";
'[31)Трассовка Автоналивная 405..xlsb]405'!$BG:$BG;"рк";
'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V;">="&$U$2;
'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V;"<="&$W$2))
0
Ученик Нарушитель
233 / 143 / 53
Регистрация: 01.04.2020
Сообщений: 469
05.09.2024, 08:34 3
Цитата Сообщение от shanemac51 Посмотреть сообщение
разбить на подстроки
Ну или так:
Visual Basic
1
2
3
4
5
    ThisWorkbook.Worksheets("Sheet1").Range("A2").Formula = _
            "=SUM(COUNTIFS('[31)Трассовка Автоналивная 405..xlsb]405'!$H:$H,""*""&C75&""*"",'[31)Трассовка Автоналивная 405..xlsb]405'!$AH:$AH,""ремонт"",'[31)Трассовка Автоналивная 405..xlsb]405'!$AJ:$AJ,""I"",'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V,"">=""&$U$2,'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V,""<=""&$W$2))+(COUNTIFS('[31)Трассовка Автоналивная 405..xlsb]405'!$H:$H," & _
            """*""&C75&""*"",'[31)Трассовка Автоналивная 405..xlsb]405'!$AH:$AH,"""",'[31)Трассовка Автоналивная 405..xlsb]405'!$AQ:$AQ,""рк"",'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V,"">=""&$U$2,'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V,""<=""&$W$2))+(COUNTIFS('[31)Трассовка Автоналивная 405..xlsb]405'!$H:$H,""*""&C75&""*"",'[31)Трассовка Автоналивная 405..xlsb]405'!$AH:$AH," & _
            """"",'[31)Трассовка Автоналивная 405..xlsb]405'!$BG:$BG,""рк"",'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V,"">=""&$U$2,'[31)Трассовка Автоналивная 405..xlsb]405'!$V:$V,""<=""&$W$2))" & _
            ""
0
0 / 0 / 0
Регистрация: 05.09.2024
Сообщений: 7
05.09.2024, 09:14  [ТС] 4
Почему то при переносе строки вся команда краснеет.(((
0
0 / 0 / 0
Регистрация: 05.09.2024
Сообщений: 7
05.09.2024, 09:23  [ТС] 5
В архиве два файла. Суть в том чтоб через макрос книга ХХХ считала количество сваренных, проконтролированных, годных, не годных стыков. Формула вбита в соответствующие ячеки. Считает по клейму сварщика.
Вложения
Тип файла: 7z 31)Трассовка Автоналивная 405..7z (172.1 Кб, 14 просмотров)
0
0 / 0 / 0
Регистрация: 05.09.2024
Сообщений: 7
05.09.2024, 09:26  [ТС] 6
макрос работает с кнопки РАСЧЕТ
0
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
05.09.2024, 11:10 7
Цель в чём - поставить формулу, или подсчитать и поставить числа? Раз уж макрос используете, то можно открыть файл и подсчитать макросом, затем результат выгрузить в ХХХ.
А сейчас работает, только нужно из кода удалить указанный там путь к файлу, ну и в конце дописать автозаполнение формулы по листу.
Ну и мелочи типа что делать если юзер передумал.
0
0 / 0 / 0
Регистрация: 05.09.2024
Сообщений: 7
05.09.2024, 11:52  [ТС] 8
Цель- при открытии ХХХ запустить макрос чтоб посчитал и проставил цифры. Трассовка ежедневно обновляется, по этому макрос нужен в ХХХ.

Добавлено через 1 минуту
Пока сварщиков не много можно и формулой посчитать. Но в дальнейшем их будет до 200 человек, мне кажется макрос быстрее будет работать.

Добавлено через 13 минут
Макрос который там прописан считает не правильно. Правильно считали формулы в ячейках. они длинные, и я не могу их в макрос прописать. Вот в чем основная проблема. Либо формулы как то укоротить, либо как то их в макрос вписать. Когда кончается строка в макросе и ставлю перенос на следующую строку, все краснеет.

Добавлено через 4 минуты
Столбец "P" и "R" макрос считает не правильно.
0
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
05.09.2024, 14:24 9
Цитата Сообщение от Egor55rus Посмотреть сообщение
Столбец "P" и "R" макрос считает не правильно
Да нет, вот все три столбца правильно посчитано, как в формуле прописано так и есть.
CM2L 3 2 1
Мы ведь не знаем что и как там должно считаться.
И в целом если скорость не напрягает может так и остаться.
Но если у вас Эксель с динамическими диапазонами (2021-365) то быстрее может быть UDF - она всё сделает за один цикл по данным источника.
Ну или макросу тоже не нужно по данным бегать более одного раза.
0
Ученик Нарушитель
233 / 143 / 53
Регистрация: 01.04.2020
Сообщений: 469
05.09.2024, 20:05 10
Egor55rus, Что-то как-то тяжко, но однако выложу свою работу. Вроде бы правильно работает, проверьте.
Как-то так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
Option Explicit
 
Sub CountWithVBA()
    Application.ScreenUpdating = False
 
    ' Вот тут укажите правильно директорию (папка) где находится ваш файл
    Dim filePath    As String
    filePath = ThisWorkbook.Path & "\" & "31)Трассовка Автоналивная 405..xlsb"
    '    filePath = "C:\Users\GurinEV\Desktop\Приоритеты\5. ТРАССОВКИ\[31)Трассовка Автоналивная 405..xlsb"
 
    Dim wb          As Workbook
    On Error Resume Next
    Set wb = Workbooks.Open(filePath, ReadOnly:=True)
    On Error GoTo 0
 
    If wb Is Nothing Then
        MsgBox "Файл не найден или не удалось открыть.", vbCritical
        Exit Sub
    End If
 
    Dim ws          As Worksheet
    Set ws = wb.Sheets("405")
 
    Dim sh          As Worksheet
    Set sh = ThisWorkbook.Worksheets("Лист1")
 
    Dim lastRow     As Long
    lastRow = ws.Cells(ws.Rows.Count, "H").End(xlUp).Row
 
    Dim dataH As Variant, dataV As Variant
    Dim dataAH As Variant, dataAJ As Variant
    Dim dataAQ As Variant, dataBG As Variant
 
    dataH = ws.Range("H2:H" & lastRow).Value
    dataV = ws.Range("V2:V" & lastRow).Value
    dataAH = ws.Range("AH2:AH" & lastRow).Value
    dataAJ = ws.Range("AJ2:AJ" & lastRow).Value
    dataAQ = ws.Range("AQ2:AQ" & lastRow).Value
    dataBG = ws.Range("BG2:BG" & lastRow).Value
 
    Dim startDate As Date, endDate As Date
    startDate = sh.Range("U2").Value
    endDate = sh.Range("W2").Value
 
    Dim compareRow  As Long
    compareRow = sh.Cells(sh.Rows.Count, "C").End(xlUp).Row
 
    sh.Range("N7:S" & compareRow).ClearContents
 
    Dim dataC       As Variant
    Dim dataR As Variant, dataP As Variant
    dataC = sh.Range("C7:C" & compareRow).Value
    dataR = sh.Range("R7:R" & compareRow).Value
    dataP = sh.Range("P7:P" & compareRow).Value
 
    Dim j As Long, i As Long
    Dim countGoodI As Long, countOtherI As Long, countBG As Long, countRepair As Long
    Dim suitable As Long, notSuitable As Long, welded As Long
 
    Dim results()   As Variant
    ReDim results(1 To compareRow - 6, 1 To 5)
 
    For j = 1 To UBound(dataC, 1)
        countGoodI = 0
        countOtherI = 0
        countBG = 0
        countRepair = 0
        suitable = 0
        notSuitable = 0
        welded = 0
 
        Dim compareString As String
        compareString = dataC(j, 1)
 
        For i = 1 To UBound(dataH, 1)
 
            If InStr(1, dataH(i, 1), compareString, vbTextCompare) > 0 Then
 
                If dataAH(i, 1) = "годен" And dataAJ(i, 1) = "I" Then
 
                    If dataV(i, 1) >= startDate And dataV(i, 1) <= endDate Then
                        countGoodI = countGoodI + 1
                    End If
 
                End If
 
                If dataAH(i, 1) = "" Then
 
                    If dataAQ(i, 1) <> "" Then
 
                        If dataV(i, 1) >= startDate And dataV(i, 1) <= endDate Then
                            countOtherI = countOtherI + 1
                        End If
 
                    ElseIf dataBG(i, 1) <> "" Then
 
                        If dataV(i, 1) >= startDate And dataV(i, 1) <= endDate Then
                            countBG = countBG + 1
                        End If
 
                    End If
 
                ElseIf dataAH(i, 1) = "ремонт" Then
 
                    If dataV(i, 1) >= startDate And dataV(i, 1) <= endDate Then
                        countRepair = countRepair + 1
                    End If
 
                End If
 
                If dataAJ(i, 1) = "I" And dataV(i, 1) >= startDate And dataV(i, 1) <= endDate Then
                    welded = welded + 1
                End If
 
                If dataAQ(i, 1) = "рк" And dataAJ(i, 1) = "I" And dataV(i, 1) >= startDate And dataV(i, 1) <= endDate Then
                    notSuitable = notSuitable + 1
                End If
 
                If dataAH(i, 1) = "годен" And dataAQ(i, 1) = "" And _
                        dataV(i, 1) >= startDate And _
                        dataV(i, 1) <= endDate And _
                        InStr(1, dataH(i, 1), compareString, vbTextCompare) > 0 Then
                    suitable = suitable + 1
                End If
 
            End If
 
        Next i
 
        results(j, 1) = welded
        results(j, 2) = countGoodI + countOtherI + countBG + countRepair
        results(j, 3) = suitable
        results(j, 4) = notSuitable
        results(j, 5) = 0
    Next j
 
    sh.Range("N7:N" & compareRow).Value = Application.Index(results, 0, 1)
    sh.Range("P7:P" & compareRow).Value = Application.Index(results, 0, 2)
    sh.Range("Q7:Q" & compareRow).Value = Application.Index(results, 0, 3)
    sh.Range("R7:R" & compareRow).Value = Application.Index(results, 0, 4)
    sh.Range("S7:S" & compareRow).Value = Application.Index(results, 0, 5)
 
    Dim valueR As Double, valueP As Double
 
    For j = 1 To UBound(dataC, 1)
        valueR = sh.Cells(j + 6, "R").Value
        valueP = sh.Cells(j + 6, "P").Value
 
        If valueP <> 0 Then
            sh.Cells(j + 6, "S").Value = valueR / valueP
        Else
            sh.Cells(j + 6, "S").Value = "-"
        End If
    Next j
 
    sh.Range("S7:S" & compareRow).NumberFormat = "00.00%"
 
    wb.Close False
    Set sh = Nothing
    Set ws = Nothing
    Set wb = Nothing
    Application.ScreenUpdating = True
End Sub
Может кто оптимизирует вам данный код или новый вам напишет. Удачи.
1
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
05.09.2024, 20:31 11
Я продумывал почти так (тоже один цикл по массиву данных), но чуть иначе, на словаре:
1. циклом по ХХХ собираем словарь клиентов с позицией каждого, и создаём пустой массив на 3 столбца сразу под размер клиентов.
2. цикл по массиву данных, сперва можно проверить что клиент интересует (есть в предварительно собранном словаре), затем проверка на попадание в даты, далее проверки условий и сразу в элементе массива собираем количество успешных проверок каждому клиенту (позиция строки известна, в словаре).
3. выгрузка массива на лист.
Вполне можно всё это делать в UDF, и брать как источник и данные другой закрытой книги.
Пока нет ясного ТЗ с условиями писать код можно только ради собственного интереса - формула говорят что-то неправильно считает...
0
Ученик Нарушитель
233 / 143 / 53
Регистрация: 01.04.2020
Сообщений: 469
05.09.2024, 21:32 12
Hugo121, Приветствую вас! Брал за основу логику формул что были уже на листе а не те что в макросе у ТС записаны. Они чуть разные в макросе, по крайней мере обратил внимание на формулу для колонки P. Посмотрим что скажет Egor55rus.
0
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
05.09.2024, 21:55 13
MikeVol, приветствую! Я не с упрёком, просто рассказал какой алгоритм можно реализовать, что продумал.
По условиям детально не вникал - эти три столбца формула вроде как обработала как написано.
Если Egor55rus решит попросить написать , и детально пояснит условия - при наличии времени могу написать такой вариант. Это если для Windows, у Маков нет словарей, но там можно на коллекциях аналог собирать.
0
0 / 0 / 0
Регистрация: 05.09.2024
Сообщений: 7
06.09.2024, 02:36  [ТС] 14
MikeVol, дико извиняюсь за свою не грамотность, как говорил выше я в этом деле дилетант. Крайне не ловко, но не получается вставить путь к файлу:

Visual Basic
1
2
3
4
5
6
7
Sub CountWithVBA()
    Application.ScreenUpdating = False
 
    ' C:\Users\GurinEV\Desktop\31)Трассовка Автоналивная 405..xlsb
    Dim filePath    As String
    filePath = ThisWorkbook.Path & "" & "31)Трассовка Автоналивная  405..xlsb"
    '    filePath = "C:\Users\GurinEV\Desktop\[31)Трассовка Автоналивная 405..xlsb"
Выскакивает сообщение что файл не найден.
Можете пояснить что я не так делаю?
Спасибо за Ваше участие и стремление помочь. Это очень ценно.
0
Ученик Нарушитель
233 / 143 / 53
Регистрация: 01.04.2020
Сообщений: 469
07.09.2024, 02:11 15
Egor55rus, Я извиняюсь, был занят и небыл интернет. А вы Внимательно всмотритесь в мой код в #10-м посте и на ваш код в посте #14! Вы разницы никакой невидите, ничего не потеряли? Ну не буду я вас ложкой кормить, не моё это. Ничего личного. Удачи.
0
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
07.09.2024, 14:30 16
Вообще тут помню иногда движок форума листинг портил. не помню что именно когда ломал, но было...
0
0 / 0 / 0
Регистрация: 05.09.2024
Сообщений: 7
07.09.2024, 17:54  [ТС] 17
Я не знаю как это произошло, и кто это отредактировал, но я копировал Ваш код и вставлял в сообщение.
Странно конечно....
Ну да ладно. Все равно спасибо.
0
Модератор
Эксперт MS Access
12059 / 4921 / 789
Регистрация: 07.08.2010
Сообщений: 14,399
Записей в блоге: 4
07.09.2024, 17:57 18
Цитата Сообщение от Egor55rus Посмотреть сообщение
ThisWorkbook.Path & "" & "31)Трассовка Автоналивная  405..xlsb"
в этой строке отсутствует обратный слеш между каталогом и собственно именем
0
07.09.2024, 17:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.09.2024, 17:57
Помогаю со студенческими работами здесь

что быстрее - формула или макрос?
Здравствуйте! Появился следующий вопрос: у меня есть таблица тысячи на полторы строчек, 5...

Формула/макрос для выпадающего списка
Есть список в .xls (office 2013) Денисович= Денис= 10 Алексеевич= Алексей = 10 нужно формулой...

Перенос значений с выборочными критериями (макрос -формула?)
Есть файл с упаковочным листом. на первом литсе (форма которую необходимо заполнить) На втором...

Макрос или формула для переноса срок в новые (другие ячейки)
Есть столбец &quot;С&quot; с 3, 4 или 5 строками, нужно чтобы данные в каждой новой строке перенеслись в...

Макрос или формула для расчеты продаж по разным брендам товаров
День добрый, коллеги. Требуется макрос либо подскажите формулу. Имеется таблица с данными о...

Нужен макрос или формула для переноса целых строк на разные листы при выполнение условия
Есть таблица в ней есть 22 столбца и в них разные данные но есть один столбец в котором нужно...

Формула или макрос
Добрый день, может быть у кого-то есть готовое решение или подскажете как сделать такую процедуру....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru