Введение
Итак, предположим, у нас есть лист с большим количеством данных и нам необходимо разделить данные на несколько рабочих листов на основе столбца «Категория». Выполнить эту задачу можно вручную, используя инструмент сортировки данных, но в этом случае потребуется Ваше терпение для повторного копирования данных.
Готовые коды для разделения таблиц на листы.
Прежде чем копировать код, посмотрите видеоролик о том, как это работает. Приятного просмотра!
Готовый скрипт разделения Google таблиц на листы:
function myFunction1() {
//Сортируем диапазон от А до Я (столбец для разделения должен быть первым!)
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('A2').activate();
var currentCell = spreadsheet.getCurrentCell();
spreadsheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
currentCell.activateAsCurrentCell();
currentCell = spreadsheet.getCurrentCell();
spreadsheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.NEXT).activate();
currentCell.activateAsCurrentCell().sort({column: 1, ascending: true});
//Создаем новый лист "Уник"
spreadsheet.insertSheet(2);
spreadsheet.getActiveSheet().setName('Уник');
//Копируем данные на лист "Уник"
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Данные'), true);
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Уник'), true);
spreadsheet.getRange('\'Данные\'!A:A').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
//Удаляем дубли + считаем число значений
spreadsheet.getRange('A:A').removeDuplicates().activate();
spreadsheet.getRange('B1').setFormula("=COUNTA(A:A)");
var unique = spreadsheet.getRange('\'Уник\'!B1').getValue(); //Получаем число уникальных строк
var data = spreadsheet.getRange('A1:A'+unique).getValues(); //Получаем список уникальных имен
for (var i = 0; i < data.length; i++) {
var tabName = data[i];
spreadsheet.insertSheet(tabName.toString());
spreadsheet.getCurrentCell().setFormula('FILTER(Данные!A1:Z1000; Данные!A1:A1000="'+data[i]+'")');
}
};
Готовый код Excel VBA для разделения на листы:
Sub Splitdata()
'Разбитие данных на несколько листов на основе столбца в Excel'
Dim lr As Long
Dim ws As Worksheet
Dim vcol, i As Integer
Dim icol As Long
Dim myarr As Variant
Dim title As String
Dim titlerow As Integer
Dim xTRg As Range
Dim xVRg As Range
Dim xWSTRg As Worksheet
On Error Resume Next
Set xTRg = Application.InputBox("Выберите строки с заголовками:", "Excel", "", Type:=8)
If TypeName(xTRg) = "Nothing" Then Exit Sub
Set xVRg = Application.InputBox("Выберите столбец, по которому Вы хотите разделить данные:", "Excel", "", Type:=8)
If TypeName(xVRg) = "Nothing" Then Exit Sub
vcol = xVRg.Column
Set ws = xTRg.Worksheet
lr = ws.Cells(ws.Rows.Count, vcol).End(xlUp).Row
title = xTRg.AddressLocal
titlerow = xTRg.Cells(1).Row
icol = ws.Columns.Count
ws.Cells(1, icol) = "Unique"
Application.DisplayAlerts = False
If Not Evaluate("=ISREF('xTRgWs_Sheet!A1')") Then
Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "xTRgWs_Sheet"
Else
Sheets("xTRgWs_Sheet").Delete
Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "xTRgWs_Sheet"
End If
Set xWSTRg = Sheets("xTRgWs_Sheet")
xTRg.Copy
xWSTRg.Paste Destination:=xWSTRg.Range("A1")
ws.Activate
For i = (titlerow + xTRg.Rows.Count) To lr
On Error Resume Next
If ws.Cells(i, vcol) <> "" And Application.WorksheetFunction.Match(ws.Cells(i, vcol), ws.Columns(icol), 0) = 0 Then
ws.Cells(ws.Rows.Count, icol).End(xlUp).Offset(1) = ws.Cells(i, vcol)
End If
Next
myarr = Application.WorksheetFunction.Transpose(ws.Columns(icol).SpecialCells(xlCellTypeConstants))
ws.Columns(icol).Clear
For i = 2 To UBound(myarr)
ws.Range(title).AutoFilter field:=vcol, Criteria1:=myarr(i) & ""
If Not Evaluate("=ISREF('" & myarr(i) & "'!A1)") Then
Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = myarr(i) & ""
Else
Sheets(myarr(i) & "").Move after:=Worksheets(Worksheets.Count)
End If
xWSTRg.Range(title).Copy
Sheets(myarr(i) & "").Paste Destination:=Sheets(myarr(i) & "").Range("A1")
ws.Range("A" & (titlerow + xTRg.Rows.Count) & ":A" & lr).EntireRow.Copy Sheets(myarr(i) & "").Range("A" & (titlerow + xTRg.Rows.Count))
Sheets(myarr(i) & "").Columns.AutoFit
Next
xWSTRg.Delete
ws.AutoFilterMode = False
ws.Activate
Application.DisplayAlerts = True
End Sub
Заключение
Как видите, не нужно тратить большое количество времени на ручное копирование данных. С помощью нашего руководства, это можно сделать всего за несколько минут.