Sub CollectDataFromAllSheets()
Dim ws As Worksheet
Dim allDataSheet As Worksheet
Dim rngData As Range
Dim currentResultRow As Long
Dim sheetExists As Boolean
Dim sheetName As String
sheetName = "AllData"
sheetExists = False
' Проверка наличия листа с именем "AllData"
For Each ws In ActiveWorkbook.Worksheets
If ws.Name = sheetName Then
sheetExists = True
Set allDataSheet = ws
Exit For
End If
Next ws
' Если лист "AllData" найден, очищаем его, иначе создаем новый
If sheetExists Then
allDataSheet.Cells.Clear
Else
Set allDataSheet = ActiveWorkbook.Worksheets.Add
allDataSheet.Name = sheetName
End If
' Копируем заголовок с первого листа
Worksheets(1).Rows(1).Copy Destination:=allDataSheet.Rows(1)
currentResultRow = 2
' Перебор всех листов для копирования данных
For Each ws In ActiveWorkbook.Worksheets
If ws.Name <> sheetName Then
Set rngData = ws.Range("A2", ws.Range("A2").SpecialCells(xlCellTypeLastCell)) ' от A2 до последней ячейки
rngData.Copy Destination:=allDataSheet.Cells(currentResultRow, 1)
currentResultRow = currentResultRow + rngData.Rows.Count
End If
Next ws
End Sub
(function()
{
//Вспомогательная функция, находит последний используемый ряд в данном листе. В отличии от остальных методов, не останавливается на пустых промежутках.
function FindLastRow(sheet)
{
// Minimum row index
let indexRowMin = 0;
// Maximum row index
let indexRowMax = 1048576;
// Column 'A'
let indexCol = 0;
// Row index for empty cell search
let indexRow = indexRowMax;
for (; indexRow >= indexRowMin; --indexRow) {
// Getting the cell
var range = sheet.GetRangeByNumber(indexRow, indexCol);
// Checking the value
if (range.GetValue() && indexRow !== indexRowMax) {
//Нашли первое значение, считая снизу, возвращаем его
return indexRow;
}
}
}
function CollectDataFromAllSheets() {
//Запоминаем листы, из которых нам надо собрать данные и добавляем лист для объединенных данных
let worksheets = Api.GetSheets();
if (worksheets.count == 0) {
return;
}
Api.AddSheet();
let allDataSheet = Api.ActiveSheet;
//Если требуется сохранять не в отдельный лист, а в отдельную книгу - то вместо предыдущей строчки используем:
/*
builder.CreateFile("xlsx");
let allDataSheet = Api.AddSheet();
*/
//копируем в итоговый лист заголовки столбцов из первого листа
worksheets[1].GetRows("1").Copy(allDataSheet.GetRows("1"));
//И устанавливаем текущую строку равной 2(сразу после заголовков)
let currentResultRow = 2;
//проходим по всем листам, из которых надо собрать данные
for (let ws of worksheets) {
//Для каждого листа находим последний ряд
let lastRow = FindLastRow(ws) +1;
//console.log("LastRow: ", lastRow);
//И копируем каждый ряд в конечную таблицу
for (let rowNum = 2; rowNum <= lastRow; rowNum++) {
//-2 потому что rowNum у нас тоже идет от 2
ws.GetRows(rowNum).Copy(allDataSheet.GetRows(rowNum + currentResultRow-2));
}
//После прохода по всем рядам - обновляем currentResultRow (можно и с помощью FindLastRow, но это будет значительно более затратно по вычислениям)
let rowCount = lastRow-1;
currentResultRow += rowCount;
}
}
CollectDataFromAllSheets();
})();