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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 27 След.
Показать дни рождения, в ближайшие 45 дней, учитывая все таблицы
 
Код
Option Explicit

Sub nextBirthday_All()
    Dim i           As Long
    Dim iLR         As Long
    Dim ДатаРождения As Date
    Dim Лет         As Integer
    Dim ws          As Worksheet
    Dim iLastRow    As Long

    Dim wsDR        As Worksheet
    Set wsDR = ThisWorkbook.Worksheets("ДР")   ' лист для вывода результатов

    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual

        ' Очистка диапазона на листе "ДР"
        wsDR.Range(wsDR.Cells(2, 1), wsDR.Cells(wsDR.Rows.Count, 9)).ClearContents

        ' Перебор всех листов, кроме "ДР" и "Титульный"
        For Each ws In ThisWorkbook.Worksheets
            
            If ws.Name <> "ДР" And ws.Name <> "Титульный" Then

                ' Находим последнюю заполненную строку в столбце A на текущем листе
                iLastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

                ' Перебор строк
                For i = 2 To iLastRow

                    If ws.Cells(i, "F").Value <> "" And IsDate(ws.Cells(i, "F").Value) Then

                        If DateSerial(Year(Date), Month(ws.Cells(i, "F")), Day(ws.Cells(i, "F"))) - Date >= 0 And _
                                DateSerial(Year(Date), Month(ws.Cells(i, "F")), Day(ws.Cells(i, "F"))) - Date < 45 Then

                            ' Найти следующую пустую строку на листе ДР
                            iLR = wsDR.Cells(wsDR.Rows.Count, "A").End(xlUp).Row + 1

                            ' Копировать значения
                            wsDR.Cells(iLR, "A").Resize(1, 7).Value = ws.Cells(i, "B").Resize(1, 7).Value

                            ' Вычисляем количество лет
                            ДатаРождения = ws.Cells(i, "F").Value
                            Лет = DateDiff("yyyy", ДатаРождения, Date)

                            If Month(Date) < Month(ДатаРождения) Then
                                Лет = Лет - 1
                            ElseIf Month(Date) = Month(ДатаРождения) And Day(Date) < Day(ДатаРождения) Then
                                Лет = Лет - 1
                            End If

                            wsDR.Cells(iLR, "H").Value = Лет
                            wsDR.Cells(iLR, "I").Value = Day(ДатаРождения) & " " & MonthName(Month(ДатаРождения))

                            ' Вспомогательный столбец для сортировки
                            wsDR.Cells(iLR, "J").Value = DateSerial(Year(Date), Month(ДатаРождения), Day(ДатаРождения))

                            If wsDR.Cells(iLR, "J").Value < Date Then
                                wsDR.Cells(iLR, "J").Value = DateSerial(Year(Date) + 1, Month(ДатаРождения), Day(ДатаРождения))
                            End If

                        End If

                    End If
                Next i

            End If

        Next ws

        ' Сортировка на листе "ДР"
        iLR = wsDR.Cells(wsDR.Rows.Count, "A").End(xlUp).Row

        If iLR > 1 Then
            wsDR.Sort.SortFields.Clear

            Dim sortRange As Range
            Set sortRange = wsDR.Range("A2:J" & iLR)

            wsDR.Sort.SortFields.Add Key:=wsDR.Range("J2:J" & iLR), _
                    SortOn:=xlSortOnValues, _
                    Order:=xlAscending, _
                    DataOption:=xlSortNormal
            
            With wsDR.Sort
                .SetRange sortRange
                .Header = xlNo
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
        
        End If

        ' Очистка вспомогательного столбца
        wsDR.Range("J2:J" & iLR).ClearContents

        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = True
    End With

End Sub
Ошибка 91 "Object variable or With block variable not set", Возникает при явно определенных переменных
 
syt navy, Каков был файл пример таков был и ответ. Что там в правилах форума пишется про файл пример, пункт 2.3? Ваш файл пример не соответсвует вашему #8 посту В файле примере у вас умная таблица из 3-х колонок, в вашем посте формула вставляется в 9, 10 и 11-е колонки. Где в вашем примере єти колонки?
Изменено: MikeVol - 01.09.2025 15:52:26 (Дополнил ответ)
Ошибка 91 "Object variable or With block variable not set", Возникает при явно определенных переменных
 
syt navy, Увидеть бы ещё файл пример с данным макросом...
Выпадающие списки с возможностью добавления новых значений, Несколько списков на разных листах
 
Цитата
rusbondarev написал:
хочется чтобы новые данные он брал из записи и сам вносил в другие вкладки данные
Проще тогда использовать пользовательскую форму ввода данных. Поищите на форуме тут, таких тем полно. Думаю сами решите свой вопрос. Удачи

P S. Ваш файл пример не смотрел.
Изменено: MikeVol - 30.08.2025 07:10:07 (Дополнил ответ.)
Синхронизация автофильтров
 
syt navy, Пробуйте такой вариант, но без времени, только по датам.
Код
Option Explicit

Private Sub Worksheet_Calculate()
    Dim rngVisible  As Range
    On Error GoTo ErrHandler

    Dim SourceTab As ListObject, TargetTab As ListObject
    Set SourceTab = ThisWorkbook.Worksheets("Лист1").ListObjects("Table1")
    Set TargetTab = ThisWorkbook.Worksheets("Лист2").ListObjects("Table2")

    On Error Resume Next
    Set rngVisible = SourceTab.ListColumns(1).DataBodyRange.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not rngVisible Is Nothing Then

        Dim CritDate As Date
        CritDate = Int(rngVisible.Cells(1, 1).Value)

        TargetTab.Range.AutoFilter Field:=1, _
                Criteria1:=">=" & Format(CritDate, "yyyy-mm-dd"), _
                Operator:=xlAnd, _
                Criteria2:="<" & Format(CritDate + 1, "yyyy-mm-dd")
    Else
        If TargetTab.AutoFilter.FilterMode Then TargetTab.AutoFilter.ShowAllData
    End If

    Exit Sub

Cleanup:
    Set rngVisible = Nothing
    Set TargetTab = Nothing
    Set SourceTab = Nothing
    Exit Sub

ErrHandler:
    MsgBox "Произошла ошибка: " & Err.Description
    Resume Cleanup
End Sub
Синхронизация автофильтров
 
Цитата
syt navy написал:
Не могу получить данные первичного фильтра
И не получите его. Вы ведь не ставите фильтр по конкретному числу в первичном фильтре чтоб примените его и на втором листе.
My DEAR Comrads, Есть Тема
 
Цитата
RoadRunner написал:
My DEAR Comrads, Есть Тема
Думаю вам влетит от Модераторов за такое название темы. Читайте Правила Форума Пожалуйста! Пункт 2.1!
Как запретить в носить дату в ячейку, если эта дата она имеется в соседней
 
Valery37, Примерно так:
Код
Private Sub CommandButton4_Click()

    With ThisWorkbook.Worksheets("Лист1")

        ' Проверка: если в A7 уже есть та же дата, что и в TextBox1
        If IsDate(.Range("A7").Value) And IsDate(Me.TextBox1.Value) Then
            
            If CDate(.Range("A7").Value) = CDate(Me.TextBox1.Value) Then
                MsgBox "Эта дата уже есть в ячейке A7. Ввод запрещён!", vbExclamation
                Exit Sub
            End If
        
        End If

        ' Если проверки пройдены - запись значений
        .Range("B7").Value = Me.TextBox1.Value
        .Range("B8").Value = Me.TextBox2.Value
    End With

End Sub
Изменено: MikeVol - 27.08.2025 07:38:03 (Орфография...)
При переносе строки Alt+Enter выполнить условие (VBA)
 
Скорее всего у вас ошибка в синтаксе в данной строке:
Код
        If Cell = InStr(AnforderungVal, vbNewLine) = 1 Then 'Тут видимо что то не правильно
Сне кадется должно быть так:
Код
If InStr(Target.Value, vbNewLine) = 1 Then
Могу ошибатся.
Вот так правильно считает переносы:
Код
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim LineBreaks  As Long

    If Not Intersect(Target, Range("A1:A10000")) Is Nothing Then

        Dim Cell
        Cell = Target.Value

        If Cell = InStr(Cell, vbNewLine) = 1 Then
            Rows.RowHeight = Rows.RowHeight + 5
        End If

        If Not IsEmpty(Cell) Then
            LineBreaks = Len(Cell) - Len(Replace(Cell, Chr(10), ""))
            MsgBox "Количество переносов в ячейке: " & LineBreaks, vbInformation
        End If

    End If

End Sub
Изменено: MikeVol - 26.08.2025 11:42:42 (Дополнил ответ)
Сборка таблиц с разными шапками из нескольких книг, Ключевым - создание справочника, но как если столбцов 250
 
neurologkhv, Думаю что никак. Так как неизвестно какие у вас там в просматириваемых файлах шапки колонок. Заранее это предусмотреть всевозможные варианты не получится.
Не запускается автомакрос
 
agregator, А зачем
Цитата
agregator написал:
"Пример.xlam" это файл надстройки
Можно использовать Как использовать Личную Книгу Макросов
ComboBox в VBA, Код макроса в ComboBox-е возвращает на начало процедуры
 
Цитата
КМВ888 написал:
почитать, чтобы в будущем его учитывать.  
Отлов ошибок и отладка кода VBAВаш пункт к ознакомлению, Пошаговая отладка кода.
Не отображаются макросы в меню ALT+F8
 
Цитата
vacid написал:
такого никогда не было
Многое чего случается по первому разу независимо от нас. Возможно было какое-то обновление которое и стало конфликтом версий между собой. Это как один из возможных вариантов. Удачи.
ComboBox в VBA, Код макроса в ComboBox-е возвращает на начало процедуры
 
Цитата
КМВ888 написал:
Я про ячейку Combobox
Вот это поворот ;), не знал что что Combobox это ячейка. Открытие для себя сделал ;)
По теме:
Цитата
КМВ888 написал:
можно, чтобы после добавления нового региона в форме сразу стоял добавленный регион
а разве сейяас в новой версии кода от меня не так? Вы проверяли код?
Изменено: MikeVol - 17.08.2025 09:54:41 (Орфография...)
ComboBox в VBA, Код макроса в ComboBox-е возвращает на начало процедуры
 
КМВ888, отредактируйте сообщении пожалуйста пока модераторы не увидели вашу портянку с символами.
ComboBox в VBA, Код макроса в ComboBox-е возвращает на начало процедуры
 
Код
Option Explicit

Private Sub cb_регион_Change()

    If cb_регион.Text = "Добавить новый" Then
        '        Unload Me

        Dim region  As String
        region = InputBox("Укажите название нового региона", "Регион")

        If Len(region) = 0 Then Exit Sub

        With ThisWorkbook.Worksheets("Списки_постоянные")

            Dim CледПустаяСтрока As Long
            CледПустаяСтрока = .Cells(.Rows.Count, 1).End(xlUp).Row + 1

            .Cells(CледПустаяСтрока, 1) = region
        End With

        '        MsgBox region
        Call UserForm_Initialize
        Me.cb_регион.Value = region
    End If

End Sub

Private Sub UserForm_Initialize()
    Dim iArr        As Variant

    With ThisWorkbook.Worksheets("Списки_постоянные")
        iArr = .Range("A2", .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1)).Value
    End With

    Me.cb_регион.List = iArr
End Sub
Цитата
КМВ888 написал:
А можно сделать, чтобы после добавления нового региона в ячейке уже был добавленный регион?
Сие мне неизветсно в какую именно ячейку вы хотите вставляеть значение.
Как при загрузки формы выставлять флажок в CheckBox по значению из ячейки
 
Код
Option Explicit

Private Sub UserForm_Initialize()

    With Sheets("Нор_Док_МРК")

        ' 1) Способ
        CheckBox2.Value = IIf(.Range("EC6").Value = "Да", True, False)

        '        ' 2) Способ
        '        ' Раскомментируйте следущую строку если будете использовать этот способ
        '        CheckBox2.Value = (.Range("EC6").Value = "Да")

        '        ' 3) Способ, он анологичен 1-му способу но там более соркащённый способ написан
        '        If .Range("EC6").Value = "Да" Then
        '            CheckBox2.Value = True
        '        ElseIf .Range("EC6").Value = "Нет" Then
        '            CheckBox2.Value = False
        '        End If

    End With

End Sub
Изменено: MikeVol - 16.08.2025 17:13:14 (Дополнил ответ)
ComboBox в VBA, Код макроса в ComboBox-е возвращает на начало процедуры
 
Код
Option Explicit

Private Sub cb_регион_Change()

    If cb_регион.Text = "Добавить новый" Then
        Unload Me

        Dim region  As String
        region = InputBox("Укажите название нового региона", "Регион")

        With ThisWorkbook.Worksheets("Списки_постоянные")

            Dim CледПустаяСтрока As Long
            CледПустаяСтрока = .Cells(.Rows.Count, 1).End(xlUp).Row + 1

            Cells(CледПустаяСтрока, 1) = region
        End With

        MsgBox region
    End If

End Sub

Private Sub UserForm_Initialize()
    Dim iArr        As Variant

    With ThisWorkbook.Worksheets("Списки_постоянные")
        iArr = .Range("A2", .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1)).Value
    End With

    With Me.cb_регион
        .List = iArr
    End With

End Sub
Изменено: MikeVol - 16.08.2025 02:12:17 (Дополнил ответ)
Как в EXCEL с помощью VBA прописать MsgBox, который будет выдавать кол-во правок?
 
Hugo, Дал нориальную идею насчёт
Цитата
Hugo написал:
переписать на цикл
но, можно загнать в массив диапазон с данными. Тут ещё нужен будет список соответсвий, скажем в одной колонке список с искомым значением для замены а в другой колонке список на который слдеут заменить искомое значение. И при каждой итерации (возможно неправильно слово написал) увеличивать будем некую переменую которую мы и будем использовать как счётчик. Как вариант думаю стоит пробывать но надо видеть файл пример. Без файла примера можно долго ещё дискусию вести.
Макрос выбора файла в каталоге заменить на папку текущего файла
 
Цитата
delph3r написал:
И тогда будет работать идеально.
Сразу не обратил на это внимание. Вы правы, извините, спешил. Рад что вы сами справились. Удачи.
Макрос выбора файла в каталоге заменить на папку текущего файла
 
Код
Option Explicit

Sub Sbor_imen_failov_i_stranic()
    Dim i           As Long
    Dim xRg         As Range
    Dim xStr        As String
    Dim xFdItem     As Variant
    Dim xFileNum    As Long
    Dim RegExp      As Object

    Dim fPath       As String
    fPath = ThisWorkbook.Path & Application.PathSeparator

    Dim xFileName   As String
    xFileName = Dir(fPath & "*.pdf", vbDirectory)
    
    If xFileName = "" Then
        MsgBox "В папке нет PDF-файлов: " & fPath, vbExclamation
        Exit Sub
    End If

    On Error Resume Next
    Worksheets("Приложения").Delete
    On Error GoTo 0
    Worksheets.Add.Name = "Приложения"

    Set xRg = Sheets("Приложения").Range("A1")
    Range("A:B").ClearContents
    Range("A1:B1").Font.Bold = True
    xRg = "Имя файла"
    xRg.Offset(0, 1) = "Кол-во страниц"
    i = 2
    xStr = ""

    Do While xFileName <> ""
        Cells(i, 1) = xFileName
        Set RegExp = CreateObject("VBscript.RegExp")
        RegExp.Global = True
        RegExp.Pattern = "/Type\s*/Page[^s]"
        xFileNum = FreeFile
        Open (xFdItem & xFileName) For Binary As #xFileNum
        xStr = Space(LOF(xFileNum))
        Get #xFileNum, , xStr
        Close #xFileNum
        Cells(i, 2) = RegExp.Execute(xStr).Count
        i = i + 1
        xFileName = Dir
    Loop

    Columns("A:B").AutoFit
End Sub
VBA. Записанный макрос сделать универсальным, Макрос, работа в другой ячейке
 
Учил, подсказывал раньше и всё напрасно...
Код
Option Explicit

Sub Макрос44()
    Dim currentMonth As Integer
    currentMonth = Month(Date)

    Dim currentYear As Integer
    currentYear = Year(Date)

    With Sheet1
        Dim col     As Long

        Dim lastCol As Long
        lastCol = .Cells(2, .Columns.Count).End(xlToLeft).Column

        Dim lastRow As Long
        lastRow = .Cells(.Rows.Count, "B").End(xlUp).Row

        Dim formulaStr As String
        formulaStr = "=VLOOKUP(B4,Лист4!A:D,4,FALSE)"

        For col = 3 To lastCol

            If IsDate(.Cells(2, col).Value) Then

                If Year(.Cells(2, col).Value) = currentYear And Month(.Cells(2, col).Value) = currentMonth Then
                    .Cells(4, col).Formula = formulaStr
                    .Range(.Cells(4, col), .Cells(lastRow, col)).FillDown

                    With .Range(.Cells(4, col), .Cells(lastRow, col))
                        .Value = .Value
                    End With

                End If

            End If

        Next

    End With

End Sub
VBA. Записанный макрос сделать универсальным, Макрос, работа в другой ячейке
 
ktyehf, Доброго времени суток. Из той же прошлой серии, вариант:
Код
Option Explicit

Sub Макрос4()
    Dim currentMonth As Integer
    currentMonth = Month(Date)

    With Sheet1
        Dim col     As Long

        Dim lastCol As Long
        lastCol = .Cells(2, .Columns.Count).End(xlToLeft).Column

        Dim lastRow As Long
        lastRow = .Cells(.Rows.Count, "B").End(xlUp).Row

        Dim formulaStr As String
        formulaStr = "=VLOOKUP(B4,Лист4!A:D,4,FALSE)"

        For col = 3 To lastCol

            If IsDate(.Cells(2, col).Value) Then

                If Month(.Cells(2, col).Value) = currentMonth Then
                    .Cells(4, col).Formula = formulaStr
                    .Range(.Cells(4, col), .Cells(lastRow, col)).FillDown

                    With .Range(.Cells(4, col), .Cells(lastRow, col))
                        .Value = .Value
                    End With

                End If

            End If

        Next col

    End With

End Sub
Удачи.

Упс, подставьте свои имена листов (кодовые имена).
Изменено: MikeVol - 04.08.2025 21:33:58 (Дополнил ответ)
Некорректно работает сортировка, Не работает сортировка по возрастанию, убыванию...
 
Mr.dupen, Доброго времени суток. Предлагаю вариант без использования формул. Следуйщий код внесите в модель листа ЕдР, предварительно очистив все данные начиная с 3-ей строки!
Код
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Long, j As Long
    On Error GoTo CleanFail

    If Target.Cells.Count > 1 Then Exit Sub
    Dim eventsDisabled As Boolean
    eventsDisabled = False

    If Not Intersect(Target, Range("B3:B100")) Is Nothing Then
        Application.EnableEvents = False
        eventsDisabled = True

        Dim Search  As Variant
        Search = Target.Value

        With Лист3

            Dim iLast As Long
            iLast = .Cells(.Rows.Count, "AD").End(xlUp).Row

            Dim dataArr As Variant
            dataArr = .Range("AD2:BA" & iLast).Value

            Dim foundIndex As Long
            foundIndex = 0

            For i = 1 To UBound(dataArr, 1)

                If dataArr(i, 1) = Search Then
                    foundIndex = i
                    Exit For
                End If

            Next i

            If foundIndex > 0 Then

                Me.Cells(Target.Row, 3).Value = dataArr(foundIndex, 2)
                Me.Cells(Target.Row, 4).Value = dataArr(foundIndex, 9)
                Me.Cells(Target.Row, 5).Value = dataArr(foundIndex, 10)

                Dim fullText As String
                fullText = Me.Cells(Target.Row, 5).Value

                If Trim(fullText) <> "" Then

                    Dim spacePos As Long
                    spacePos = InStr(fullText, " ")

                    Dim resultValue As String

                    If spacePos > 0 Then
                        resultValue = Mid(fullText, 1, spacePos - 1)
                    Else
                        resultValue = "1"
                    End If

                Else
                    resultValue = ""
                End If

                Me.Cells(Target.Row, 6).Value = resultValue

                Me.Cells(Target.Row, 7).Value = dataArr(foundIndex, 13)
                Me.Cells(Target.Row, 8).Value = dataArr(foundIndex, 16)
                Me.Cells(Target.Row, 9).Value = dataArr(foundIndex, 19)
            Else

                For j = 2 To 9
                    Me.Cells(Target.Row, j).ClearContents
                Next j

                MsgBox "В базе нет такого номера! ", vbExclamation
            End If

        End With

        Dim lastRow As Long
        lastRow = ThisWorkbook.ActiveSheet.Cells(ThisWorkbook.ActiveSheet.Rows.Count, "B").End(xlUp).Row

        With ThisWorkbook.ActiveSheet.Sort
            .SortFields.Clear
            .SortFields.Add key:=ThisWorkbook.ActiveSheet.Range("I3:I" & lastRow), _
                    SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

            '        .SortFields.Add key:=ThisWorkbook.ActiveSheet.Range("I3:I" & lastRow), _
                     '                SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

            .SetRange ThisWorkbook.ActiveSheet.Range("B3:I" & lastRow)
            .Apply
        End With

    End If

CleanExit:
    If eventsDisabled Then Application.EnableEvents = True
    Exit Sub

CleanFail:
    MsgBox "Произошла ошибка: " & Err.Description, vbCritical
    Resume CleanExit
End Sub
Теперь внесите любой номер в колонку B, всё тоже самое проделайте что вы раньше делали, но уже без формул. При внесение данных данные сразу сортируют столбец I
Цитата
Mr.dupen написал:
По столбцу с бабками
по убыванию. Надеюсь помог вам. Удачи.
Изменено: MikeVol - 02.08.2025 13:13:38
Удаление фильтра на защищенном листе
 
Цитата
KILOJOUL написал:
безопасников
Во, а чего вы их не спросите по данному вопросу? Возможно они чего путного и посоветуют. Как вариант.
Автоматическое изменение рабочих файлов эксель на основании изменений шаблона, Изменение рабочих файлов проектов при редактировании шаблона (добавление новых строк, столбцов, изменении формул и пр.)
 
Цитата
Лана24 написал:
Можете подсказать
Как же вам ещё подсказать... Я же выше вам написал, без файлов примеров только на словах. Мы не значем структуру ваших файлов, структкуру шаблона(в). Да и поиск вам особо не поможет так как сам поиск не знает, опять-же повторяюсь, струкутуру файлов. Вы сами оттягиваете время для получение помощи. Удачи вам в
Цитата
Лана24 написал:
корректно в поиск вбить запрос
.
Автоматическое изменение рабочих файлов эксель на основании изменений шаблона, Изменение рабочих файлов проектов при редактировании шаблона (добавление новых строк, столбцов, изменении формул и пр.)
 
Цитата
Лана24 написал:
редактировании файла шаблона
Обычно файл шаблон не надо редактировать. В него заносятся (вносятся) данные из
Цитата
Лана24 написал:
рабочих файлах проектов
макросом. Возможно вам понадобится отредактировать сам макрос или переписать его с нуля. Без файлов примеров только так, на словах.
Изменено: MikeVol - 21.07.2025 11:52:28 (Дополнил ответ)
Разница между датами с учетом рабочего дня
 
Цитата
Jenya1980 написал:
Файл весит 100кб
файл должен быть желательно с расширением .xlsx. Если конечно вам что-то известно об этом. Люди ждут файла примера!
Объединение файлов с удалением данных.
 
pliplim,
Код
Option Explicit

Sub CombineWorkbooks_v3()
    Dim importWB As Workbook, importWS As Worksheet
    Dim tbl As ListObject, visibleRow As Range
    Dim FilesToOpenItem As Variant
    Dim j As Long

    On Error GoTo ErrorHandler

    Dim colsToExtract As Variant
    colsToExtract = Array(1, 3, 4, 5)    ' A, C, D, E
    
    Dim numOutCols As Long
    numOutCols = UBound(colsToExtract) - LBound(colsToExtract) + 1

    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
        .EnableEvents = False

        Dim FilesToOpen As Variant
        FilesToOpen = .GetOpenFilename( _
                FileFilter:="Excel files (*.xls*), *.xls*", _
                MultiSelect:=True, Title:="Выберите файлы для объединения")

        If TypeName(FilesToOpen) = "Boolean" Then
            MsgBox "Не выбрано ни одного файла!"
            GoTo CleanExit
        End If
    
    End With

    Dim итогWB As Workbook, итогWS As Worksheet
    Set итогWB = Workbooks.Add(xlWBATWorksheet)
    Set итогWS = итогWB.Sheets(1)
    итогWS.Name = "ИТОГ"

    Dim pasteRow    As Long
    pasteRow = 1

    Dim savePath    As String
    savePath = Left(FilesToOpen(1), InStrRev(FilesToOpen(1), "\"))

    Dim headersWritten As Boolean
    headersWritten = False

    For Each FilesToOpenItem In FilesToOpen
        Set importWB = Workbooks.Open(FilesToOpenItem, ReadOnly:=True)

        ' Извлекаем дату из имени файла
        Dim fileName As String, extractedDate As String
        fileName = Mid(FilesToOpenItem, InStrRev(FilesToOpenItem, "\") + 1)
        extractedDate = ExtractDateFromFileName(fileName)

        For Each importWS In importWB.Worksheets

            For Each tbl In importWS.ListObjects
                If tbl.DataBodyRange Is Nothing Then GoTo NextTable

                If Not headersWritten Then
                    
                    For j = LBound(colsToExtract) To UBound(colsToExtract)
                        итогWS.Cells(pasteRow, j - LBound(colsToExtract) + 1).Value = _
                                tbl.HeaderRowRange.Cells(1, colsToExtract(j)).Value
                    Next j

                    итогWS.Cells(pasteRow, numOutCols + 1).Value = "КОДЫ ИТОГ"
                    итогWS.Cells(pasteRow, numOutCols + 2).Value = "ДАТА"
                    pasteRow = pasteRow + 1
                    headersWritten = True
                End If

                Dim rowCount As Long
                rowCount = 0

                For Each visibleRow In tbl.DataBodyRange.Rows
                    If Not visibleRow.EntireRow.Hidden Then rowCount = rowCount + 1
                Next visibleRow

                If rowCount = 0 Then GoTo NextTable

                Dim outArr() As Variant
                ReDim outArr(1 To rowCount, 1 To numOutCols + 2)

                Dim i As Long
                i = 0

                For Each visibleRow In tbl.DataBodyRange.Rows
                    
                    If Not visibleRow.EntireRow.Hidden Then
                        i = i + 1

                        For j = LBound(colsToExtract) To UBound(colsToExtract)
                            outArr(i, j - LBound(colsToExtract) + 1) = _
                                    visibleRow.Cells(1, colsToExtract(j)).Value
                        Next j

                        Dim codeValue As Variant
                        codeValue = visibleRow.Cells(1, 4).Value

                        If Not IsEmpty(codeValue) Then
                            outArr(i, numOutCols + 1) = "[Код товара] = " & codeValue & "ИЛИ"
                        Else
                            outArr(i, numOutCols + 1) = ""
                        End If

                        ' Добавляем дату из имени файла
                        outArr(i, numOutCols + 2) = extractedDate
                    End If
                
                Next visibleRow

                итогWS.Cells(pasteRow, 1).Resize(UBound(outArr, 1), UBound(outArr, 2)).Value = outArr
                pasteRow = pasteRow + UBound(outArr, 1)

NextTable:
            Next tbl
        
        Next importWS

        importWB.Close SaveChanges:=False
    Next FilesToOpenItem

    итогWS.Columns.AutoFit

    ' Сортировка по столбцу A по убыванию
    With итогWS.Sort
        .SortFields.Clear
        .SortFields.Add Key:=итогWS.Range("A2:A" & итогWS.Cells(итогWS.Rows.Count, "A").End(xlUp).row), _
                SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
        .SetRange итогWS.UsedRange
        .Header = xlYes
        .Apply
    End With

    итогWB.SaveAs fileName:=savePath & "Итог.xlsx", FileFormat:=xlOpenXMLWorkbook
    итогWB.Close SaveChanges:=False

    MsgBox "Объединение завершено. Данные сохранены в 'Итог.xlsx'"

CleanExit:
    
    With Application
        .EnableEvents = True
        .DisplayAlerts = True
        .ScreenUpdating = True
    End With
    Exit Sub

ErrorHandler:
    MsgBox "Произошла ошибка: " & Err.Description, vbCritical, "Ошибка"
    If Not importWB Is Nothing Then On Error Resume Next: importWB.Close SaveChanges:=False
    If Not итогWB Is Nothing Then On Error Resume Next: итогWB.Close SaveChanges:=False
    Resume CleanExit
End Sub

Private Function ExtractDateFromFileName(fileName As String) As String
    Dim re          As Object
    Set re = CreateObject("VBScript.RegExp")
    
    With re
        .Pattern = "\b\d{2}\.\d{2}\.\d{4}\b"
        .Global = False
        .IgnoreCase = True
    End With

    If re.test(fileName) Then
        ExtractDateFromFileName = re.Execute(fileName)(0)
    Else
        ExtractDateFromFileName = ""
    End If

End Function
Извлечь все данные из выпадающего списка
 
Kadrovik, Удалите конфиденциальную информацию из файла и приложите файл пример сюда. Без файла только гадать остаётся, ясновидение не предусмотрено на данном форуме. Впрочем, как и везде.
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 27 След.
Наверх