Здравствуйте! Есть файл с небольшим количеством листов (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, копировать код макроса из редактора VBE нужно при установленной русской раскладке клавиатуры в Windows, иначе будет так "Neieuei no?ie n iiaienyie naa?oo?"
я запустил ваш макрос из файла на листе "Было", выбрал весь диапазон таблицы мышкой и два раза указал цифру 1 - создался лист и он заполнился данными. Макрос отработал без ошибок. Мне сейчас не понятно, где у вас происходит ошибка. Макрос работает
написал: я запустил ваш макрос из файла на листе "Было", выбрал весь диапазон таблицы мышкой и два раза указал цифру 1 - создался лист и он заполнился данными. Макрос отработал без ошибок. Мне сейчас не понятно, где у вас происходит ошибка. Макрос работает
макрос на 1 листе работает, я знаю. но я хотел бы, чтобы он отработал так на всех листах от одного запуска макроса.
gefy 444 написал: да на одном листе он работает, но я хотел бы, чтоб на всех отработал так от одного запуска макросом
А какой должен быть результат, на разных листах или один под другим. И как Вы собираетесь выделять диапазоны, либо они у Вас должны быть все одинаковые, либо все равно придется выбирать вручную на каждом листе. Или придется пересмотреть принцип сбора данных. Можете почитать ТУТ про сбор данных с разных листов одной книги. Соберите все данные на один лист, а потом преобразовывайте их, в нужный вид
Msi2102, на каждой листе форма данных одинаковая, по идее должно быть так: на 1 листе использовать макрос - выбрать диапазон данных, затем строки и столбцы соответственно, макрос отработал редизайн листа и затем чтобы данный редизайн (условиям по макросу) были применены на следующие листы Без. сливания в один лист.
так сейчас макрос создаёт новый лист и выгружает на него результат редизайна. Допустим в файле 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
Будет обрабатывать листы которые начинаются на "Было"
Не советую этого делать, потому что может неадекватно работать, нужна какая-нибудь привязка к именам, т.к. не из всех листов данная операция должна производиться, например если вы будете производить повторную обработку, то из уже собранных листов тоже будут браться данные и создаваться дополнительные листы. Если всё таки Вы решитесь на это безумие, то удалите или исправьте эту строку