Страницы: 1
RSS
VBA Заполнение таблицы из листов в книге, Прошу помощи в поиске ошибки в коде макроса filltable
 
Коллеги, привет!
Благодаря Вашему ресурсу и поддержке решил ступить на скользкий путь VBA.
На этот раз не могу найти ошибку в коде макроса fillTable, он должен проверять листы в книге и исходя из названия листа брать с него значения из вертикального диапазона и переносить на лист "Сводная" в горизонтальный. Знаю, что есть готовые решения, но очень хочется самому разобраться.
Код работает, но как-то криво в итоге нашел только один диапазон  из 33.
Буду признателен за помощь!
Заранее спасибо!
Изменено: Станислав Воротынцев - 01.10.2022 15:58:47
 
Код
Sub fillTable()
    Dim shSVOD As Worksheet, shTemp As Worksheet
    Dim arrShopNames As Variant, vShopName As Variant
    Dim lRow As Long
    Dim Rng As Range
    
    Set shSVOD = Worksheets("Сводная")
    
    With shSVOD
        'список всех магазинов из столбца В
        arrShopNames = .Range("B2:B" & .Cells(.Rows.Count, 2).End(xlUp).Row).Value '2 это столбец В
    End With
    
    'отключаем обновление экрана
    Application.ScreenUpdating = False
    
    'переменная для подсчёта строк (в какую строку будем вставлять данные)
    lRow = 1
    
    'цикл по всем магазинам из столбца В
    For Each vShopName In arrShopNames
        lRow = lRow + 1 'на листе Сводная 1-й магазин находится на 2-й строке и далее +1
        'присваиваем shTemp очередному листу по названию магазина
        On Error Resume Next
        Set shTemp = Worksheets(vShopName)
        On Error GoTo 0
        'если лист называется так как и магазин, то shTemp будет лист, если Nothing, значит лист назван не так как магазин
        If Not shTemp Is Nothing Then
            With shTemp
                'присваиваем диапазон переменной Rng
                Set Rng = .Range("B1:B" & .Cells(.Rows.Count, 2).End(xlUp).Row) '2 это столбец В
            End With
            'копируем диапазон В из очередного листа
            Rng.Copy
            'вставляем на лист Сводная и транспонируем его
            shSVOD.Cells(lRow, 3).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
        End If
    Next vShopName
    
    'убираем выделение строки, перемещая курсор в ячейку А1
    shSVOD.Range("A1").Select
    
    'включаем обновление экрана
    Application.ScreenUpdating = True
    
    MsgBox "Копирование данных завершено!", vbInformation, "Конец"
End Sub
Изменено: New - 01.10.2022 16:31:33
 
Спасибо за ответ! масштабно получилось))
А почему мой вариант считал не верно не подскажите?)
 
Потому что там всё неправильно. Вот могу предложить ещё один вариант. Ближе к вашей логике. Видите я ни в первом, ни во втором случае нигде не обращаюсь к самому файлу с макросом, а только к листу Сводная. Вам сам файл с макросом вообще не нужен. У вас работа происходит внутри одного файла

Код
Sub fillTable()
    Dim ws As Worksheet, shTemp As Worksheet
    Dim i As Long, LastRow As Long
    Dim sheetName As String
    Dim Rng As Range

    Set ws = Worksheets("Сводная") 'тут надо обращаться к листу Сводная, а не ко всему файлу
    With ws
        LastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
        For i = 2 To LastRow
            sheetName = ws.Cells(i, 2)
            On Error Resume Next
            Set shTemp = Worksheets(sheetName)
            On Error GoTo 0
            If Not shTemp Is Nothing Then
                With shTemp
                    Set Rng = .Range("B1:B" & .Cells(.Rows.Count, 2).End(xlUp).Row)
                    Rng.Copy
                End With
                .Cells(i, 3).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
            End If
        Next i
    End With
End Sub
Изменено: New - 01.10.2022 16:50:36
 
Спасибо! кажется начал понимать. Я только начинаю, поэтому этот вариант как, минимум более понятен для меня
Страницы: 1
Наверх