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 Sub
[/vba]
Здравствуйте, прошу подсказать, как можно усовершенствовать макрос, чтобы он выполнялся на все листы документа? Спасибо большое за помощь! [vba]
Код
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
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
Ага, учел ваш сайт, попробовал изменить, но все равно по одному листу только работает, пытается пойти дальше но дает ошибку [vba]
Код
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
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
Ага, учел ваш сайт, попробовал изменить, но все равно по одному листу только работает, пытается пойти дальше но дает ошибку [vba]
Код
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
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
И как Вы себе это представляете? Как Вы собрались вводить через InputBox кол-во строк и столбцов для всех листов сразу, если оно на каждом листе разное (иначе зачем InputBox)?
И как Вы себе это представляете? Как Вы собрались вводить через InputBox кол-во строк и столбцов для всех листов сразу, если оно на каждом листе разное (иначе зачем InputBox)?Serge_007