Страницы: 1
RSS
Макрос для редизайнера на все страницы файла, Прошу помочь с кодом для редизайна таблиц для всего файла
 
Здравствуйте! Есть файл с небольшим количеством листов (10 примерно), у меня есть макрос, только выдает ошибку при запуске.В чем суть макроса, требуется произвести редизайна на всех листах файлах (условия редизайна одинаковы для всех листов). Условия задаются уже в макросе (выбрать область (область, количество строк сверху, столбцов слева). В чем ошибка? Буду благодарен, если так же подскажите как дописать, чтобы область он определял по кол-ву заполненный полей 1 строки и 1 столбца.
Код
Sub Redesigner()
    Dim inpdata As Range, realdata As Range, ns As Worksheet
    Dim i&, j&, k&, c&, r&, hc&, hr&
    Dim out() As String, dataArr, hcArr, hrArr
    
    For Each ws In Worksheets
  With ws
     Set inpdata = ThisWorkbook.Application.InputBox( _
   prompt:="¬ыберите обрабатываемый диапазон:", Title:="¬ыбор диапазона", Type:=8)
    
   hr = Val(InputBox("—колько строк с подпис€ми сверху?"))
   hc = Val(InputBox("—колько столбцов с подпис€ми слева?"))

   
    If inpdata.Rows.Count <= hr Or inpdata.Columns.Count <= hc Then Exit Sub
    Set realdata = inpdata.Offset(hr, hc).Resize(inpdata.Rows.Count - hr, inpdata.Columns.Count - hc)
    dataArr = realdata.Value
    If hr Then hrArr = inpdata.Offset(0, hc).Resize(hr, inpdata.Columns.Count - hc).Value
    If hc Then hcArr = inpdata.Offset(hr, 0).Resize(inpdata.Rows.Count - hr, hc).Value
    
    ReDim out(1 To Application.CountA(realdata), 1 To hr + hc + 1)
    Set ns = Worksheets.Add
    
    For i = 1 To UBound(dataArr, 1)
        For j = 1 To UBound(dataArr, 2)
            If Not IsEmpty(dataArr(i, j)) Then
                k = k + 1
                For c = 1 To hc: out(k, c) = hcArr(i, c): Next c
                For r = 1 To hr: out(k, c + r - 1) = hrArr(r, j): Next r
                out(k, c + r - 1) = dataArr(i, j)
            End If
    Next j, i
    ns.Cells(2, 1).Resize(UBound(out, 1), UBound(out, 2)) = out
    End with ws
    Next ws
End Sub


Изменено: gefy 444 - 27.05.2022 14:23:52
 
gefy 444, без файла сложно понять в чем ошибка, потому что не понятно, где и как расположены данные изначально, их формат и т.п.
 
gefy 444, копировать код макроса из редактора VBE нужно при установленной русской раскладке клавиатуры в Windows, иначе будет так "Neieuei no?ie n iiaienyie naa?oo?"
Изменено: New - 27.05.2022 14:13:37
 
Цитата
написал:
gefy 444 , без файла сложно понять в чем ошибка, потому что не понятно, где и как расположены данные изначально, их формат и т.п.
Вот пример  
 
New, подправил, спасибо за заметку
 
я запустил ваш макрос из файла на листе "Было", выбрал весь диапазон таблицы мышкой и два раза указал цифру 1 - создался лист и он заполнился данными. Макрос отработал без ошибок. Мне сейчас не понятно, где у вас происходит ошибка. Макрос работает
 
Цитата
gefy 444 написал:
выбрать область (область, количество строк сверху, столбцов слева
Может выбираете не правильно?
- Выбрать область это нужно мышкой на листе выделить вашу таблицу
У меня отработало без ошибок
Изменено: Msi2102 - 27.05.2022 14:42:13
 
Цитата
написал:
я запустил ваш макрос из файла на листе "Было", выбрал весь диапазон таблицы мышкой и два раза указал цифру 1 - создался лист и он заполнился данными. Макрос отработал без ошибок. Мне сейчас не понятно, где у вас происходит ошибка. Макрос работает
макрос на 1 листе работает, я знаю. но я хотел бы, чтобы он отработал так на всех листах от одного запуска макроса.
 
Цитата
написал:
Может выбираете не правильно?- Выбрать область это нужно мышкой на листе выделить вашу таблицуУ меня отработало без ошибок
макрос на 1 листе работает, я знаю. но я хотел бы, чтобы он отработал так на всех листах от одного запуска макроса.
 
New, Msi2102, да на одном листе он работает, но я хотел бы, чтоб на всех отработал так от одного запуска макросом
 
Цитата
gefy 444 написал:
да на одном листе он работает, но я хотел бы, чтоб на всех отработал так от одного запуска макросом
А какой должен быть результат, на разных листах или один под другим. И как Вы собираетесь выделять диапазоны, либо они у Вас должны быть все одинаковые, либо все равно придется выбирать вручную на каждом листе. Или придется пересмотреть принцип сбора данных.
Можете почитать ТУТ про сбор данных с разных листов одной книги. Соберите все данные на один лист, а потом преобразовывайте их, в нужный вид
Изменено: Msi2102 - 27.05.2022 15:32:00
 
Msi2102, на каждой листе форма данных одинаковая, по идее должно быть так: на 1 листе использовать макрос - выбрать диапазон данных, затем строки и столбцы соответственно, макрос отработал редизайн листа и затем чтобы данный редизайн  (условиям по макросу) были применены на следующие листы
Без. сливания в один лист.
Изменено: gefy 444 - 27.05.2022 15:34:59
 
так сейчас макрос создаёт новый лист и выгружает на него результат редизайна. Допустим в файле 5 листов с данными. Вы запустите макрос и вы хотите, чтобы создалось 5 новых листов с преобразованными данными?
 
Код
    Sub example1()

    Dim inpdata As Range, realdata As Range, ns As Worksheet
    Dim i&, j&, k&, c&, r&, hc&, hr&
    Dim out() As String, dataArr, hcArr, hrArr
    Dim x As Worksheet

    Set inpdata = ThisWorkbook.Application.InputBox( _
   prompt:="Выберите обрабатываемый диапазон:", Title:="Выбор диапазона", Type:=8)
    
   hr = Val(InputBox("Сколько строк с подписями сверху?"))
   hc = Val(InputBox("Сколько столбцов с подписями слева?"))
   
   For Each x In ThisWorkbook.Worksheets()
    
    If inpdata.Rows.Count <= hr Or inpdata.Columns.Count <= hc Then Exit Sub
    Set realdata = inpdata.Offset(hr, hc).Resize(inpdata.Rows.Count - hr, inpdata.Columns.Count - hc)
    dataArr = realdata.Value
    If hr Then hrArr = inpdata.Offset(0, hc).Resize(hr, inpdata.Columns.Count - hc).Value
    If hc Then hcArr = inpdata.Offset(hr, 0).Resize(inpdata.Rows.Count - hr, hc).Value
    
    ReDim out(1 To Application.CountA(realdata), 1 To hr + hc + 1)
    Set ns = Worksheets.Add
    
    For i = 1 To UBound(dataArr, 1)
        For j = 1 To UBound(dataArr, 2)
            If Not IsEmpty(dataArr(i, j)) Then
                k = k + 1
                For c = 1 To hc: out(k, c) = hcArr(i, c): Next c
                For r = 1 To hr: out(k, c + r - 1) = hrArr(r, j): Next r
                out(k, c + r - 1) = dataArr(i, j)
            End If
    Next j, i
    ns.Cells(2, 1).Resize(UBound(out, 1), UBound(out, 2)) = out
Next x
End Sub

Подправил макрос, но он не хочет на все листы использоваться, выдает ошибку, в чем ошибка в коде?
 
Попробуйте так:
Код
Sub Redesigner()
    Dim inpdata As Range, realdata As Range, ns As Worksheet, Current As Worksheet
    Dim i&, j&, k&, c&, r&, hc&, hr&
    Dim out() As String, dataArr, hcArr, hrArr
    Set inpdata = ThisWorkbook.Application.InputBox( _
    prompt:="Выберите обрабатываемый диапазон:", Title:="Выбор диапазона", Type:=8)
    hr = Val(InputBox("Сколько строк с подписями сверху?"))
    hc = Val(InputBox("Сколько столбцов с подписями слева?"))
    If inpdata.Rows.Count <= hr Or inpdata.Columns.Count <= hc Then Exit Sub
    For Each Current In Worksheets
        If LCase(Left(Current.Name, 4)) = "было" Then
            Set realdata = Current.Range(inpdata.Address).Offset(hr, hc).Resize(Current.Range(inpdata.Address).Rows.Count - hr, Current.Range(inpdata.Address).Columns.Count - hc)
            If hr Then hrArr = Current.Range(inpdata.Address).Offset(0, hc).Resize(hr, Current.Range(inpdata.Address).Columns.Count - hc).Value
            If hc Then hcArr = Current.Range(inpdata.Address).Offset(hr, 0).Resize(Current.Range(inpdata.Address).Rows.Count - hr, hc).Value
            dataArr = realdata.Value
            ReDim out(1 To Application.CountA(realdata), 1 To hr + hc + 1)
            Set ns = Worksheets.Add
            k = 0
            For i = 1 To UBound(dataArr, 1)
                For j = 1 To UBound(dataArr, 2)
                    If Not IsEmpty(dataArr(i, j)) Then
                        k = k + 1
                        For c = 1 To hc: out(k, c) = hcArr(i, c): Next c
                        For r = 1 To hr: out(k, c + r - 1) = hrArr(r, j): Next r
                        out(k, c + r - 1) = dataArr(i, j)
                    End If
                Next j, i
            ns.Cells(2, 1).Resize(UBound(out, 1), UBound(out, 2)) = out
        End If
    Next
End Sub

Будет обрабатывать листы которые начинаются на "Было"
Изменено: Msi2102 - 27.05.2022 16:21:45
 
Msi2102, вот все отлично, как надо, но можно убрать привязку к названиям листов?
 
Не советую этого делать, потому что может неадекватно работать, нужна какая-нибудь привязка к именам, т.к. не из всех листов данная операция должна производиться, например если вы будете производить повторную обработку, то из уже собранных листов тоже будут браться данные и создаваться дополнительные листы.
Если всё таки Вы решитесь на это безумие, то удалите или исправьте эту строку
Код
If LCase(Left(Current.Name, 4)) = "было" Then

и если удалите, то удаляйте ещё
Код
End If

перед последним Next
Удачи
 
КРОСС
 
gefy 444,  размешаете свой вопрос на нескольких ресурсах - информируйте об это прямыми ссылками.
 
Msi2102, понял, учту такой вариант, спасибо большое
Макрос подошел, в обоих случаях, спасибо за помощь еще раз
Страницы: 1
Наверх