Как раскидать строки по листам?

Например, имеется лист:
3d49b29b84e84549ac5e6aeb8390fb3f.png
Требуется средствами макроса VBA раскидать строки по разным листам. В результате должны получится листы с названиями из значений второго столбца:
"1"
01f0e1d36c0e4e2496ff267f87296287.png
"2"
756eaadb64e84209867fe94ce25e3b15.png
"3"
1a23cadd2d7b4bcfb426a49a793909c4.png
"4"
a8af396bb17044d8b459e042b93964c5.png
"5"
4c26be0117604c2cb2e964373c9fc612.png
p.s. не нужно писать мне обращаться на фрилансерские биржи за решением, я надеюсь исключительно на энтузиазм прогеров, которым будет даже интересно решить подобную задачку, коим образом и сам иногда помогаю людям, безвозмездно.
  • Вопрос задан
  • 2560 просмотров
Решения вопроса 1
honor8
@honor8
Принципы быстродействия VBA в описании
' Таблица с данными должна начинаться с ячейки A1, лист активен. Старые данные не очищаются.
Option Explicit
Option Base 1
'123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789

Sub Создать_листы_по_последнему_столбцу()
  Dim a As Integer, k As Byte, m As Variant
  
  With ThisWorkbook
    With .ActiveSheet
      m = .Cells(1, 1).Resize(.UsedRange.Rows.Count, .UsedRange.Columns.Count)
    End With
    For a = LBound(m, 1) + 1 To UBound(m, 1)
      k = FindSheet(m(a, UBound(m, 2)))
      If k = 0 Then
        .Sheets.Add After:=.Sheets(.Sheets.Count): k = .Sheets.Count
        With .Sheets(k)
          .Name = m(a, UBound(m, 2))
          .Cells(1, 1) = m(LBound(m, 1), 1): .Cells(1, 2) = m(LBound(m, 1), 2)
        End With
      End If
      With .Sheets(k)
        .Cells(.UsedRange.Rows.Count + 1, 1) = m(a, LBound(m, 2)) ' Нижняя граница "m"
        .Cells(.UsedRange.Rows.Count + IIf(Val(Application.Version) >= 12, 0, 1), _
          2) = m(a, UBound(m, 2)) ' Верхняя граница "m"
      End With
    Next a
  End With
End Sub

Function FindSheet(ByVal SheetName As String) As Byte
  Dim GetBook As Workbook, GetSheet As Worksheet
  
  Set GetBook = ThisWorkbook
  For Each GetSheet In GetBook.Worksheets
    If GetSheet.Name = SheetName Then FindSheet = GetSheet.Index: Exit For
  Next GetSheet: Set GetSheet = Nothing: Set GetBook = Nothing
End Function
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы