Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Предел скорости массивов VBA, можно ли повысить скорость обработки
 
Привет! Есть маленький код с применением массивов и 2-мя циклами. Вот только скорость обработки 300 тысяч строк составляет 1,5 часа. Железо современное. Известны ли Вам способы ускорить обработку? Отмечу что в условии IF по факту всего 2 совпадения из 300 тыс. Так что тормоза из-за записи больших диапазонов на лист можно сразу отклонить. Следовательно упираемся именно в сам объем, а именно 300 тыс.
Код
Sub test300()
    Dim Arr1()
    Dim Arr2()
    Dim i&
    Dim x&
Application.ScreenUpdating = False

            With Sheets(1)
                Arr1 = .Range(.Cells(1, 1), .Cells(300000, 1)).Value
                Arr2 = .Range(.Cells(1, 2), .Cells(300000, 2)).Value
            End With

                For i = 1 To 300000
                    For x = 1 To 300000
                        If Arr1(i, 1) = Arr2(x, 1) Then
                            ActiveSheet.Cells(x, 3) = "Ok"
                        End If
                    Next
                Next

Application.ScreenUpdating = True
End Sub
Определить количество значений после фильтрации
 
Приветствую коллеги!
Хочу циклом отфильтровать каждый столбец по условию "все что < 30". И следом передать в переменную Y количество тех строк, что остались после заданной фильтрации.
Проблема. Если номер последней строки удается получить через End(xlDown), то как определить номер строки первого значения в отфильтрованном столбце?
Например в приложенном файле, в первом столбце после фильтрации остается два значения, это 1 и 12. То есть Y=2. Однако я пробовал разные варианты и получал либо 4, либо 6.  
Подкиньте какую-нибудь идейку.
Найти дубликаты на основании нескольких значений
 
Приветствую! Подскажите пожалуйста идею как найти дубликаты, если уникальность каждого складывается только из нескольких значений. Например: ИНН+договор+сумма.
То есть одинаковых ИНН может быть 10, как и договоров. Следовательно по идее надо "загонять" все 3 значения в массив и проверять циклом. Но вот тут у меня и тупик - а с чем сравнивать? Значения массива со значениями на листе откуда его (массив) и получили? Но тогда всё 100% будет дубликатами.
Что делать?
Изменено: Radik_82 - 30.07.2016 12:59:55
Переизбыток и нехватка циклов, For Next и его плюсы и недостатки
 
Добрый день. Не могу решить проблему из-за ограничений цикла For Next.
Есть 2 листа, пытаюсь сравнить значения  циклом For Next.
Проблема:
- при совпадении условий оператор закрашивает ячейку и выходит из цикла i  из-за наличия Exit For и переходит к следующей проверке. Однако так как много повторяющихся значений, то в следующий цикл он опять закрашивает тоже самое значение, которое уже закрасил и опять выходит. Итог - вместо 10 одинаковых строк закрашена всего 1.
- убираем цикл  Exit For. В итоге закрашенных значений получаем больше чем должно быть. Оператор находит совпадения и тупо все их красит. Итог - вместо 7 закрашенных и 7 не закрашенных ячеек, получаем все 14 закрашенных.
Прошу подсказать решение. Файл прикрепить не смогу из-за наложенных безопасниками ограничений
Код
Sub Cycle_with_Massive_zalivka_bez_cycles()    Dim Naimenovanie As Variant
    Dim Zalivka As Variant
    Dim MyArray1() As Variant
    Dim MyArray2() As Variant
    Dim j%, i%
    Set Analiz = Sheets(Лист4.Name)
    Set TDSheet = Sheets(Лист3.Name)
    Application.ScreenUpdating = False
   
            With TDSheet
                MyArray1 = .Range(.Cells(1, 2), .Cells(7948, 2)).Value
            End With
 
           With TDSheet
                MyArray2 = .Range(.Cells(1, 12), .Cells(7948, 12)).Value
            End With
 '        Cycle J
            For j = 1 To 7895
                Naimenovanie = Analiz.Cells(j, 2)
                Summa = Analiz.Cells(j, 13)
                Zalivka = Analiz.Cells(j, 2).Interior.Color
                Data = Analiz.Cells(j, 16)
                Nomer_Akta = Analiz.Cells(j, 17)
                Otpravka_s_reestrom = Analiz.Cells(j, 18)
                Na_soglasovanii = Analiz.Cells(j, 19)
               Ispolnitel = Analiz.Cells(j, 20)
                V_Rabote = Analiz.Cells(j, 21)
                Vozvrat = Analiz.Cells(j, 22)
                Primech = Analiz.Cells(j, 23)
'        Cycle i
                    For i = 1 To 7948
                        If MyArray1(i, 1) = Naimenovanie And MyArray2(i, 1) = Summa Then
                            TDSheet.Cells(i, 2).Interior.Color = Zalivka
                            TDSheet.Cells(i, 15) = Data
                            TDSheet.Cells(i, 16) = Nomer_Akta
                            TDSheet.Cells(i, 17) = Otpravka_s_reestrom
                            TDSheet.Cells(i, 18) = Na_soglasovanii
                            TDSheet.Cells(i, 19) = Ispolnitel
                            TDSheet.Cells(i, 20) = V_Rabote
                            TDSheet.Cells(i, 21) = Vozvrat
                            TDSheet.Cells(i, 22) = Primech
                        Exit For
                        End If
                    Next i
           Next j
        Application.ScreenUpdating = True
End Sub
Двойной цикл For Next
 
Приветствую! Товарищи, я споткнулся буквально на ровном месте.
Казалось бы простейшая задача, взять 167 значений с Лист2 и сравнить их со 180-ю значениями Лист 1. Там где произошло совпадение, закрасить ячейку на Лист1.
Однако,
в первом случае (с Exit For) закрашенных ячеек получается очень мало - потому что одинаковых значений на Листах по 4-5 и когда второй цикл К  начинает проверку заново, то он опять закрашивает ячейку, которую закрасил в прошлый цикл и выходит согласно оператору Exit;
во втором случае (без Exit For)  получается 172 закрашенных ячеек, но это неправильно, потому что должно быть 167.

Сам цикл:
Код
For i = 1 To 167
Naimenovanie = Sheets(2).Cells(i,2)
Summa = Sheets(2).Cells(i,9)

For k = 1 To 180
Naimenovanie2 = Sheets(1).Cells(k,2)
Summa2 = Sheets(1).Cells(k,13)
If  Naimenovanie = Naimenovanie2 And Summa = Summa2 Then
Sheets(1).Cells(k,2).Interior.Color = 15773696
Exit For
End If
Next k
Next i
VBA: как отделить от левого значения известное правое?, Left, Right, VBA
 
Приветствую!
Есть значения в ячейках вида:

Накладная № Т555002 от 09.05.2015

Пытаюсь в VBA разбить его на 2 ячейки, в одной наименование а в другой дата соответственно.
Дату удалось забрать как  Right(DataStr, 10)
Посоветуйте как отделить наименование Накладная № Т555002. Ведь это значение не постоянной длины и бывает имеет вид: Накладная № 2
На ум приходит отнять от всего стрингового значения количество правых символов, а именно 13  (имеется ввиду "от 09.05.2015"), потому что это значение точно всегда постоянно. Соответственно то, что остается с лева вставляем в ячейку. Вот только не соображу как это реализовать.
Изменено: Radik_82 - 04.02.2016 11:57:20
Цикл при создании файлов пропускает строки, Код во время For Next пропускает часть данных
 
Приветствую и прошу помощи!
Есть 5 тысяч строк с данными. Пытаюсь их разбить на отдельные файлы по 21 строк каждый. Однако создается всего чуть более 100 файлов, хотя по логике их должно быть 238 ( 5000 / 21 = 238). Открывал созданные файлы и видел что действительно часть данных макрос пропускает.
Код прилагаю, понимаю что не очень хорош, так как пытался быстро и "грязно" решить задачу.  
Логика была следующая: как только из массива кидаем данные в шаблон ArtAlex.xlsx, то следом возвращаемся в файл Vecher.xlsm и удаляем верхнею строку, и так 21 раз, чтобы в следующем большом цикле взять в массив 21 новых данных. И так 238 раз.

p.s. Файл не могу прикрепить из-за корпоративных IT ограничений
Код
Sub Cycle_with_Massive_zalivka_bez_cycles()
    Dim Naimenovanie As Variant
    Dim i%, j%
    Set Analiz = Workbooks("Vecher.xlsm").Sheets(Лист1.Name)
    Set TDSheet = Workbooks("ArtAlex.xlsx").Sheets("стр2 (2)")
    Application.ScreenUpdating = False

    For j = 1 To 238

'       Загружаем данные в массив

            With Analiz
                Naimenovanie = .Range(.Cells(1, 2), .Cells(21, 2)).Value
                Serial = .Range(.Cells(1, 7), .Cells(21, 7)).Value
                Postavchik = .Range(.Cells(1, 3), .Cells(21, 3)).Value
                Nomer_Dogovora = .Range(.Cells(1, 5), .Cells(21, 5)).Value
                Data_Dogovora = .Range(.Cells(1, 6), .Cells(21, 6)).Value
                Nomer_Scheta = .Range(.Cells(1, 11), .Cells(21, 11)).Value
                Data_Scheta = .Range(.Cells(1, 12), .Cells(21, 12)).Value
                Nomer_Nacladnaya = .Range(.Cells(1, 4), .Cells(21, 4)).Value
                Summa = .Range(.Cells(1, 13), .Cells(21, 13)).Value
            End With

'     Кидаем данные из массива в шаблон TDSheet

            For i = 1 To 21
                            TDSheet.Cells(i + 3, 3) = Naimenovanie(i, 1)
                            TDSheet.Cells(i + 3, 4) = Serial(i, 1)
                            TDSheet.Cells(i + 3, 7) = Postavchik(i, 1)
                            TDSheet.Cells(i + 3, 8) = Nomer_Dogovora(i, 1)
                            TDSheet.Cells(i + 3, 9) = Data_Dogovora(i, 1)
                            TDSheet.Cells(i + 3, 10) = Nomer_Scheta(i, 1)
                            TDSheet.Cells(i + 3, 11) = Data_Scheta(i, 1)
                            TDSheet.Cells(i + 3, 12) = Nomer_Nacladnaya(i, 1)
                            TDSheet.Cells(i + 3, 17) = Summa(i, 1)
             Next i
'        Удаляем 21 строку с данными

             For r = 1 To 21
                Analiz.Rows(1).Delete
             Next r

'        Сохраняем  шаблон с именем Иванов и время текущее
           
                    Workbooks("ArtAlex.xlsx").Activate
                    strPath = "C:\Users\Отчеты Еженедельные\февраль"
                    On Error Resume Next
                    x = GetAttr(strPath) And 0
                    If Err = 0 Then
                        strDate = Format(Now, "hh-mm-ss-ms")
                        FileNameXls = strPath & "\" & "Иванов " & " " & strDate & ".xlsx"
                        ActiveWorkbook.SaveCopyAs Filename:=FileNameXls
                    Else
                        MsgBox "Папка " & strPath & " недоступна или не существует!", vbCritical
                    End If
    Next j
        Application.ScreenUpdating = True
End Sub
Изменено: Radik_82 - 03.02.2016 12:09:14
Interior.ColorIndex не соблюдает оператор And
 
Добрый день. Есть условие вида

If .Cells(NextRow, 24).Interior.ColorIndex = 43 And .Cells(PriorRow, 24).Interior.ColorIndex = 43 And .Cells(PriorRow - 1, 24).Interior.ColorIndex = 22 Then
...
Проблема в том, что если все 3 значения имеют заливку = 43, то оператор все равно "хавает" условие выше, как буд-то в последнем условии не 22, а тоже 43. И все это при жестком условии And.
Смена ColorIndex на Color тоже не дало результата.
Interior.Color не различает заливку ячейки условным форматированием
 
Всем привет!
По условию я задал заливку на ячейки (красную и зеленую). То есть я воспользовался функцией условное форматирование, где например если значение в ячейке меньше 0, то красным, если больше то зеленым.
Так вот,  "? ActiveCell.Interior.Color " не различает цвета заливки! Что красную, что зеленую заливку он отображает одинаково как 5296274.
Кто нибудь сталкивался?
Как отключить адресацию на ячейки через имена элементов?
 
Приветствую. Как известно в умных таблицах можно адресоваться к ячейкам не как например =A1<>B1, а как =Таблица3[[#Эта строка];[Столбец1]]

Вопрос в том, как отключить второй способ? Уж больно для меня он неудобный, при множестве условий и говорить нечего. Короче нужна именно классика, чтоб A1<>B1 :)
Изменено: Radik_82 - 21.11.2015 21:55:04
СРЗНАЧ в умной таблице не протягивается вслед за данными
 
Приветствую!
Столкнулся в проблемой где СРЗНАЧ в умной таблице не протягивается вслед за данными. То есть я вставляю значения в последнею строку, но вместо вычисления функции, она мне возвращает ошибку =#ССЫЛКА!. Подскажите кто сталкивался с подобным. Пример внутри.
Серийные номера разнести из одной в разные ячейки
 
Приветствую! В ячейке тупой пользователь умудрился внести номера без знаков разъеденения
То есть имеем значение FNS152807FMFNS15281BBV
Как видим в строке 2 серейника (их я разделил цветом).
Вопрос, как теперь вытащить по отдельным ячейкам значение каждого серийника? Их в таком виде может быть и по 10 в одной строке.
Обратный порядок чисел со сдвигом, Сдвиг чисел в умной таблице
 
Приветствую, товарищи! Споткнулся на казалось бы простейшей задачи.
В столбце 2 с помощью простейшей формулы =B13+1 до верхней строки растянуты числа в порядке возрастания.
Когда в последнюю ячейку столбца 1 добавляется новое число, то во 2-м столбце остается пустое значение, но надо чтобы  оно становилось 1-м, а соотвеnственно верхнее стало 13 (вместо 12). Есть какие-нибудь мысли?

Оператор VBA: Обновить Все
 
Привет. Хочу обновлять данные из .txt
Пока получается что надо нажимать кнопку "Обновить Все" (см. скрин)
Подскажите пожалуйста, какой код в ВБА вызывает действия аналогичные этой?

После Call процедура завершается преждевременно из-за Exit For
 
Доброго времени суток, форум.
UPDATE: прошу смотреть сообщения ниже
Код
Sub главная процедура()
...
код
...
        Select Case OneDay
            Case Is < Zima2013: Call Handler1
            Case Is >= Zima2013 And OneDay < Vesna2014: Call Handler2
            Case Is >= Vesna2014 And OneDay < Zima2014: Call Handler1
            Case Is >= Zima2014 And OneDay < Vesna2015: Call Handler2
            Case Is >= Vesna2015: Call Handler1:
        End Select
End sub
Условие совпало, и вызвало Handler1
Код
Sub Handler1()
                For i = Start To Finish
                    StartTimeAM = i
                    If Cells(i, 2) > OpenStart Then Exit For Else: StartTimeAM = 0
                Next i
                For i = Start To Finish
                    If Cells(i, 2) > OpenFinish Then Exit For
                    FinishTimeAM = i
                Next i
                    If StartTimeAM = 0 Then Cells(NextRow, 10) = [b1] _
                    Else: Cells(NextRow, 10) = WorksheetFunction.Average(Range("C" & StartTimeAM & ":C" & FinishTimeAM))
                For i = Finish To Start Step -1
                    StartTimePM = i
                    If Cells(i, 2) < CloseStart Then Exit For Else: StartTimePM = 0
                Next i
    
                For i = StartTimePM To Finish
                    If Cells(i, 2) > CloseFinish Then Exit For
                    FinishTimePM = i
                Next i
                    Cells(NextRow, 13) = WorksheetFunction.Average(Range("F" & StartTimePM & ":F" & FinishTimePM))
End Sub

Upd: Неактуально -
Проблема в том,  что как только оператор входит в If Cells(i, 2) > OpenStart Then Exit For, то процедура Handler1 завершается и происходит возврат в главную процедуру, но надо чтобы код Handler1 исполнился от начала до конца.
Прошу подсказать в чем ошибка. Ведь условие Exit For , а происходит все так, буд-то там прописано Exit Sub  
Изменено: Radik_82 - 24.08.2015 15:52:43
Сравнить значения на двух листах и при их совпадении  закрасить ячейку, неправильный оператор в цикле
 
Доброго времени суток, форум. Написал код с массивами и циклами.
Казалось бы простая задача - сравнить значения на двух листах и при их совпадении  закрасить ячейку на Листе3.
Значений на Листе4  всего 273, но после выполнения процедуры на Лист3 закрашивается аж 366 ячеек, чего не должно быть в принципе (ведь значений цикла j всего 273).
То есть ошибка в том, что цикл i проводит сравнения 13390 раз и логично что при совпадении условия он еще раз закрашивает такое же значение, но это лишнее. Помогите поменять подход.
Код
Sub Cycle_with_Massive_zalivka()    
    Dim Naimenovanie As String
    Dim Suma As Variant
    Dim Zalivka As Variant
    Dim MyArray1(1 To 13390) As Variant
    Dim MyArray2(1 To 13390) As Variant
    Application.ScreenUpdating = False
 
            For i = 1 To 13390
                MyArray1(i) = Sheets(Лист3.Name).Cells(i, 2)
            Next i
 
            For i = 1 To 13390
                MyArray2(i) = Sheets(Лист3.Name).Cells(i, 13)
            Next i
           
                For j = 1 To 273
                Naimenovanie = Sheets(Лист4.Name).Cells(j, 2)
                Suma = Sheets(Лист4.Name).Cells(j, 13)
                Zalivka = Sheets(Лист4.Name).Cells(j, 13).Interior.Color
                    For i = 1 To 13390
                    If MyArray1(i) = Naimenovanie And MyArray2(i) = Suma Then
                    Sheets(Лист3.Name).Cells(i, 13).Interior.Color = Zalivka
                    End If
                Next i
        Next j
        Application.ScreenUpdating = True
End Sub
Ошибка при получении СРЗНАЧ, VBA
 
Добрый день!
Есть столбец с данными, нужно вычислить среднее значение. Однако получаю ошибку.
Хотя если руками вбить от фонаря цифры и попытаться вычислить те же функции, то все работает.
Что это может быть?
Из одного Range получить диапазон второго Range, На основании сформированного Range, задать границы второго дапазона
 
Приветствую! Прошу помощи.
В столбце С значения времени. Из них нужен диапазон от  10:00:01 до 10:00:05. На основании этого диапазона необходимо сослаться на значения в следующем столбце, то есть в D.
Проблема в том, что значения в столбце С не постоянны, и если в данном примере 5 секунд "расползлись" по С2:С98, то в следующий раз может быть С2:С150.

Вот написал код:
Код
Sub AvgRangeMy()
    AvgRange = Sheets(Лист1.Name).UsedRange.Columns(3)
        For Each x In AvgRange
            If x >= "10:00:01" And x <= "10:00:05" Then
                Range("G3") = WorksheetFunction.Average(Range("D2:D98"))
                Exit For
            End If
        Next
End Sub

Другими словами мне нужно чтобы вместо (Range("D2:D98") у меня подставлялись границы диапазона "10:00:01" And "10:00:05"  
Изменено: Radik_82 - 21.07.2015 22:33:01
Перемещение функций при удалении строк
 
Есть таблица из которой периодически удаляются строки. Есть функции обсчитывающие эту таблицу. Проблема в том что при удалении строк ячейка с функцией (например В2001 и D2001) поднимаются выше и приобретают другой порядковый номер (B1998 как пример). Из-за чего в других функциях получаем ошибки, так как они ссылаются на В2001 и D2001. Как это обойти? Спасибо.    
Совпало условие VBA = вставить значение в строку где было совпадение
 
Написал код в VBA (файлик прикрепил).
Суть его проста - он последовательно обрабатывает каждую строку с ценой акции и при совпадении определенных условий выдает MsgBox.
Подскажите что прописать в коде, чтобы вместо MsgBox макрос вставлял значение именно в той строке, где произошло совпадение условий оператора If-Then.
Изменено: Radik_82 - 14.02.2015 14:38:51
Как обойти подсчет динамических нулей в умной таблице?, Нули в умной таблице приводят к неправильным вычислениям
 
Всем доброго дня. Помогите решить следующую проблему.
В столбцы А,В и С ежеминутно автоматически поступают новые данные из внешнего источника (см. рисунок).
В столбцах D и E производятся расчеты: =B3/B2 и =C3/C2 соответственно.
Все это объединено в умную таблицу, чтобы расчеты в D и E автоматом "подтягивались" за В и С.
В чем суть. На последней строке этой таблицы есть нули (см. рис) и проблема в том что когда начинаешь высчитывать ковариацию, то вычисления учитывают эти нули и в результате конечные результаты получаются неверные!  Подскажите как это можно обойти.

Страницы: 1
Наверх