Форум на данный момент в стадии обновления. Если у Вас возникли проблемы со входом в свою учетную запись - просьба писать на email: info@excel-vba.ru
Цитата: Naka9 от 13.03.2025, 16:37:42Подскажите, пожалуйста
https://docs.google.com/spreadsheets/d/1fz1udx1vjdL1W6ANuyc3j_VusWopOVKqIohGlbXM1gU/edit?gid=0#gid=0
Посчитать данные за 2024 год поквартально при условиях :
1) Компания = Солюшенс и Гудтех
2) Столбец I (Статьи ) - консалтинг
3) Столбец F (НДС) - если НДС, то то делим на 1,2, если без НДС - то оставляем
Делала на примере Статьи единовременно и 2023 года, какая то дичь получается![]()
Можете глянуть, пожалуйста![]()
Цитата: Дмитрий Щербаков(The_Prist) от 27.02.2025, 20:32:49Как-то так:=ЕСЛИОШИБКА(СУММПРОИЗВ((('Факт по продажам 2020 (акты)'!$A$4:$A$17=$A$1)+('Факт по продажам 2020 (акты)'!$A$4:$A$17=$B$1))*('Факт по продажам 2020 (акты)'!$C$4:$C$17=$A8)*СМЕЩ('Факт по продажам 2020 (акты)'!A4;0;ПОИСКПОЗ($B$3;'Факт по продажам 2020 (акты)'!1:1;0)+SWITCH(C$3;$C$3;0;$D$3;1;$E$3;2;$F$3;3)-1;14;3));0)
только обращаю внимание: диапазоны указаны от 4 до 17-ой строки, т.е. 14 строк. Соответственно, если строк будет больше - надо изменить везде эти диапазоны, а так же изменить в СМЕЩ 14 на это же кол-во строк.
=И($C1<>"";$F1="")
Она будет работать именно так, как ожидаете.Sub MergeTablesFromMultipleWorkbooks()
Dim targetSheet As Worksheet
Dim sourceFolder As String
Dim sourceFile As String
Dim sourceWorkbook As Workbook
Dim sourceRange As Range
Dim visibleData As Range
Dim lastRow As Long
Dim firstFile As Boolean
Dim startRow As Long
Dim fileName As String
' Настройки
Set targetSheet = ThisWorkbook.Sheets("Объединенные данные")
sourceFolder = GetFolderPath()
If sourceFolder = "" Then Exit Sub
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
firstFile = True
sourceFile = Dir(sourceFolder & "\*.xls*")
' Инициализация целевого листа
targetSheet.Cells.Delete
targetSheet.Range("A1").Value = "Источник файла"
Do While sourceFile <> ""
If sourceFile <> ThisWorkbook.Name Then
Set sourceWorkbook = Workbooks.Open(sourceFolder & "\" & sourceFile)
fileName = Split(sourceFile, ".")(0)
With sourceWorkbook.Sheets("Расчет суммы кредита") 'ТУТ ИМЯ ВАШЕГО ЛИСТА
' Снятие защиты листа с проверкой
On Error Resume Next
.Unprotect Password:="-П А Р О Л Ь-" ' Укажите ваш пароль если известен или закомментируйте блок
On Error GoTo 0
' Проверка на пустой файл
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
If lastRow < 1 Then
MsgBox "Файл " & sourceFile & " пуст", vbExclamation
GoTo CloseWorkbook
End If
Set sourceRange = .Range("A1:k" & lastRow) 'ТУТ УКАЖИТЕ ДИАПАЗОН КОПИРОВАНИЯ
End With
With targetSheet
If firstFile Then
' Копируем заголовки как значения
sourceRange.Rows(1).Copy
.Range("B1").PasteSpecial xlPasteValues
firstFile = False
End If
' Получаем видимые данные с обработкой ошибок
On Error Resume Next
Set visibleData = sourceRange.Offset(1).Resize(sourceRange.Rows.Count - 1) _
.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
' Проверяем наличие видимых данных
If Not visibleData Is Nothing Then
startRow = .Cells(.Rows.Count, 2).End(xlUp).Row + 1
' Копируем только значения
On Error Resume Next
.Range("B" & startRow).Resize(visibleData.Rows.Count, visibleData.Columns.Count).Value = _
visibleData.Value
On Error GoTo 0
' Заполняем колонку с именем файла
lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
If lastRow >= startRow Then
.Range("A" & startRow & ":A" & lastRow).Value = fileName
End If
Else
MsgBox "В файле " & sourceFile & " нет видимых данных", vbExclamation
End If
End With
CloseWorkbook:
sourceWorkbook.Close False
Set visibleData = Nothing
End If
sourceFile = Dir()
Loop
Application.CutCopyMode = False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True
' Форматирование результата
With targetSheet
.Rows(1).Font.Bold = True
' .Columns.AutoFit
If .Cells(1, 2) = "" Then .Cells(1, 2) = "Нет данных"
End With
MsgBox "Объединено " & targetSheet.Cells(targetSheet.Rows.Count, 2).End(xlUp).Row - 1 & " строк", vbInformation
End Sub
Function GetFolderPath() As String
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Выберите папку с исходными файлами"
.AllowMultiSelect = False
If .Show = -1 Then
GetFolderPath = .SelectedItems(1)
Else
GetFolderPath = ""
End If
End With
End Function