2012-03-29 1 views
0

Я просто пытаюсь вытащить данные из одного excel в другое excel на основе имени столбца. Имя источника excel - «iTerm Export.xls». Имя листа - «export (1)». Заголовок столбца - «Asset». поэтому при запуске ниже макроса данных столбца Asset необходимо скопировать и вставить в другое excel, т. е. («iTerm metrics Report.xlsx»)Скопируйте и вставьте данные, чтобы перенести данные в другое excel на основе имени столбца, включая пустые ячейки

Но моя проблема, если в столбце Asset имеется пустая ячейка, Ex: в столбце Asset имеется 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 

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

Благодаря

ответ

0

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

Columns(4).Select 

или

Columns("D:D").Select 

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

Columns(ActiveCell.Column).Select 
+0

пардон all..i попытались выше трех scnario ... но его не соответствие с моими вопросами ... –

1

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

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 
3

Arul

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

Run Time Error '1004': Select method of Range Class failed 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