У меня есть 6 разных заголовков на листе WIPTX, которые будут извлекать информацию с вкладки TestData, которая по сути представляет собой данные, которые будут загружены с сайта SharePoint. Я хочу иметь возможность копировать и вставлять строки с определенными значениями, такими как тип статуса или имя.
под каждым заголовком на листе WIPTX. Заголовки находятся в столбцах A-C, E-G, I-K, M-O, Q-S и U-W. Заголовки имеют разные статусы, которые находятся на листе TestData. Статус включает в себя «Назначено», «Принято», «Выполняется», «Приостановлено», «Завершено» и «Отменено».
Будет ли это возможно?
Код, который у меня есть до сих пор, работает, но он не вставляется в определенные столбцы заголовков.
Я пытался исследовать и просматривать другие источники, но я все еще не могу найти правильный код, который соответствует тому, что я ищу.
Sub Update1()
Dim LastRow1 As Long, LastRow2 As Long, i As Long
With ThisWorkbook.Worksheets("TestData")
LastRow1 = .Cells(.Rows.Count, "A").End(xlUp).Row
For i = 1 To LastRow1
If .Range("A" & i).Value = "Thomas Xiong" Then
LastRow2 = ThisWorkbook.Worksheets("All Projects with NetBuilds").Cells(ThisWorkbook.Worksheets("All Projects with NetBuilds").Rows.Count, "A").End(xlUp).Row
.Rows(i).Copy ThisWorkbook.Worksheets("All Projects with NetBuilds").Rows(LastRow2 + 1)
End If
Next i
End With
End Sub
Это возможно?
Я думаю, что это должно помочь вам:
Option Explicit
Sub Update1()
Dim wsData As Worksheet, wsProjects As Worksheet, LastRow As Long, Col As Integer, CopyRange As Range, C As Range
With ThisWorkbook
Set wsData = .Sheets("TestData") 'refering the worksheet with all the data
Set wsProjects = .Sheets("All Projects with NetBuilds") 'refering the worksheet with the headers
End With
For Each C In wsData.Range("A2", wsData.Cells(1, 1).End(xlDown)) 'Lets assume the criteria is on the column A
With wsData
Select Case C.Value
Case "Assigned"
With wsData
Set CopyRange = .Range(.Cells(C.Row, 3), .Cells(C.Row, 5)) 'Here I'm assuming you want to copy data from Columns B To D
End With
Case "Accepted"
With wsData
Set CopyRange = .Range(.Cells(C.Row, 7), .Cells(C.Row, 9)) 'Here I'm assuming you want to copy data from Columns G To I
End With
'... all your headers
End Select
End With
With wsProjects
Col = .Cells.Find(C).Column 'Find the header column
LastRow = .Cells(.Rows.Count, Col).End(xlUp).Row + 1 'find the last row on that header
CopyRange.Copy .Cells(LastRow, Col) 'paste the range (this method will copy everything from the source)
End With
Next C
'In case you are always copying the same range of cells skip the select case, delete the CopyRange variable and just copy paste on the last block
End Sub
Я получаю сообщение об ошибке на Col=.Cells.Find(C).Column?
Приведенный выше код был просто примером. Вы должны изменить его в соответствии с вашими потребностями. C в моем коде - это ячейка в столбце A, поэтому, если ячейка в столбце A не является вашим заголовком, она выдаст ошибку.
Привет, Дамиан, у меня все еще проблемы с приведенным выше кодом. Я добавил все свои заголовки в оператор case, но теперь получаю сообщение об ошибке: Ожидаемая функция или переменная?
В каком столбце содержатся все заголовки? потому что я предполагаю, что заголовки находятся в столбце A в тестовых данных рабочего листа
на самом деле заголовки находятся в рабочем листе WIPTX, и я пытаюсь скопировать и вставить строки с разными статусами из рабочего листа TestData в заголовки «Назначено», «Принято», «Выполняется», «На удержании», «Завершено» и «Отменено».
Ну так, а где статус на листе testdata? в какой колонке?
Например, на рабочем листе TestData в столбце A есть имена, в столбце B есть статусы этого состояния: «Назначено», «Принято», «Выполняется», «На удержании», «Завершено» и «Отменено». Что я хочу сделать, так это скопировать и вставить строки с другим статусом в рабочий лист WIPTX под этим конкретным заголовком статуса. Хотел бы я добавить картинку.
Затем вам нужно изменить: wsData.Range("A2", wsData.Cells(1, 1).End(xlDown))
на wsData.Range("B2", wsData.Cells(1, 2).End(xlDown))
, потому что ваш статус находится в столбце B, и я предположил, что они были в столбце A.
Я изменил это, но по-прежнему получаю сообщение об ошибке: не задана переменная объекта или переменная с блоком. Ошибка выполнения 91 строка Col = .Cells.Find(C).Column 'Найти столбец заголовка
Извините, @TJunky, я забыл добавить With
, мой ответ отредактирован, и теперь он должен работать.
Я все еще получаю сообщение об ошибке "Переменная объекта" или "Переменная блока не установлена". Ошибка выполнения 91 строка Col = .Cells.Find(C).Column 'Найти столбец заголовка?
Можете ли вы дать мне свою рабочую тетрадь с ограниченным набором данных и моим реализованным макросом? вы можете изменить данные, если это проблема для обмена.
Конечно, у вас есть электронная почта или я могу связать ее с вами? и было бы проще использовать оператор if then? например: If .Column("B" & i).Value = "On Hold" Затем скопируйте и вставьте строку под заголовком On Hold на листе "WIPTX" в следующей доступной строке Else If .Column("B" & i) .Value = «Completed». Затем скопируйте и вставьте строку под заголовком «Completed» на листе «WIPTX» в следующей доступной строке.
Select
выглядит легче для чтения, чем если, вы можете использовать wetransfer, чтобы загрузить книгу и вставить ссылку сюда.
[ссылка](wetransfer.com/downloads/… ) это должна быть ссылка
Я только что попробовал вашу книгу, добавил If Not CopyRange Is Nothing Then
перед CopyRange.Copy .Cells(LastRow, Col)
. В вашем коде было ThisWorkbook.Worksheets("All Projects with NetBuilds")
, в то время как в вашей реальной книге есть рабочий лист с именем "WIPTX"
, как только я изменил имя листа на wsProjects
, все работает гладко. Также вы изменили .Cells.Find(C)
на .Cells.Find(A)
не делайте этого.
Спасибо, код запускается, но ничего не вставляется в рабочий лист WIPTX?
Если вы пытаетесь скопировать и вставить строку, у вас не может быть разных групп в одной строке. Вам нужно скопировать и вставить определенные столбцы для каждого заголовка. Допустим, столбцы A-C из листа TestData и вставьте их в последнюю строку, доступную в нужном заголовке.