2014-10-08 8 views
1

Я могу успешно импортировать рабочие листы в свою книгу. Но можно ли просто импортировать столбцы, которые я хочу? Данные действительно огромны, и я не хочу иметь проблемы, чтобы пройти через каждую часть ячеек. Ниже приведены мои коды:Как импортировать рабочий лист с нужными столбцами? Excel VBA

Sub ImportSheet() 
    Dim wb As Workbook 
    Dim activeWB As Workbook 
    Dim sheet As Worksheet 
    Dim FilePath As String 
    Dim oWS  As String 
    Set activeWB = Application.ActiveWorkbook 

    FilePath = "C:\Report.xlsx" 

    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 

    Set wb = Application.Workbooks.Open(FilePath) 
    wb.Sheets("Report").Copy After:=activeWB.Sheets(activeWB.Sheets.Count) 
    activeWB.Activate 
    wb.Close False 
    Application.ScreenUpdating = True 
    Application.DisplayAlerts = True 

End Sub 

ответ

1

Не уверен, что я нарушаю протокол здесь, но это совершенно другой подход, и опция Добавить другой ответ был там. Этот метод использует метод 'copy to new worksheet', который должен быть проще на ограниченных ресурсах.

Sub ImportSheet() 
    Dim iWB As Workbook, aWB As Workbook, ws As Worksheet 
    Dim FilePath As String, v As Long, vCOLs As Variant 

    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 

    FilePath = "C:\Report.xlsx" 
    vCOLs = Array(1, 13, 6, 18, 4, 2) 'columns to copy in this order 

    Set aWB = Application.ActiveWorkbook 
    With aWB 
     .Sheets.Add after:=.Sheets(.Sheets.Count) 
     Set ws = .Sheets(.Sheets.Count) 
     '.name = "Report" 'you can name the new ws but do NOT duplicate 
    End With 
    Set iWB = Application.Workbooks.Open(FilePath) 
    With iWB.Sheets("Report").Cells(1, 1).CurrentRegion 
     .Cells = .Cells.Value 
     For v = LBound(vCOLs) To UBound(vCOLs) 
      .Columns(vCOLs(v)).Copy Destination:=ws.Cells(1, v + 1) 
     Next v 
    End With 
    iWB.Close False 

    Set iWB = Nothing 
    Set ws = Nothing 
    Set aWB = Nothing 

    Application.DisplayAlerts = True 
    Application.ScreenUpdating = True 
End Sub 

Моя главная задача здесь не зная расположение «Report» листа. Границы .CurrentRegion продиктованы первым полностью пустым столбцом справа и первой полной пустой строкой вниз. Блок данных редко имеет это, но рабочие листы, называемые . Отчет часто делает.

+0

Нужно ли добавлять .Cells = .Cells.Value? Я попробовал код и получил ошибку «Из памяти». –

+1

@De De De De - Если ячейки, которые вы копируете в оригинале, содержат формулы, которые ссылаются на ячейки, которые вы оставляете, будут другие проблемы. Возможно, достаточно преобразовать только скопированные ячейки. Переместите эту строку в цикле 'For ... Next' над линией копирования и измените ее на' .Columns (vCOLs (v)). Cells = .Columns (vCOLs (v)). Cells.Value'. – Jeeped

1

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

Dim v As Long, vNoCopy As Variant, wb As Workbook 
vNoCopy = Array(1, 3, 5, 7) 'should in ascending order (reversed below) 
With wb.Sheets("Report") 
    .Cells = .Cells.Value 'just in case there are referenced formulas involved 
    For v = UBound(vNoCopy) To LBound(vNoCopy) Step -1 
     .Columns(vNoCopy(v)).EntireColumn.Delete 
    Next v 
    wb.Sheets("Report").Copy After:=activeWB.Sheets(activeWB.Sheets.Count) 
End With 
wb.Close False 

Это должно удалить столбцы A, C, E & G из отчета перед копированием. Закрытие без сохранения должно оставить исходный Report.xlsx незатронутым.

+3

Следует действительно удалить справа налево ... –

+0

Это хороший ответ. Помимо удаления столбцов, которые мне не нужны, могу ли я пойти наоборот? Это просто выбрать нужные столбцы. Есть еще 80 столбцов, и мне нужно около шести из них. –

+0

@ Тим Уильямс - +1 Хороший улов и отличная точка. Я определенно пропустил мяч. Исправлено выше. – Jeeped