2015-04-14 3 views
0

Я пишу макрос, чтобы сделать следующее:Макрос для извлечения данных из закрытой книги в другую книгу

Каждый раз, когда я открываю книгу, извлекать данные из закрытой книги на моем компьютере и скопировать эти данные на лист под названием «Доступность», начиная с ячейки A1.

В настоящее время все, что происходит, «TRUE» помещается в ячейку A1 на листе доступности.

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

Sub OpenWorkbookToPullData() 

    Dim sht As Worksheet 
    Dim lastRow As Long 
    lastRow = ActiveSheet.UsedRange.Rows.Count 
    Set sht = ThisWorkbook.Worksheets(Sheet1.Name) 
    Dim path As String 
    path = "C:\users\" & Environ$("username") & _ 
    "\desktop\RC Switch Project\Daily Automation _ 
    Availability Report.xlsx" 

    Dim currentWb As Workbook 
    Set currentWb = ThisWorkbook 

    Dim openWb As Workbook 
    Set openWb = Workbooks.Open(path) 

    Dim openWs As Worksheet 
    Set openWs = openWb.Sheets("Automation Data") 

    currentWb.Sheets("Availability").Range("A1") _ 
    = openWs.Range("A5:K" & LastRow).Select 
    openWb.Close (False) 

End Sub 
+1

Что произойдет, если вы удалите .Select – Greg

ответ

1

Как указано в @Greg, .Select не требуется. Как только это будет удалено, у вас будет новая проблема, когда два диапазона не имеют одинакового размера. Range("A1") - это только 1 ячейка, в то время как другой диапазон будет не менее 11. Ваш текущий VBA будет только перезаписывать значения в указанном диапазоне, который равен A1.

Чтобы обойти это, есть два подхода, которые хорошо работают.

Изменить размер

Resize левая рука, так что он имеет такой же размер, как с правой стороны.

Sub OpenWorkbookToPullData() 

    Dim sht As Worksheet 
    Dim lastRow As Long 
    lastRow = ActiveSheet.UsedRange.Rows.Count 
    Set sht = ThisWorkbook.Worksheets(Sheet1.Name) 
    Dim path As String 
    path = "C:\users\" & Environ$("username") & _ 
    "\desktop\RC Switch Project\Daily Automation Availability Report.xlsx" 

    Dim currentWb As Workbook 
    Set currentWb = ThisWorkbook 

    Dim openWb As Workbook 
    Set openWb = Workbooks.Open(path) 

    Dim openWs As Worksheet 
    Set openWs = openWb.Sheets("Automation Data") 

    Dim rng_data As Range 
    Set rng_data = openWs.Range("A5:K" & lastRow) 

    currentWb.Sheets("Availability").Range("A1").Resize(_ 
     rng_data.Rows.Count, rng_data.Columns.Count).Value = rng_data.Value 

    openWb.Close (False) 

End Sub 

Copy/PasteSpecial

Copy На самом деле, а затем PasteSpecial.

Sub OpenWorkbookToPullData() 

    Dim sht As Worksheet 
    Dim lastRow As Long 
    lastRow = ActiveSheet.UsedRange.Rows.Count 
    Set sht = ThisWorkbook.Worksheets(Sheet1.Name) 
    Dim path As String 
    path = "C:\users\" & Environ$("username") & _ 
    "\desktop\RC Switch Project\Daily Automation Availability Report.xlsx" 

    Dim currentWb As Workbook 
    Set currentWb = ThisWorkbook 

    Dim openWb As Workbook 
    Set openWb = Workbooks.Open(path) 

    Dim openWs As Worksheet 
    Set openWs = openWb.Sheets("Automation Data") 

    Dim rng_data As Range 
    Set rng_data = openWs.Range("A5:K" & lastRow) 

    rng_data.Copy 
    currentWb.Sheets("Availability").Range("A1").PasteSpecial xlPasteValues 

    openWb.Close (False) 

End Sub 

Так это выглядит, как вы собираетесь для значений в любом случае, я хотел бы использовать Copy/PasteSpecial маршрут для ясности в коде.

+0

Это сработало отлично. Спасибо, Байрон. – Hawth33