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

Страницы: 1 2 3 След.
Получить номер последней строки заданного листа из другой книги, Workbooks.Open
 
Vanin00, Спасибо вам.
Получить номер последней строки заданного листа из другой книги, Workbooks.Open
 
Здравствуйте Уважаемые специалисты,

Помогите с кодом.
Как получить номер последней строки заданного листа в другой книге?

Код
Sub LastRowCheck()
    
    Dim File As Object
    Set File = Application.FileDialog(msoFileDialogFilePicker)
    With File
        .Filters.Clear
        .Filters.Add "Excel Files", "*.xls*"
        If .Show <> -1 Then Exit Sub
        [A1] = .SelectedItems(1)
    End With
    
    Dim P As String: P = [A1]
    Dim WS As Object: WS = [A2]
    Set WS = ActiveWorkbook.Worksheet.Name
    
    Application.ScreenUpdating = False
    Workbooks.Open P
    [A3] = WS.Cells(Rows.Count, 4).End(xlUp).Row 'Здесь не работает...
    ActiveWorkbook.Close False
    Application.ScreenUpdating = True
    
End Sub
Макрос для Суммеслимн в памяти, Суммеслимн из другого листа
 
Здравствуй уважаемые,

Можно ли сделать так, чтобы суммировались если столбцы и строки отвечают условиям.
В строках идут наименования, а сверху в столбцах даты.

Файл с примером прикрепляю.
Изменено: Шерзод Маткаримов - 05.11.2024 14:38:17
Макрос для Суммеслимн в памяти, Суммеслимн из другого листа
 
           

Попробовал так. Сработало.
Код
If ARR(X, 1) <> 0 Then ARR(X, 6) = ARR(X, 7) / ARR(X, 1)
If ARR(X, 1) <> 0 Then ARR(X, 8) = ARR(X, 9) / ARR(X, 1)
If ARR(X, 1) <> 0 Then ARR(X, 10) = ARR(X, 11) / ARR(X, 1)
Макрос для Суммеслимн в памяти, Суммеслимн из другого листа
 
Цитата
написал:
Что в этот момент в ARR(X, 1) и ARR(X, 4)? Вангую что 0
Все кроме этих 3х заполняются. Числа делятся на числа, нулей нет.
Макрос для Суммеслимн в памяти, Суммеслимн из другого листа
 
Здравствуйте Hugo и все специалисты,

Помогите исправить ошибку.

Эти строки кода выдают ошибку run-time error '6' Overflow
Код
ARR(X, 6) = ARR(X, 7) / ARR(X, 1)
ARR(X, 8) = ARR(X, 9) / ARR(X, 1)
ARR(X, 10) = ARR(X, 11) / ARR(X, 1)


Код
Sub SIMIFSINARRAY3()

Dim T As Double: T = Now
Dim SH1 As Worksheet, SH2 As Worksheet, I1 As Variant, I2 As Variant, ARR As Variant, R1 As Long, R2 As Long
Dim I As Long, D As Object, TMP$, X&

Set SH1 = Sheets("22")
R1 = SH1.Range("D" & Cells.Rows.Count).End(xlUp).Row
I1 = SH1.Range("D14:AH" & R1).Value
  
Set SH2 = Sheets("33")
R2 = SH2.Range("D" & Cells.Rows.Count).End(xlUp).Row
I2 = SH2.Range("C25:O" & R2).Value
  
    ReDim ARR(1 To UBound(I2, 1), 1 To 11)
      
    Set D = CreateObject("Scripting.Dictionary"): D.comparemode = 1
  
    For I = 1 To UBound(I2)
        D.Item(I2(I, 1) & I2(I, 2)) = I
    Next
  
    For I = 1 To UBound(I1)
      If I1(I, 31) > 4 And I1(I, 31) < 9 Then
        TMP = I1(I, 1) & I1(I, 2)
        If D.exists(TMP) Then
            X = D.Item(TMP)
            ARR(X, 2) = ARR(X, 2) + I1(I, 4)
            ARR(X, 4) = ARR(X, 4) + I1(I, 6)
            ARR(X, 7) = ARR(X, 7) + I1(I, 19)
            ARR(X, 9) = ARR(X, 9) + I1(I, 20)
            ARR(X, 11) = ARR(X, 11) + I1(I, 6)
            If ARR(X, 7) = 0 Then
            ARR(X, 7) = ARR(X, 7) + I1(I, 6)
            ARR(X, 9) = ARR(X, 9) + I1(I, 6)
            End If
            ARR(X, 1) = ARR(X, 4) / ARR(X, 2)
            ARR(X, 3) = ARR(X, 2) - (ARR(X, 6) - ARR(X, 8))
            ARR(X, 5) = ARR(X, 4) - (ARR(X, 7) - ARR(X, 9))
            
            'ARR(X, 6) = ARR(X, 7) / ARR(X, 1) 'Строка с ошибкой run-time error '6' Overflow
            'ARR(X, 8) = ARR(X, 9) / ARR(X, 1)
            'ARR(X, 10) = ARR(X, 11) / ARR(X, 1)
        End If
      End If
    Next
    SH2.Range("E25").Resize(UBound(ARR, 1), 11).Value = ARR


MsgBox Now - T
End Sub
Макрос для Суммеслимн в памяти, Суммеслимн из другого листа
 
Hugo, Проверил. Не критично. Всё как надо. В листе где суммируется итоги, не будут дублей. Спасибо.
Макрос для Суммеслимн в памяти, Суммеслимн из другого листа
 
Hugo, Супер. Проверил на 100 тыс. строк. Моментально обработал.

Спасибо огромное.
Макрос для Суммеслимн в памяти, Суммеслимн из другого листа
 
Цитата
написал:
If UCase(I2(I, 1)) = UCase(I1(J, 1)) Then
Я принципы работы массивов, и вообще VBA плохо знаю. Я просто поэкспериментировал, и этот код сократил время на 4 сек.

Цитата
написал:
У меня отрабатывает за 8 секунд.
У меня Win10/Excel16

Цитата
написал:
Сейчас гляну что можно ускорить
Спасибо.
Макрос для Суммеслимн в памяти, Суммеслимн из другого листа
 
Забыл макрос, когда переносил данные в отдельный файл.

Сейчас на отдельном листе идёт пересчёт с формулами и результат переносится в нужный лист. Там суммеслимн на 6 столбцах и 3000 строк. Этот лист весит 350 кб. и наверняка влияет на скорость всего файла. Хотел, проверить как будет, если полностью сделать макросом.
Макрос для Суммеслимн в памяти, Суммеслимн из другого листа
 
Время выполнения сократилось до 15 сек на 100 000 строк.

Хотелось бы ускорить еще.
Макрос для Суммеслимн в памяти, Суммеслимн из другого листа
 
А можно этот код, как то ускорить? Протестил на 100 000 строк, выполнилось за 2 мин.
Макрос для Суммеслимн в памяти, Суммеслимн из другого листа
 
Hugo, Спасибо огромное. Работает.
Макрос для Суммеслимн в памяти, Суммеслимн из другого листа
 
Возник другой вопрос, по этому же коду. При суммировании, отбрасывает копейки.

Добавил этот код перед выгрузкой, но он не исправил проблему
Код
SH2.Range("J2").Resize(UBound(ARR, 1), 1).NumberFormat = "@"

Помогите исправить.
Макрос для Суммеслимн в памяти, Суммеслимн из другого листа
 
Всё. Вопрос снят. Только что заметил свою ошибку.

Если, в коде что то не нужное, или можно улучшить. Буду рад всем замечаниям.
Изменено: Шерзод Маткаримов - 03.11.2024 09:58:42
Макрос для Суммеслимн в памяти, Суммеслимн из другого листа
 
Здравствуйте Все,

Есть код Суммеслимн, но он работает только для одного листа, т.е. и диапазон суммирование и условие находятся на одном листе.

Как, сделать, чтобы суммировал диапазон из другого листа?

Вот код, который нужно исправить.

Файл с кодом в приложении.

Код
Sub SIMIFSINARRAY2() 
Dim SH1 As Worksheet, SH2 As Worksheet, I1 As Variant, I2 As Variant, ARR As Variant, R1 As Long, R2 As Long
Dim I As Long, J As Long, pCount As Long, D As Object

  Set SH1 = Sheets("22")
  R1 = SH1.Range("A" & Cells.Rows.Count).End(xlUp).Row
  I1 = SH1.Range("A2:J" & R1).Value
  
  Set SH2 = Sheets("33")
  R2 = SH2.Range("H" & Cells.Rows.Count).End(xlUp).Row
  I2 = SH2.Range("H2:J" & R2).Value
  
  
  ReDim ARR(1 To UBound(I1, 1), 1 To 1)
  ReDim ARR(1 To UBound(I2, 1), 1 To 1)
  Set D = CreateObject("Scripting.Dictionary")

  For I = 1 To R2 - 1
    If Not D.Exists(UCase(I2(I, 8 & I2(I, 9))) Then
        For J = 1 To R1 - 1
            If UCase(I2(I, 8) = UCase(I1(J, 1)) And _
                   UCase(I2(I, 9)) = UCase(I1(J, 2)) Then
                pCount = pCount + I1(J, 3)
            End If
        Next J
        D(UCase(I2(I, 8 & I2(I, 9))) = pCount
        ARR(I, 1) = pCount: pCount = 0
    Else
        ARR(I, 1) = D(UCase(I2(I, 8 & SH2(I, 9)))
    End If
  Next
  SH2.Range("J2").Resize(UBound(ARR, 1), 1).Value = ARR
End Sub
Замена английских букв на русские, Скорость выполнения макроса
 
Alex_ST, Спасибо за другие варианты кода.

Я вспомнил что была такая же ошибка в одном CopyPaste коде. Добавил код перед выгрузкой данных из памяти, для изменения формата чисел.
Код
Sub REPCHAR()Dim T As Double: T = Now
    
    Dim DATA As Variant, LC As Long, R As Long, C As Long
    With ActiveSheet
        LC = .Cells(.Rows.Count, "D").End(xlUp).Row
        DATA = .Range("D1:E" & LC).Value
        For R = LBound(DATA, 1) To UBound(DATA, 1)
            For C = LBound(DATA, 2) To UBound(DATA, 2)
                DATA(R, C) = Replace(DATA(R, C), "A", "А")
                DATA(R, C) = Replace(DATA(R, C), "B", "В")
                DATA(R, C) = Replace(DATA(R, C), "E", "Е")
                DATA(R, C) = Replace(DATA(R, C), "K", "К")
                DATA(R, C) = Replace(DATA(R, C), "M", "М")
                DATA(R, C) = Replace(DATA(R, C), "H", "Н")
                DATA(R, C) = Replace(DATA(R, C), "O", "О")
                DATA(R, C) = Replace(DATA(R, C), "P", "Р")
                DATA(R, C) = Replace(DATA(R, C), "C", "С")
                DATA(R, C) = Replace(DATA(R, C), "X", "Х")
                DATA(R, C) = Replace(DATA(R, C), "T", "Т")
            Next C
        Next R
        .Range("D1").Resize(R).NumberFormat = "@"
        .Range("E1").Resize(R).NumberFormat = "@"
        .Range("D1:E" & LC).Value = DATA
    End With

MsgBox Now - T
End Sub
Изменено: Шерзод Маткаримов - 02.11.2024 08:53:31 (Орфография)
Замена английских букв на русские, Скорость выполнения макроса
 
Здравствуйте,

Сейчас обнаружил, что после выполнения процедуры числа с запятыми 123,456789 меняются на 123456789. т.е. запятые удаляются. Если после запятой 2 цифры (123,12) то всё нормально, а если три и больше то запятая теряется.

Как можно исправить?
Код
Sub REPCHAR()Dim T As Double: T = Now
    
    Dim DATA As Variant, LC As Long, R As Long, C As Long
    With ActiveSheet
        LC = .Cells(.Rows.Count, "D").End(xlUp).Row
        DATA = .Range("D1:E" & LC).Value
        For R = LBound(DATA, 1) To UBound(DATA, 1)
            For C = LBound(DATA, 2) To UBound(DATA, 2)
                DATA(R, C) = Replace(DATA(R, C), "A", "А")
                DATA(R, C) = Replace(DATA(R, C), "B", "В")
                DATA(R, C) = Replace(DATA(R, C), "E", "Е")
                DATA(R, C) = Replace(DATA(R, C), "K", "К")
                DATA(R, C) = Replace(DATA(R, C), "M", "М")
                DATA(R, C) = Replace(DATA(R, C), "H", "Н")
                DATA(R, C) = Replace(DATA(R, C), "O", "О")
                DATA(R, C) = Replace(DATA(R, C), "P", "Р")
                DATA(R, C) = Replace(DATA(R, C), "C", "С")
                DATA(R, C) = Replace(DATA(R, C), "X", "Х")
                DATA(R, C) = Replace(DATA(R, C), "T", "Т")
            Next C
        Next R
        .Range("D1:E" & LC).Value = DATA
    End With


MsgBox Now - T
End Sub
Оптимизация макроса(ускорение) по удалению лишних символом
 
Дмитрий(The_Prist) Щербаков,

Попробовал. Работает. Спасибо.
Изменено: Шерзод Маткаримов - 31.10.2024 11:19:57
Оптимизация макроса(ускорение) по удалению лишних символом
 
МатросНаЗебре, Спасибо большое. Работает.
Оптимизация макроса(ускорение) по удалению лишних символом
 
Здравствуйте друзья,

Следующий макрос для удаления символом кроме цифр и букв выполняется за 10 сек. на 100 тыс. строках. Хочу переделать в массивный код. Не получается. Помогите исправить. Файл приложен.
Код
Sub CleanNow()
Dim T As Double: T = Now
FASTBEGIN 'отключаем свойства для быстродействия

    Dim RNG As Range
    Dim LC As Long: LC = Cells(Rows.Count, "D").End(xlUp).Row
    For Each RNG In Range("D1:E" & LC).Cells
        RNG.Value = AlphaNumeric(RNG.Value)
    Next RNG

FASTEND 'включаем свойства
MsgBox Now - T
End Sub

Public Function AlphaNumeric(str As String) As String
    Dim I As Long
    For I = 1 To Len(str)
        If InStr(1, "0123456789АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ", Mid(str, I, 1)) Then AlphaNumeric = AlphaNumeric & Mid(str, I, 1)
    Next
End Function

Попробовал так:  
Код
Dim DATA As Variant, LC As Long, R As Long, C As Long
    With ActiveSheet
        LC = .Cells(.Rows.Count, "D").End(xlUp).Row
        DATA = .Range("D1:E" & LC).Value
        For R = LBound(DATA, 1) To UBound(DATA, 1)
        For C = LBound(DATA, 2) To UBound(DATA, 2)
                DATA(R, C) = AlphaNumeric(DATA(R, C))
        Next C
        Next R
        .Range("D1:E" & LC).Value = DATA
    End With
Изменено: Sanja - 31.10.2024 11:02:05 (Изменил название темы)
Замена английских букв на русские, Скорость выполнения макроса
 
Всем спасибо за ответы. Решение найдено.
Делюсь результатом. Обрабатывает 100 000 строк за 2 сек.
Код
Sub REPCHAR()
Dim T As Double: T = Now
    
    Dim DATA As Variant, LC As Long, R As Long, C As Long
    With ActiveSheet
        LC = .Cells(.Rows.Count, "D").End(xlUp).Row
        DATA = .Range("D1:E" & LC).Value
        For R = LBound(DATA, 1) To UBound(DATA, 1)
            For C = LBound(DATA, 2) To UBound(DATA, 2)
                DATA(R, C) = Replace(DATA(R, C), "A", "А")
                DATA(R, C) = Replace(DATA(R, C), "B", "В")
                DATA(R, C) = Replace(DATA(R, C), "E", "Е")
                DATA(R, C) = Replace(DATA(R, C), "K", "К")
                DATA(R, C) = Replace(DATA(R, C), "M", "М")
                DATA(R, C) = Replace(DATA(R, C), "H", "Н")
                DATA(R, C) = Replace(DATA(R, C), "O", "О")
                DATA(R, C) = Replace(DATA(R, C), "P", "Р")
                DATA(R, C) = Replace(DATA(R, C), "C", "С")
                DATA(R, C) = Replace(DATA(R, C), "X", "Х")
                DATA(R, C) = Replace(DATA(R, C), "T", "Т")
            Next C
        Next R
        .Range("D1:E" & LC).Value = DATA
    End With


MsgBox Now - T
End Sub
Замена английских букв на русские, Скорость выполнения макроса
 
irabel, Всё еще только одну "Т" заменяет. И почему только "Т"? Попробовал поставить строку с "Т" и в начале, и в середину списка, но обрабатывает только "Т". Может надо очистить память, в конце?
Изменено: Шерзод Маткаримов - 30.10.2024 13:05:53
Замена английских букв на русские, Скорость выполнения макроса
 
Спасибо за ответы. Сделал обработку в памяти, но я плохо разбираюсь в массивах. Сейчас заменяет только одну букву (последнюю строку "Т"). Как исправить, чтобы заменить все 11 букв?
Код
Sub REPCHAR()
    Dim Massive(2), DATA As Variant, RES As Variant, LC As String, I As Long, N As Long
    Dim Dic: Set Dic = CreateObject("Scripting.Dictionary")
    
    With Sheets("1")
    LC = .Cells(.Rows.Count, "D").End(xlUp).Row
    DATA = .Range("D1:E" & LC).Value
    RES = .Range("D1:E" & LC).Value
    For I = 1 To 2
        If Not Dic.Exists(DATA(I, 2)) Then
            Massive(2) = Replace(DATA(I, 2), "A", "А")
            Massive(2) = Replace(DATA(I, 2), "B", "В")
            Massive(2) = Replace(DATA(I, 2), "E", "Е")
            Massive(2) = Replace(DATA(I, 2), "K", "К")
            Massive(2) = Replace(DATA(I, 2), "M", "М")
            Massive(2) = Replace(DATA(I, 2), "H", "Н")
            Massive(2) = Replace(DATA(I, 2), "O", "Щ")
            Massive(2) = Replace(DATA(I, 2), "P", "Р")
            Massive(2) = Replace(DATA(I, 2), "C", "С")
            Massive(2) = Replace(DATA(I, 2), "X", "Х")
            Massive(2) = Replace(DATA(I, 2), "T", "Т")
            Dic(DATA(I, 2)) = Massive
        End If
    Next I
    For N = 1 To UBound(DATA)
        On Error Resume Next
            RES(N, 1) = Dic(DATA(N, 2))(2)
        On Error GoTo 0
    Next N
    
    .Range("D1:E" & LC) = RES
    End With
End Sub
Замена английских букв на русские, Скорость выполнения макроса
 
Hugo, Так работает быстрее. За 10 сек. обработал 100 000 строк. Спасибо.
Замена английских букв на русские, Скорость выполнения макроса
 
nilske, В макросах не очень разбираюсь. Можете, дать ссылку на такие примеры?  
Замена английских букв на русские, Скорость выполнения макроса
 
Здравствуйте уважаемые специалисты,

Есть код для замены английских букв на похожие русские, но на больших данных макрос выполняется 25 сек. Хотелось бы быстрый вариант макроса. Буду признателен если сможете помочь.
Код
Sub ReplaceMe()
Dim T As Double: T = Now

On Error Resume Next
With Sheets("1")
    Dim LC As Long: LC = .Cells(Rows.Count, "D").End(xlUp).Row
    Dim RNG As Range
    For Each RNG In .Range("D1:E" & LC)

    If InStr(1, RNG, "A") > 0 Then RNG.Value = Replace(RNG, "A", "А")
    If InStr(1, RNG, "B") > 0 Then RNG.Value = Replace(RNG, "B", "В")
    If InStr(1, RNG, "E") > 0 Then RNG.Value = Replace(RNG, "E", "Е")
    If InStr(1, RNG, "K") > 0 Then RNG.Value = Replace(RNG, "K", "К")
    If InStr(1, RNG, "M") > 0 Then RNG.Value = Replace(RNG, "M", "М")
    If InStr(1, RNG, "H") > 0 Then RNG.Value = Replace(RNG, "H", "Н")
    If InStr(1, RNG, "O") > 0 Then RNG.Value = Replace(RNG, "O", "О")
    If InStr(1, RNG, "P") > 0 Then RNG.Value = Replace(RNG, "P", "Р")
    If InStr(1, RNG, "C") > 0 Then RNG.Value = Replace(RNG, "C", "С")
    If InStr(1, RNG, "T") > 0 Then RNG.Value = Replace(RNG, "T", "Т")
    Next RNG
End With

MsgBox Now - T
End Sub
Поиск часть текста и полное совпадение, Частичное и полное совпадение значений
 
МатросНаЗебре, Спасибо большое. Работает.
Поиск часть текста и полное совпадение, Частичное и полное совпадение значений
 
Здравствуйте Уважаемые,

Нужна помощь. Есть код и в нём идёт поиск значений в 5ти столбцах, если часть текста найдена в списке.
в 5м столбце нужно производит точное совпадение

If InStr(1, Left(aListDB(I, 2), 2), aBaseDB(N, 5)) > 0 Then 'Здесь нужно точное совпадение

Помогите исправить код, пожалуйста.

Код
Sub PUTPRICECATPART()
    Dim aBaseDB(), aListDB(), aRes()
    Dim lRw As Long, I As Long, N As Long
    
    With Sheets("КАТАЛОГ")
        lRw = .Cells(.Rows.Count, 1).End(xlUp).Row 'последняя строка в столбце А
        aBaseDB = .Range("A1:G" & lRw).Value 'берём в массив все данные с листа, включая цену
    End With
    With Sheets("РЕСУРС")
        lRw = .Cells(.Rows.Count, 3).End(xlUp).Row    'последняя строка в столбце C
        aListDB = .Range("C5:N" & lRw).Value  'берём в массив все данные с листа
        ReDim aRes(1 To UBound(aListDB), 11 To 12)
        lRw = UBound(aBaseDB)
    End With
    'ищем совпадение 4 столбцов в Наименовании
    For I = 1 To UBound(aListDB)
    For N = 1 To lRw
        aRes(I, 11) = aListDB(I, 11)
        aRes(I, 12) = aListDB(I, 12)
            If InStr(1, aListDB(I, 1), aBaseDB(N, 1)) > 0 Then
            If InStr(1, aListDB(I, 1), aBaseDB(N, 2)) > 0 Then
            If InStr(1, aListDB(I, 1), aBaseDB(N, 3)) > 0 Then
            If InStr(1, aListDB(I, 1), aBaseDB(N, 4)) > 0 Then
            If InStr(1, Left(aListDB(I, 2), 2), aBaseDB(N, 5)) > 0 Then 'Здесь нужно точное совпадение
                aRes(I, 11) = aBaseDB(N, 6)
                aRes(I, 12) = aBaseDB(N, 7)
                Exit For
            End If
            End If
            End If
            End If
            End If
        Next N
    Next I
    Sheets("РЕСУРС").Range("M5").Resize(UBound(aRes), 2).Value = aRes
End Sub

Run-time error '5': Ошибка, Неправильный вызов процедуры
 
rbboy, Спасибо большое. Работает без ошибок.
Страницы: 1 2 3 След.
Наверх