2016-03-15 21 views
5

Znajomi, Próbuję otworzyć codziennie plik CSV (generowany codziennie z innego programu) i skopiować dane z arkusza CSV do określonego arkusza w bieżącym skoroszycie. Pracowałem nad tym kodem przez jakiś czas i myślę, że jest to naprawdę bliskie bycia prawidłowym, ale ciągle otrzymuję błąd 438 na mojej linii kopiowania/wklejania. Jakaś pomoc?Otwórz plik CSV i skopiuj

Dziękujemy!

Oto mój kod:

Sub GetCSV() 

Dim thatWB As Workbook, thisWB As Workbook 
Dim thisWS As Worksheet, thatWS As Worksheet 
Dim zOpenFileName As String 
Dim inputData As String 

'get name of sheet to open 
inputData = InputBox("Enter name of file") 

'open CSV file 
zOpenFileName = Application.GetOpenFilename 

'error handling 
If zOpenFileName = "" Then Exit Sub 

Application.ScreenUpdating = False 

Set thisWB = ThisWorkbook 'destination workbook 
Set thisWS = Sheets("f_dump") 'destination worksheet 

Set thatWB = Workbooks.Open(zOpenFileName) 'source CSV 
Set thatWS = thatWB.Sheets(inputData) 'source worksheet 

Application.CutCopyMode = False 

thatWB.thatWS.Range("A1:G150").Copy Destination:=thisWB.thisWS.Range("A1") 

thatWB.Close 

End Sub 

Odpowiedz

4

Spróbuj spojrzeć na to. Usunąłem ten WB i ThatWB z kopii i wkleiłem część kodu, ponieważ było to źródło pierwszego wydania (i przeniosłem specyfikację skoroszytu do deklaracji arkusza).

Następnym problemem było wklejanie. Nie jestem pewien dlaczego, ale podczas wywoływania na zasięgu, trzeba użyć PasteSpecial (VBA w Excelu jest nieco magiczne zamiast programowania/skryptów)

Sub GetCSV() 

Dim thatWB As Workbook, thisWB As Workbook 
Dim thisWS As Worksheet, thatWS As Worksheet 
Dim zOpenFileName As String 
Dim inputData As String 

'get name of sheet to open 
inputData = InputBox("Enter name of file") 

'open CSV file 
zOpenFileName = Application.GetOpenFilename 

'error handling 
If zOpenFileName = "" Then Exit Sub 

Application.ScreenUpdating = False 

Set thisWB = ThisWorkbook 'destination workbook 
Set thisWS = ThisWorkbook.Sheets("Sheet1") 'destination worksheet 

Set thatWB = Workbooks.Open(zOpenFileName) 'source CSV 
Set thatWS = thatWB.Sheets(inputData) 'source worksheet 

Application.CutCopyMode = False 

thatWS.Range("A1:G150").Copy 
thisWS.Range("A1:G150").PasteSpecial xlPasteAll 
thatWB.Close 

End Sub 
+2

natomiast parentaging wspomnieć tutaj jest poprawna, bezpośrednia kopia będzie również działa dobrze, spróbuj tego wiersza: 'thatWS.Range (" A1: G150 ") Miejsce docelowe kopiowania: = thisWS.Range (" A1 ")' Aby było jasne, metoda 'PasteSpecial' również zadziała. To nie jest konieczne. –

+0

Dziękuję wam obojgu. Oba rozwiązania działają poprawnie. Oznakowałem Lubosa jako poprawne, ale Scott działa równie dobrze. – tulanejosh