2015-12-17 2 views
1

Я пытаюсь отправить данные с одного листа на другой рабочий лист в неактивной книге. Кодирование данных правильно и закрытие моих книг, как я хочу, но не вставляет данные. Я собираюсь отправлять данные каждый месяц, и я хочу, чтобы новые данные добавлялись после старого.Проблемы при попытке отправить данные с одного листа на другой

Может ли кто-нибудь помочь мне найти ошибку?

Sub Send() 


Workbooks.Open Filename:="FILENAME" 

Workbooks("NAME").Activate 
Worksheets("Sheet1").Activate 

Range("A3:D19").Copy 


ActiveWorkbook.Close True 

Workbooks("NAME").Activate 



erow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row 
ActiveSheet.Paste Destination:=Worksheets("Sheet1").Range(Cells(erow, 1), Cells(erow, 4)) 
ActiveWorkbook.Save 
ActiveWorkbook.Close True 

End Sub 

ответ

0

Вам не нужно активировать книги или рабочие листы для копирования/вставки данных. На самом деле, это хорошая практика, чтобы не делать этого, поскольку это занимает много времени, и экран мерцает, когда макрос прыгает между рабочими листами.

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

Sub Send() 
    'Prefixes means: 
    ' wkb - workbook 
    ' wks - worksheet 
    ' rng - range 
    Dim wkbSource As Excel.Workbook 
    Dim wkbDestination As Excel.Workbook 
    Dim wksSource As Excel.Worksheet 
    Dim wksDestination As Excel.Worksheet 
    Dim rngSource As Excel.Range 
    Dim rngDestination As Excel.Range 
    Dim lastRow As Long 
    Dim sourceFilePath As String 
    Dim destinationFilePath As String 
    '---------------------------------------- 


    'Defining paths to files. 
    sourceFilePath = "..." 
    destinationFilePath = "..." 

    'Set references to source workbook, worksheet, range. 
    Set wkbSource = Workbooks.Open(Filename:=sourceFilePath) 
    Set wksSource = wkbSource.Worksheets("Sheet1") 
    Set rngSource = wksSource.Range("A3:D19") 

    'Set references to destination workbook, worksheet, range. 
    Set wkbDestination = Workbooks.Open(Filename:=destinationFilePath) 
    Set wksDestination = wkbDestination.Worksheets("Sheet1") 
    With wksDestination 
     lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 
     Set rngDestination = .Range(.Cells(lastRow, 1), .Cells(lastRow, 4)) 
    End With 


    Call rngSource.Copy(Destination:=rngDestination) 


    'Close files and clear variables. 
    Call wkbSource.Close(False) 
    Call wkbDestination.Close(True) 

End Sub 
+0

Если я нахожусь в рабочей книге, являющейся источником данных, мне все еще нужно установить всю ссылку для этого? – anp

+0

Да, это хорошая практика, чтобы объявлять ссылки на нее и использовать ссылки вместо того, чтобы полагаться на активную книгу/лист. – mielk

+0

Я здесь не работаю. Я понял, как я его копирую, но есть проблема при попытке вставить его. – anp

0

это работает:

Sub Send() 
Dim wb As Workbook 
Set wb = Workbooks.Open("C:\...\Name.xlsx") 
wb.Worksheets(1).Range("A3:D19").Copy 
ThisWorkbook.Worksheets(1).Range("A1").PasteSpecial xlPasteValues 
wb.Close 
End Sub 

Действовать таким образом wb должен быть открыт, пока copy paste делается. Если вы хотите закрыть его, прежде чем вам нужно будет сохранить все данные в object. Исправьте меня, если я ошибаюсь.

Смежные вопросы