#excel #vba
Вопрос:
Я создаю рабочую книгу, в которой каждый лист предназначен для разных этапов установки программного обеспечения. Я пытаюсь объединить неудачные шаги, скопировав мои неудачные строки в сводный лист. Я, наконец, заставил их потянуть, но они тянут на новый лист в той же строке#, что и на исходном листе.
Вот что я сейчас использую:
Option Explicit
Sub Test()
Dim Cell As Range
With Sheets(7)
' loop column H untill last cell with value (not entire column)
For Each Cell In .Range("D1:D" amp; .Cells(.Rows.Count, "D").End(xlUp).Row)
If Cell.Value = "Fail" Then
' Copy>>Paste in 1-line (no need to use Select)
.Rows(Cell.Row).Copy Destination:=Sheets(2).Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
End If
Next Cell
End With
End Sub
Мне необходимо:
- Вытяните строку, в которой есть ячейка, содержащая «Сбой».
- Скопируйте строку в мастер, начиная с строки 4 и последовательно вниз без перезаписи
- Запустите все листы сразу- *(они называются на каждом шаге установки — нужно ли мне переименовывать в «лист1, лист2 и т. Д.»????)
- При запуске макроса очистите предыдущие результаты (чтобы избежать дублирования)
Другой пользователь предложил мне макрос автофильтра, но он не работает на 1004 в этой строке «.АвтоФильтр 4, «Сбой»»
Sub Filterfail()
Dim ws As Worksheet, sh As Worksheet
Set sh = Sheets("Master")
Application.ScreenUpdating = False
'sh.UsedRange.Offset(1).Clear 'If required, this line will clear the Master sheet with each transfer of data.
For Each ws In Worksheets
If ws.Name <> "Master" Then
With ws.[A1].CurrentRegion
.AutoFilter 4, "Fail"
.Offset(1).EntireRow.Copy sh.Range("A" amp; Rows.Count).End(3)(2)
.AutoFilter
End With
End If
Next ws
Application.ScreenUpdating = True
End Sub
Комментарии:
1. Э-э-э, ни то, ни другое ничего не дало? Я знаю, что плохо разбираюсь в VBA, но я изменил номера листов для своей книги, но при запуске ничего не происходит.
Ответ №1:
Попробуйте это:
Текст “Completed”
в этом xRStr = "Completed"
сценарии указывает конкретное условие, на основе которого вы хотите копировать строки;
C:C
в этом Set xRg = xWs.Range("C:C")
сценарии указывается конкретный столбец, в котором находится условие.
Public Sub CopyRows()
Dim xWs As Worksheet
Dim xCWs As Worksheet
Dim xRg As Range
Dim xStrName As String
Dim xRStr As String
Dim xRRg As Range
Dim xC As Integer
On Error Resume Next
Application.DisplayAlerts = False
xStr = "New Sheet"
xRStr = "Completed"
Set xCWs = ActiveWorkbook.Worksheets.Item(xStr)
If Not xCWs Is Nothing Then
xCWs.Delete
End If
Set xCWs = ActiveWorkbook.Worksheets.Add
xCWs.Name = xStr
xC = 1
For Each xWs In ActiveWorkbook.Worksheets
If xWs.Name <> xStr Then
Set xRg = xWs.Range("C:C")
Set xRg = Intersect(xRg, xWs.UsedRange)
For Each xRRg In xRg
If xRRg.Value = xRStr Then
xRRg.EntireRow.Copy
xCWs.Cells(xC, 1).PasteSpecial xlPasteValuesAndNumberFormats
xC = xC 1
End If
Next xRRg
End If
Next xWs
Application.DisplayAlerts = True
End Sub
Ответ №2:
Вот еще один способ — вам придется назначить свои собственные листы — я использовал 1 и 2, а не 2 и 7
Sub Test()
Dim xRow As Range, xCel As Range, dPtr As Long
Dim sSht As Worksheet, dSht As Worksheet
' Assign Source amp; Destination Sheets - Change to suit yourself
Set sSht = Sheets(2)
Set dSht = Sheets(1)
' Done
dPtr = Sheets(1).Rows.Count
dPtr = Sheets(1).Range("D" amp; dPtr).End(xlUp).Row
For Each xRow In sSht.UsedRange.Rows
Set xCel = xRow.Cells(1, 1) ' xCel is First Column in Used Range (May not be D)
Set xCel = xCel.Offset(0, 4 - xCel.Column) ' Ensures xCel is in Column D
If xCel.Value = "Fail" Then
dPtr = dPtr 1
sSht.Rows(xCel.Row).Copy Destination:=dSht.Rows(dPtr)
End If
Next xRow
End Sub
Я думаю, что одна из проблем в вашем собственном коде связана с этой строкой
.Rows(Cell.Row).Copy Destination:=Sheets(2).Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
Строки раздела.Подсчет, «А» должно относиться к целевому листу(2), но не из-за строки
With Sheets(7)
дальше вверх
Комментарии:
1. Хорошо, этот код действительно работает, «С листами(7)» является источником, и я хотел бы изменить его в диапазон/массив, чтобы я мог извлекать данные со всех листов одновременно.
2. Попробуйте, вернитесь и покажите, что вы пробовали. Для этого может потребоваться только внешний цикл, вызывающий Test() для различных листов, а затем небольшой мод в тесте — передача исходного листа в качестве параметра. Если вас устраивает мой ответ на ваш первоначальный вопрос, было бы здорово, если бы вы его приняли. Тнх.