2014-01-15 5 views
4

Я действительно новичок в VBA, но мне удалось написать код, основанный на примерах в основном с этого сайта.
Кусок кода предназначен для копирования данных из нескольких CSV-файлов в один файл xls (а затем для переименования исходных файлов csv).
Хотя он отлично работает в Excel 2003, он не работает так хорошо в Excel 2010/2013 (я не смог проверить его на E2007).
Оказывается, чтобы остановить после копирования данных из первого файла CSV в XLS файл, так что после этой строки:Код VBA из Excel 2003 не работает должным образом в Excel 2010/2013

Range("B4:AZ" & LR).Copy wbDEST.Sheets("Data").Range("B" & NR) 

с ошибкой 1004 «приложение или Объектно определенные ошибки». Отладчик выделяет следующую строку, т.е.

NR = wbDEST.Sheets("Data").Range("B" & Rows.Count).End(xlUp).Row + 1 

Я просто не могу видеть, что случилось с ним, как та же линия используется в начале кода и не останавливаться на достигнутом.

Буду признателен за ваш совет.

А вот весь код:

Option Explicit 

Sub ImportData() 
Dim fPATH As String, fNAMEcsv As String, fNAMEbak As String 
Dim LR As Long, NR As Long 
Dim wbSOURCE As Workbook, wbDEST As Workbook 

Set wbDEST = Workbooks.Open("C:\Utility\Data.xls") 
NR = wbDEST.Sheets("Data").Range("B" & Rows.Count).End(xlUp).Row + 1 

fPATH = "C:\Utility\DataFiles\"  'remember the final \ in this string 

fNAMEcsv = Dir(fPATH & "*.csv")  'get the first filename in fpath 

Do While Len(fNAMEcsv) > 0 
    Set wbSOURCE = Workbooks.Open(fPATH & fNAMEcsv, Local:=True) 'open the file 
    LR = Range("B" & Rows.Count).End(xlUp).Row 'how many rows of info? 

    If LR > 1 Then 
     Range("B4:AZ" & LR).Copy wbDEST.Sheets("Data").Range("B" & NR) 
     NR = wbDEST.Sheets("Data").Range("B" & Rows.Count).End(xlUp).Row + 1 
    End If 

    wbSOURCE.Close False 'close data workbook 
    fNAMEbak = fNAMEcsv & ".bak" 'rename imported file to .bak 
    Name (fPATH & fNAMEcsv) As (fPATH & fNAMEbak) 
    fNAMEcsv = Dir   'get the next filename 

Loop 

MsgBox ("Completed. Check results on PRINTOUT sheet.") 

End Sub 

ответ

2

Попробуйте квалифицируя ваш Rows:

NR = wbDEST.Sheets("Data").Range("B" & wbDEST.Sheets("Data").Rows.Count).End(xlUp).Row + 1 
+2

Nothin 'но дело с вами, а? +1 –

+0

+1 Я думаю, что вы были слишком многословными. – brettdj

1

Проблема может быть в следующем:

Здесь вы открываете новый "источник" учебное пособие wbSOURCE :

Set wbSOURCE = Workbooks.Open(fPATH & fNAMEcsv, Local:=True) 'open the file 

Возможно, это книга в «новом» формате (Excel 2007 и выше, * .xlsx & Co.). Так как вы только что открыли, он является активным учебным пособием, и, следовательно, неквалифицированный Rows.Count вернется 1048576.

А может быть, ваша цель книга wbDEST находится в «старом» формат Excel 2003 (* .xls & Co.). Так что, когда вы говорите, это:

NR = wbDEST.Sheets("Data").Range("B" & Rows.Count).End(xlUp).Row + 1 

вы пытаетесь получить доступ к wbDEST.Sheets("Data").Range("B" & 1048576) но клетка B1048576 не существует в этом 2003-формат книги. Это действительно вызовет ошибку 1004 «Определенная пользователем или объектная ошибка».

Раствор затем будет полностью квалифицировать Rows.Count как это:

NR = wbDEST.Sheets("Data").Range("B" & wbDEST.Sheets("Data").Rows.Count).End(xlUp).Row + 1 

Это всегда хорошая идея, чтобы полностью определить все и не позволять ему зависеть от капризов Excel.

+0

Ты такой многословный :). Просто шучу +1 –

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