Дано: 4 таблицы (в файле примера разделены ядовитой желтизной) одинакового размера. Каждая строка в таблице рассматривается как уникальная. Суммировать ничего ни с чем не надо.
Вопрос: Как слить 4 таблицы в одну, при этом выбирая только те строки, где значение в столбце "Сумма" не равно 0?
Есть возможность избегнуть макроса? Или безнадёжны мои надежды?
Файл прилагаю. Заранее благодарна.
Добрый день, коллеги!
Я к вам опять с проблемой.
Дано: 4 таблицы (в файле примера разделены ядовитой желтизной) одинакового размера. Каждая строка в таблице рассматривается как уникальная. Суммировать ничего ни с чем не надо.
Вопрос: Как слить 4 таблицы в одну, при этом выбирая только те строки, где значение в столбце "Сумма" не равно 0?
Есть возможность избегнуть макроса? Или безнадёжны мои надежды?
Работать с этим всем будут люди, которые Excel не знают никак и знать не хотят. Никаких фильтров и самостоятельных копирований из ячейки в ячейку. Не хотят и делать не будут.
Я даже кнопку макроса не смогу впарить.
Поэтому желательно формулы. И всё.
Спасибо, что послушали
Забыла сказать, извините.
Работать с этим всем будут люди, которые Excel не знают никак и знать не хотят. Никаких фильтров и самостоятельных копирований из ячейки в ячейку. Не хотят и делать не будут.
Совсем без макроса не получилось, ибо если делать формулами, то нужно постоянно следить за количеством строк в таблицах и протягивать формулы, что никак не вяжется с
все ненулевые (ошибки тоже распознаются как 0) строки из таблиц с листа Лист1 собираются подключением (Данные>подключения) в таблицу на листе Лист2 Таблица обновляется так же, как и сводная (ПКМ>Обновить) сделал макрос для обновления параметров подключения и автообновления таблицы в модуле Лист2[vba]
Код
Public WithEvents QTbl As QueryTable Private Sub QTbl_BeforeRefresh(Cancel As Boolean) Dim arr() As Variant, i&, strSQL$, LO As ListObject For Each LO In Sheets("Лист1").ListObjects i = i + 1 ReDim Preserve arr(i) arr(i) = LO.Range.Address(0, 0, 1, 1) Next With Application arr = .Substitute(.ReplaceB(arr, 1, Len(ThisWorkbook.Name) + 2, ""), "!", "$") End With strSQL = "select * from (" & Mid(Join(arr, "] union all select * from ["), 13) & "]) where Сумма" QTbl.Connection = "ODBC;DSN=Excel Files;DriverId=1046;DBQ=" & Parent.FullName QTbl.CommandText = strSQL End Sub Private Sub Worksheet_Activate() Init QTbl.Refresh End Sub
[/vba]в модуле ЭтаКнига [vba]
Код
Private Sub Workbook_Open() Call Init End Sub
[/vba]в стандартном модуле[vba]
Код
Public tbl As QueryTable Sub Init() If tbl Is Nothing Then Set Лист2.QTbl = Лист2.ListObjects(1).QueryTable Set tbl = Лист2.QTbl End Sub
[/vba]
Совсем без макроса не получилось, ибо если делать формулами, то нужно постоянно следить за количеством строк в таблицах и протягивать формулы, что никак не вяжется с
все ненулевые (ошибки тоже распознаются как 0) строки из таблиц с листа Лист1 собираются подключением (Данные>подключения) в таблицу на листе Лист2 Таблица обновляется так же, как и сводная (ПКМ>Обновить) сделал макрос для обновления параметров подключения и автообновления таблицы в модуле Лист2[vba]
Код
Public WithEvents QTbl As QueryTable Private Sub QTbl_BeforeRefresh(Cancel As Boolean) Dim arr() As Variant, i&, strSQL$, LO As ListObject For Each LO In Sheets("Лист1").ListObjects i = i + 1 ReDim Preserve arr(i) arr(i) = LO.Range.Address(0, 0, 1, 1) Next With Application arr = .Substitute(.ReplaceB(arr, 1, Len(ThisWorkbook.Name) + 2, ""), "!", "$") End With strSQL = "select * from (" & Mid(Join(arr, "] union all select * from ["), 13) & "]) where Сумма" QTbl.Connection = "ODBC;DSN=Excel Files;DriverId=1046;DBQ=" & Parent.FullName QTbl.CommandText = strSQL End Sub Private Sub Worksheet_Activate() Init QTbl.Refresh End Sub
[/vba]в модуле ЭтаКнига [vba]
Код
Private Sub Workbook_Open() Call Init End Sub
[/vba]в стандартном модуле[vba]
Код
Public tbl As QueryTable Sub Init() If tbl Is Nothing Then Set Лист2.QTbl = Лист2.ListObjects(1).QueryTable Set tbl = Лист2.QTbl End Sub