копировать и вставлять данные из одного Excel в другой Excel на основе имени столбца, включая пустые ячейки - PullRequest
0 голосов
/ 29 марта 2012

Я просто пытаюсь получить данные из одного Excel в другой Excel на основе имени столбца.Имя источника Excel "iTerm Export.xls".Название листа "экспорт (1)".заголовок столбца "Актив".поэтому при запуске приведенного ниже макроса данные столбца актива должны быть скопированы и вставлены в другой файл Excel, т. е. ("iTerm metrics Report.xlsx")

Но моя проблема, если в столбце актива есть пустая ячейка,Пример: в столбце Актив есть 50 строк данных.Но 25 и 30 это пустая клетка.когда я запускаю макрос один раз, 24 строки копируют и вставляют в другой Excel.но мне нужно, чтобы все пятьдесят строк были скопированы и вставлены, включая пустую строку в другом excel

Windows("iTerm Export.xls").Activate
Sheets("export(1)").Select
Cells.Find(What:="Asset", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Windows("iTerm metrics Report.xlsx").Activate
Sheets("Raw Data from iTerm").Select
Range("A2").Select
ActiveSheet.Paste

Пожалуйста, помогите мне в этом.

Спасибо

Ответы [ 4 ]

3 голосов
/ 29 марта 2012

Arul

Я не буду предлагать вам использовать .Select, так как это является основной причиной ошибок. Смотрите эту ветку, например

Ошибка времени выполнения «1004»: сбой при выборе метода класса диапазона VBA 2003

Сказав это, я бы рекомендовал непосредственно выполнить действие, которое вы хотите, вместо того, чтобы сначала выполнить .Select. Кроме того, как вы открываете книги "iTerm Export.xls" и "iTerm metrics Report.xlsx"? Если они уже открыты при запуске макроса, тогда можно использовать .Activate, в противном случае установите переменную рабочей книги, а затем откройте рабочие книги. Таким образом, вы также можете избежать использования .Activate. Дайте мне знать, если это так, и я предоставлю образец.

Другим недостатком .Select и .Activate является то, что он значительно замедляет ваш код.

Ваш код выше также может быть написан как ниже. Это правильный способ использования .Find вместо непосредственного использования .Activate. Причина в том, что код будет зависать в строке ниже, если совпадение не найдено.

Cells.Find(What:="Asset", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= False, _ SearchFormat:=False).Activate

Поэтому желательно проверить, было ли найдено значение, а затем продолжить.

Попробуйте этот код и посмотрите, хотите ли вы этого? ( UNTESTED )

Sub Sample()
    Dim aCell As Range

    Windows("iTerm Export.xls").Activate

    With Sheets("export(1)")
        Set aCell = .Cells.Find(What:="Asset", LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False)

        '~~> Check if "Asset is found
        If Not aCell Is Nothing Then
            '~~> get the lastrow of the column which has "Asset"
            lastRow = .Range(Split(Cells(, aCell.Column).Address, "$")(1) & _
            .Rows.Count).End(xlUp).Row

            Windows("iTerm metrics Report.xlsx").Activate

            .Range( _
            Split(Cells(, aCell.Column).Address, "$")(1) & aCell.Row & _
            ":" & _
            Split(Cells(, aCell.Column).Address, "$")(1) & lastRow _
            ).Copy _
            Sheets("Raw Data from iTerm").Range("A2")
        Else
            MsgBox "Asset not found"
        End If
    End With
End Sub

НТН

Sid

1 голос
/ 29 марта 2012

Чтобы получить последний ряд вашего столбца, вы можете сделать это вместо:

   lastRow = Selection.EntireColumn.Find(What:="*", after:=Range("A1"), _
        LookIn:=xlFormulas, SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious).EntireRow.Row 'Use EntireRow to take hidden rows too

Тогда вы можете:

Range(Selection, Cells(lastRow, Selection.Column)).Select
0 голосов
/ 03 июля 2018

Sub Create_From_List ()

Dim Row As Integer Row = ActiveCell.Row

Dim objList As Worksheet
Set objList = ActiveSheet

Dim wb As Workbook
workingPath = ActiveWorkbook.Path

'вставьте документ, в который вы хотите перенести его (и сохраните его в той же папке, что итот, который является первоисточником)

Set wb = Workbooks.Add(workingPath & "\---") 

'введите ячейки, которые вы копируете из источника, затем имя листа целевой и ячейки, в которые вы хотите поместить информацию в целевой.

CheckAndCopyData objList.Cells(- , -), wb.Sheets("---").Range("--") 
CheckAndCopyData objList.Cells(- , -), wb.Sheets("---").Range("--")
CheckAndCopyData objList.Cells(- , -), wb.Sheets("---").Range("--")
CheckAndCopyData objList.Cells(- , -), wb.Sheets("---").Range("--")
CheckAndCopyData objList.Cells(- , -), wb.Sheets("---").Range("--")
CheckAndCopyData objList.Cells(- , -), wb.Sheets("---").Range("--")


Application.DisplayAlerts = False

'вы можете использовать информацию, которую вы передаете, как имя документа (используйте ячейки исходного документа)

wb.SaveAs (workingPath & "\" & objList.Cells(- , -) & " " & objList.Cells(- , -) & 
".xlsx") 
Application.DisplayAlerts = True

End Sub

Function CheckAndCopyData(SourceCell As Range, TargetCell As Range)
If Not IsEmpty(SourceCell) Then

TargetCell.Value = SourceCell.Value
End If
End Function
0 голосов
/ 29 марта 2012

Останавливается на пустом месте, потому что это то, что делает выбор xlDown.Я бы предложил выбрать весь столбец.

Columns(4).Select

или

Columns("D:D").Select

или, чтобы получить столбец с активной ячейкой

Columns(ActiveCell.Column).Select
...