Доброго времени суток уважаемые. Случилось так, что накропал я небольшого "уродца" . Его задача собрать определенные данные на один лист "Дефицит". Данные он исправно собирает. Но вот незадача: мне эти данные надо собирать со всех листов книги , кроме листов "План" и "Литье". А как это сделать не знаю.
[vba]
Код
Sub diff() Dim d1&, d2&, S&, R&, PS&, d_ As Range Application.ScreenUpdating = False Application.CutCopyMode = False Application.DisplayAlerts = False R = Range("D" & Rows.Count).End(xlUp).Row + 1 Worksheets("Дефицит").Select
Range("A3:V" & R).Select Selection.ClearContents Worksheets("О23").Select d1 = Worksheets("О23").Range("B" & Rows.Count).End(xlUp).Row d2 = Worksheets("О23").Cells(18, Columns.Count).End(xlToLeft).Column Dim lFirstRow As Long, lFirstCol As Long, rFndRng As Range If ActiveSheet.UsedRange.Cells(15, 1) = "ОМТС" Then lFirstRow = ActiveSheet.UsedRange.Row lFirstCol = ActiveSheet.UsedRange.Column Else Set rFndRng = ActiveSheet.UsedRange.Find("ОМТС", , xlFormulas, xlWhole) lFirstRow = rFndRng.Row: lFirstCol = rFndRng.Column End If Set d_ = Range(Cells(15, lFirstCol), Cells(15, d2)) If d_(1).ColumnWidth Then c_ = d_.Cells.Count n_ = Range("N3") d_.EntireColumn.Hidden = False For i = 1 To c_ If d_(i) <> "Диф." Then d_(i).ColumnWidth = 0 End If Next i End If Worksheets("О23").Select For i = 18 To d1 If Worksheets("О23").Range("B" & i).Value = 60 Then Range(Cells(i, 1), Cells(i, d2)).Select Selection.SpecialCells(xlCellTypeVisible).Select Selection.Copy Worksheets("Дефицит").Select
PS = Range("D" & Rows.Count).End(xlUp).Row + 1 Range("A" & PS).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Worksheets("О23").Select End If Next i Worksheets("О23").Select d_.EntireColumn.Hidden = False Sheets("Дефицит").Select Application.ScreenUpdating = True Application.CutCopyMode = True Application.DisplayAlerts = True End Sub
[/vba]
помогите пожалуйста
Доброго времени суток уважаемые. Случилось так, что накропал я небольшого "уродца" . Его задача собрать определенные данные на один лист "Дефицит". Данные он исправно собирает. Но вот незадача: мне эти данные надо собирать со всех листов книги , кроме листов "План" и "Литье". А как это сделать не знаю.
[vba]
Код
Sub diff() Dim d1&, d2&, S&, R&, PS&, d_ As Range Application.ScreenUpdating = False Application.CutCopyMode = False Application.DisplayAlerts = False R = Range("D" & Rows.Count).End(xlUp).Row + 1 Worksheets("Дефицит").Select
Range("A3:V" & R).Select Selection.ClearContents Worksheets("О23").Select d1 = Worksheets("О23").Range("B" & Rows.Count).End(xlUp).Row d2 = Worksheets("О23").Cells(18, Columns.Count).End(xlToLeft).Column Dim lFirstRow As Long, lFirstCol As Long, rFndRng As Range If ActiveSheet.UsedRange.Cells(15, 1) = "ОМТС" Then lFirstRow = ActiveSheet.UsedRange.Row lFirstCol = ActiveSheet.UsedRange.Column Else Set rFndRng = ActiveSheet.UsedRange.Find("ОМТС", , xlFormulas, xlWhole) lFirstRow = rFndRng.Row: lFirstCol = rFndRng.Column End If Set d_ = Range(Cells(15, lFirstCol), Cells(15, d2)) If d_(1).ColumnWidth Then c_ = d_.Cells.Count n_ = Range("N3") d_.EntireColumn.Hidden = False For i = 1 To c_ If d_(i) <> "Диф." Then d_(i).ColumnWidth = 0 End If Next i End If Worksheets("О23").Select For i = 18 To d1 If Worksheets("О23").Range("B" & i).Value = 60 Then Range(Cells(i, 1), Cells(i, d2)).Select Selection.SpecialCells(xlCellTypeVisible).Select Selection.Copy Worksheets("Дефицит").Select
PS = Range("D" & Rows.Count).End(xlUp).Row + 1 Range("A" & PS).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Worksheets("О23").Select End If Next i Worksheets("О23").Select d_.EntireColumn.Hidden = False Sheets("Дефицит").Select Application.ScreenUpdating = True Application.CutCopyMode = True Application.DisplayAlerts = True End Sub
если отдельным sub сделать цикл, по sheets.count и в нем проверки поставить, что выбраный лист не "План" и "Литье" а передать в саб имя листа Sub diff(sh_name as string) в коде "О23" заменить на sh_name
если отдельным sub сделать цикл, по sheets.count и в нем проверки поставить, что выбраный лист не "План" и "Литье" а передать в саб имя листа Sub diff(sh_name as string) в коде "О23" заменить на sh_nameK-SerJC
Sub diff() Dim d1&, d2&, S&, R&, PS&, d_ As Range Dim lFirstRow As Long, lFirstCol As Long, rFndRng As Range, sh As Worksheet Application.ScreenUpdating = False Application.CutCopyMode = False Application.DisplayAlerts = False R = Worksheets("Дефицит").Range("D" & Rows.Count).End(xlUp).Row + 1 ' Worksheets("Дефицит").Select
For Each sh In ThisWorkbook.Sheets If sh.Name <> "План" And sh.Name <> "Литье" And sh.Name <> "Дефицит" Then With sh ' Worksheets("О23").Select .Outline.ShowLevels RowLevels:=0, ColumnLevels:=1 d1 = .Range("B" & Rows.Count).End(xlUp).Row d2 = .Cells(18, Columns.Count).End(xlToLeft).Column If .UsedRange.Cells(15, 1) = "ОМТС" Then lFirstRow = .UsedRange.Row lFirstCol = .UsedRange.Column Else Set rFndRng = .UsedRange.Find("ОМТС", , xlFormulas, xlWhole) lFirstRow = rFndRng.Row: lFirstCol = rFndRng.Column End If Set d_ = .Range(.Cells(15, lFirstCol), .Cells(15, d2)) If d_(1).ColumnWidth Then c_ = d_.Cells.Count n_ = .Range("N3") d_.EntireColumn.Hidden = False For i = 1 To c_ If d_(i) <> "Диф." Then d_(i).ColumnWidth = 0 End If Next i End If ' Worksheets("О23").Select For i = 18 To d1 If .Range("B" & i).Value = 60 Then .Range(.Cells(i, 1), .Cells(i, d2)).SpecialCells(xlCellTypeVisible).Copy ' Selection.SpecialCells(xlCellTypeVisible).Select ' Selection.Copy ' Worksheets("Дефицит").Select
PS = Worksheets("Дефицит").Range("D" & Rows.Count).End(xlUp).Row + 1 Worksheets("Дефицит").Range("A" & PS).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ' Worksheets("О23").Select End If Next i
' Worksheets("О23").Select d_.EntireColumn.Hidden = False Sheets("Дефицит").Select End With End If Next sh Application.ScreenUpdating = True Application.CutCopyMode = True Application.DisplayAlerts = True End Sub
[/vba]
В начале макроса написано: [vba]
Код
R = Range("D" & Rows.Count).End(xlUp).Row + 1 Worksheets("Дефицит").Select
Range("A3:V" & R).Select
[/vba] Если макрос всегда запускается с листа Дефицит, то select не нужен, а если нет, тогда R может неправильно посчитаться.
Проставила везде листы на всякий случай, и селекты закомментила.
Игорь, здравствуйте, наверное так?
[vba]
Код
Sub diff() Dim d1&, d2&, S&, R&, PS&, d_ As Range Dim lFirstRow As Long, lFirstCol As Long, rFndRng As Range, sh As Worksheet Application.ScreenUpdating = False Application.CutCopyMode = False Application.DisplayAlerts = False R = Worksheets("Дефицит").Range("D" & Rows.Count).End(xlUp).Row + 1 ' Worksheets("Дефицит").Select
For Each sh In ThisWorkbook.Sheets If sh.Name <> "План" And sh.Name <> "Литье" And sh.Name <> "Дефицит" Then With sh ' Worksheets("О23").Select .Outline.ShowLevels RowLevels:=0, ColumnLevels:=1 d1 = .Range("B" & Rows.Count).End(xlUp).Row d2 = .Cells(18, Columns.Count).End(xlToLeft).Column If .UsedRange.Cells(15, 1) = "ОМТС" Then lFirstRow = .UsedRange.Row lFirstCol = .UsedRange.Column Else Set rFndRng = .UsedRange.Find("ОМТС", , xlFormulas, xlWhole) lFirstRow = rFndRng.Row: lFirstCol = rFndRng.Column End If Set d_ = .Range(.Cells(15, lFirstCol), .Cells(15, d2)) If d_(1).ColumnWidth Then c_ = d_.Cells.Count n_ = .Range("N3") d_.EntireColumn.Hidden = False For i = 1 To c_ If d_(i) <> "Диф." Then d_(i).ColumnWidth = 0 End If Next i End If ' Worksheets("О23").Select For i = 18 To d1 If .Range("B" & i).Value = 60 Then .Range(.Cells(i, 1), .Cells(i, d2)).SpecialCells(xlCellTypeVisible).Copy ' Selection.SpecialCells(xlCellTypeVisible).Select ' Selection.Copy ' Worksheets("Дефицит").Select
PS = Worksheets("Дефицит").Range("D" & Rows.Count).End(xlUp).Row + 1 Worksheets("Дефицит").Range("A" & PS).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ' Worksheets("О23").Select End If Next i
' Worksheets("О23").Select d_.EntireColumn.Hidden = False Sheets("Дефицит").Select End With End If Next sh Application.ScreenUpdating = True Application.CutCopyMode = True Application.DisplayAlerts = True End Sub
[/vba]
В начале макроса написано: [vba]
Код
R = Range("D" & Rows.Count).End(xlUp).Row + 1 Worksheets("Дефицит").Select
Range("A3:V" & R).Select
[/vba] Если макрос всегда запускается с листа Дефицит, то select не нужен, а если нет, тогда R может неправильно посчитаться.
Проставила везде листы на всякий случай, и селекты закомментила.Manyasha
Марина спасибо!!!! На рабочем файле отработал на УРА!!! Вот только на 18 листах работал 3,5 минуты. А как его можно оптимизировать, что бы побыстрее?
Марина спасибо!!!! На рабочем файле отработал на УРА!!! Вот только на 18 листах работал 3,5 минуты. А как его можно оптимизировать, что бы побыстрее?китин
Не судите очень строго:я пытаюсь научиться ЯД 41001877306852
у меня на каждом листе столбец "Производитель" находится в разных местах.В файле на листе 008 столбец ВА а на листе 023 столбец I . между ними данные по применяемости деталей в зависимости от изделия. И вот эти данные я скрываю группировкой и их копировать не надо
у меня на каждом листе столбец "Производитель" находится в разных местах.В файле на листе 008 столбец ВА а на листе 023 столбец I . между ними данные по применяемости деталей в зависимости от изделия. И вот эти данные я скрываю группировкой и их копировать не надокитин
Не судите очень строго:я пытаюсь научиться ЯД 41001877306852
Всем привет. Интересная задача. Ребята, проверьте такой вариант. Как вариант. А вдруг натолкнет на новые мысли.
[vba]
Код
Sub sbor() Dim shi_ As Worksheet Application.ScreenUpdating = 0 For Each shi_ In ThisWorkbook.Worksheets If shi_.Name <> "План" And shi_.Name <> "Дефицит" And shi_.Name <> "Литье" Then With shi_ S = .Columns("G:DD").Find("*Производитель*", [G1], SearchDirection:=xlPrevious).Row K = .Columns("G:DD").Find("*Производитель*", [G1], SearchDirection:=xlPrevious).Column PK = .Cells(16, Columns.Count).End(xlToLeft).Column For I = PK To 7 Step -1 If Trim(.Cells(S - 1, I)) <> "Диф." And Trim(.Cells(S, I)) <> "Стоим. б/ндс" And Trim(.Cells(S, I)) <> "Производитель" Then .Columns(I).EntireColumn.Hidden = True End If Next R = .Range("B" & Rows.Count).End(xlUp).Row For I = R To 18 Step -1 If Trim(.Cells(I, 2)) = 60 And Trim(.Cells(I, K)) <> "" Then Else .Rows(I).EntireRow.Hidden = True End If Next PK = .Cells(S - 1, Columns.Count).End(xlToLeft).Column PS = Range("B" & Rows.Count).End(xlUp).Row + 1 S = S + 2 Range(.Cells(S, "B"), .Cells(R, PK)).SpecialCells(xlVisible).Copy Range("B" & PS) .Rows(S & ":" & R).EntireRow.Hidden = False .Columns("F:GG").EntireColumn.Hidden = False End With End If Next shi_ Application.ScreenUpdating = 1 End Sub
[/vba]
Всем привет. Интересная задача. Ребята, проверьте такой вариант. Как вариант. А вдруг натолкнет на новые мысли.
[vba]
Код
Sub sbor() Dim shi_ As Worksheet Application.ScreenUpdating = 0 For Each shi_ In ThisWorkbook.Worksheets If shi_.Name <> "План" And shi_.Name <> "Дефицит" And shi_.Name <> "Литье" Then With shi_ S = .Columns("G:DD").Find("*Производитель*", [G1], SearchDirection:=xlPrevious).Row K = .Columns("G:DD").Find("*Производитель*", [G1], SearchDirection:=xlPrevious).Column PK = .Cells(16, Columns.Count).End(xlToLeft).Column For I = PK To 7 Step -1 If Trim(.Cells(S - 1, I)) <> "Диф." And Trim(.Cells(S, I)) <> "Стоим. б/ндс" And Trim(.Cells(S, I)) <> "Производитель" Then .Columns(I).EntireColumn.Hidden = True End If Next R = .Range("B" & Rows.Count).End(xlUp).Row For I = R To 18 Step -1 If Trim(.Cells(I, 2)) = 60 And Trim(.Cells(I, K)) <> "" Then Else .Rows(I).EntireRow.Hidden = True End If Next PK = .Cells(S - 1, Columns.Count).End(xlToLeft).Column PS = Range("B" & Rows.Count).End(xlUp).Row + 1 S = S + 2 Range(.Cells(S, "B"), .Cells(R, PK)).SpecialCells(xlVisible).Copy Range("B" & PS) .Rows(S & ":" & R).EntireRow.Hidden = False .Columns("F:GG").EntireColumn.Hidden = False End With End If Next shi_ Application.ScreenUpdating = 1 End Sub
А смысл? 4 минуты отсеивают этот вариант. Это - если цех=60 и производитель не равен пусто. Так вроде отобраны обозначения? [p.s.]А сколько же у тебя листов?[/p.s.]
А смысл? 4 минуты отсеивают этот вариант. Это - если цех=60 и производитель не равен пусто. Так вроде отобраны обозначения? [p.s.]А сколько же у тебя листов?[/p.s.]Wasilich
Сообщение отредактировал Wasilich - Среда, 28.12.2016, 14:37
Так, нет! Это если в разных столбцах - и это и то попадает под условие. А в твоем коде должно быть или - или то или другое или и т.д. And замени на Or. Вроде не ошибся. Надо бежать. Дела.
Так, нет! Это если в разных столбцах - и это и то попадает под условие. А в твоем коде должно быть или - или то или другое или и т.д. And замени на Or. Вроде не ошибся. Надо бежать. Дела.Wasilich
Сообщение отредактировал Wasilich - Среда, 28.12.2016, 15:34
Доброе утро. Саша я обшибся не разобрался, что он нулевые значения не берет. Все работает отлично.Только как бы добавить, что бы он и столбец А подхватывал? и минусовые значения в красный красил?
Доброе утро. Саша я обшибся не разобрался, что он нулевые значения не берет. Все работает отлично.Только как бы добавить, что бы он и столбец А подхватывал? и минусовые значения в красный красил?китин