Добрый день много уважаемые форумчане!!! Прошу Вас помочь (и разобраться для понимания) и в тоже самое время скорректировать код. Заранее СПАСИБО за отзывчивость и помощь!!! Имеются данные на листе "БЕТОН" хотелось бы чтоб при выполнении макроса "Класс/Марка" с листа "Бетон" копировались значения по листам (7,5; 10; 12,5; 15; 20; 22,5; 25; 30; 35; 40) К примеру если это бетон класс 7,5 то все эти значения копировались на лист 7,5 и также по аналогии по другим классам (см.скрин) Сам код вот такой вот (но возникают проблемы при выполнении данного макроса) [vba]
Private Sub ttt1(shTrt As Excel.Worksheet) Dim i As Long For i = 1 To Sheets.Count - 3 Call ttt2(Sheets(i), shTrt) Next End Sub
Private Sub ttt2(shSrc As Excel.Worksheet, shTrt As Excel.Worksheet) Dim arrE() Dim strType As String Dim lngStart As Long, lngEnd As Long, lngRowsCount As Long Dim lngLastRow As Long Dim i As Long strType = shTrt.Name arrE = shSrc.Range("C1:C" & shSrc.UsedRange.Row + shSrc.UsedRange.Rows.Count - 1).Value For i = 1 To UBound(arrE) If CStr(arrE(i, 1)) = strType Then lngStart = i Exit For End If Next If lngStart = 0 Then Exit Sub End If i = lngStart + 1 Do If CStr(arrE(i, 1)) <> strType Or i > UBound(arrE) Then lngEnd = i - 1 Exit Do Else i = i + 1 End If Loop lngRowsCount = lngEnd - lngStart + 1 lngLastRow = shTrt.UsedRange.Row + shTrt.UsedRange.Rows.Count shTrt.Cells(lngLastRow, "A").Resize(lngRowsCount, 20).Value = _ shSrc.Cells(lngStart, "D").Resize(lngRowsCount, 20).Value End Sub
[/vba]
Добрый день много уважаемые форумчане!!! Прошу Вас помочь (и разобраться для понимания) и в тоже самое время скорректировать код. Заранее СПАСИБО за отзывчивость и помощь!!! Имеются данные на листе "БЕТОН" хотелось бы чтоб при выполнении макроса "Класс/Марка" с листа "Бетон" копировались значения по листам (7,5; 10; 12,5; 15; 20; 22,5; 25; 30; 35; 40) К примеру если это бетон класс 7,5 то все эти значения копировались на лист 7,5 и также по аналогии по другим классам (см.скрин) Сам код вот такой вот (но возникают проблемы при выполнении данного макроса) [vba]
Private Sub ttt1(shTrt As Excel.Worksheet) Dim i As Long For i = 1 To Sheets.Count - 3 Call ttt2(Sheets(i), shTrt) Next End Sub
Private Sub ttt2(shSrc As Excel.Worksheet, shTrt As Excel.Worksheet) Dim arrE() Dim strType As String Dim lngStart As Long, lngEnd As Long, lngRowsCount As Long Dim lngLastRow As Long Dim i As Long strType = shTrt.Name arrE = shSrc.Range("C1:C" & shSrc.UsedRange.Row + shSrc.UsedRange.Rows.Count - 1).Value For i = 1 To UBound(arrE) If CStr(arrE(i, 1)) = strType Then lngStart = i Exit For End If Next If lngStart = 0 Then Exit Sub End If i = lngStart + 1 Do If CStr(arrE(i, 1)) <> strType Or i > UBound(arrE) Then lngEnd = i - 1 Exit Do Else i = i + 1 End If Loop lngRowsCount = lngEnd - lngStart + 1 lngLastRow = shTrt.UsedRange.Row + shTrt.UsedRange.Rows.Count shTrt.Cells(lngLastRow, "A").Resize(lngRowsCount, 20).Value = _ shSrc.Cells(lngStart, "D").Resize(lngRowsCount, 20).Value End Sub
'запускать при активном листе Бетон Sub RaznestiDannye() Dim i As Long Dim iLastRow As Long Dim iLR_Unic As Long Dim Criterij As String Dim Autofilter As Autofilter Application.ScreenUpdating = False iLastRow = Cells(Rows.Count, "A").End(xlUp).Row With Range("C1:C" & iLastRow) .Replace what:=".", replacement:="," End With Range("C1:C" & iLastRow).TextToColumns Range("K1:K" & iLastRow).ClearContents Range("C1:C" & iLastRow).AdvancedFilter xlFilterCopy, CopyToRange:=Range("K1"), Unique:=True iLR_Unic = Cells(Rows.Count, "K").End(xlUp).Row For i = 2 To iLR_Unic 'цикл по класс/маркам Criterij = Cells(i, "K") 'ставим автофильтр по столбцу C Range("A1").CurrentRegion.Autofilter 3, Criterij 'копируем видимые строки With Worksheets(Criterij) .Cells.Clear ActiveSheet.Autofilter.Range.SpecialCells(xlCellTypeVisible).Copy .Range("A1") ActiveSheet.Autofilter.Range.Autofilter End With Next Application.ScreenUpdating = True End Sub
[/vba]
[vba]
Код
'запускать при активном листе Бетон Sub RaznestiDannye() Dim i As Long Dim iLastRow As Long Dim iLR_Unic As Long Dim Criterij As String Dim Autofilter As Autofilter Application.ScreenUpdating = False iLastRow = Cells(Rows.Count, "A").End(xlUp).Row With Range("C1:C" & iLastRow) .Replace what:=".", replacement:="," End With Range("C1:C" & iLastRow).TextToColumns Range("K1:K" & iLastRow).ClearContents Range("C1:C" & iLastRow).AdvancedFilter xlFilterCopy, CopyToRange:=Range("K1"), Unique:=True iLR_Unic = Cells(Rows.Count, "K").End(xlUp).Row For i = 2 To iLR_Unic 'цикл по класс/маркам Criterij = Cells(i, "K") 'ставим автофильтр по столбцу C Range("A1").CurrentRegion.Autofilter 3, Criterij 'копируем видимые строки With Worksheets(Criterij) .Cells.Clear ActiveSheet.Autofilter.Range.SpecialCells(xlCellTypeVisible).Copy .Range("A1") ActiveSheet.Autofilter.Range.Autofilter End With Next Application.ScreenUpdating = True End Sub
Sub ttr() Dim sh As Worksheet Application.ScreenUpdating = 0 Application.Calculation = xlCalculationManual With ActiveSheet r_ = .Range("A" & .Rows.Count).End(xlUp).Row c_ = .Cells(1, .Columns.Count).End(xlToLeft).Column If .AutoFilterMode Then'если есть автофильтр .Range("A1").AutoFilter'снимаем его - мы ж не знаем на какой диапазон он поставлен End If .Range("A1").Resize(r_, c_).AutoFilter'ставим автофильтр For Each sh In ThisWorkbook.Worksheets'цикл по листам shn_ = sh.Name If shn_ <> .Name Then .Range("$A$1").AutoFilter Field:=3, Criteria1:=shn_ .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy sh.Range("A1") With sh'ставим автофильтры на всех листах. Если не нужно - сотрите 6 строк With - End With If .AutoFilterMode Then .Range("A1").AutoFilter End If .Range("A1").Resize(r_, c_).AutoFilter End With End If Next sh .ShowAllData End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = 1 MsgBox "Всё" End Sub
[/vba]
У меня так получилось [vba]
Код
Sub ttr() Dim sh As Worksheet Application.ScreenUpdating = 0 Application.Calculation = xlCalculationManual With ActiveSheet r_ = .Range("A" & .Rows.Count).End(xlUp).Row c_ = .Cells(1, .Columns.Count).End(xlToLeft).Column If .AutoFilterMode Then'если есть автофильтр .Range("A1").AutoFilter'снимаем его - мы ж не знаем на какой диапазон он поставлен End If .Range("A1").Resize(r_, c_).AutoFilter'ставим автофильтр For Each sh In ThisWorkbook.Worksheets'цикл по листам shn_ = sh.Name If shn_ <> .Name Then .Range("$A$1").AutoFilter Field:=3, Criteria1:=shn_ .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy sh.Range("A1") With sh'ставим автофильтры на всех листах. Если не нужно - сотрите 6 строк With - End With If .AutoFilterMode Then .Range("A1").AutoFilter End If .Range("A1").Resize(r_, c_).AutoFilter End With End If Next sh .ShowAllData End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = 1 MsgBox "Всё" End Sub