2017-04-13 97 views
1

我已經通過類似的問題,並沒有發現這個具體的錯誤。粘貼特殊方法奇數錯誤

我試圖製作一個宏,它會經歷大量的CSV文件,提取我需要的必要信息,將這些數據複製並粘貼到新的工作簿中,然後關閉CSV文件並轉到下一個。

當我測試我的代碼並讓它一步一步運行(使用F8)時,它運行正常,沒有錯誤。但是,每當我嘗試並只運行代碼(如按F5)時,出現錯誤「類特徵的PasteSpecial方法」失敗。當我按調試這行代碼被高亮顯示: copyRange.Offset(0,1).PasteSpecial粘貼:= xlPasteValues

我加了0.5s的一個小的時間延遲這一行之前,它實際上能去進一步通過失敗前的文件。

它是否與Range.Offset方法?我應該明確定義一個不同的複製範圍嗎?下面

代碼我有如下:

Public Sub OpenTXT_CopyNewWBK(inPath As String) 
    Application.ScreenUpdating = False 
    Dim fso, oFolder, oSubfolder, oFile, queue As Collection 
    Dim app As New Excel.Application 
    app.Visible = True 
    Dim dataRange As Range, dateRange As Range, copyRange As Range 
    Dim lastCell, lastRow As String 
    Dim newBook, wbk As Excel.Workbook 
    Dim csvStart As Long 
    Set newBook = Workbooks.Add 
    With newBook 
     .SaveAs Filename:="BETA RAY " & Format(Now, "ddmmyyhhmmss") 
    End With 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set queue = New Collection 
    queue.Add fso.GetFolder(inPath) 'obviously replace 
    Set objExcel = CreateObject("Excel.Application") 
    objExcel.Visible = True 
    Do While queue.Count > 0 
     Set oFolder = queue(1) 
     queue.Remove 1 'dequeue 
     For Each oSubfolder In oFolder.SubFolders 
      queue.Add oSubfolder 'enqueue 
     Next oSubfolder 
     For Each oFile In oFolder.Files 
      Set wbk = app.Workbooks.Add(oFile.Path) 
      lastCell = wbk.Sheets(1).Range("A1").End(xlDown).Address 
      If Len(lastCell) = 6 Then 
       lastRow = Mid(lastCell, 4, 3) 
      ElseIf Len(lastCell) = 5 Then 
       lastRow = Mid(lastCell, 4, 2) 
      ElseIf Len(lastCell) = 4 Then 
       lastRow = Mid(lastCell, 4, 1) 
      End If 
      Set dateRange = wbk.Sheets(1).Range("A2", lastCell) 
       dateRange.Select 
      Set dataRange = wbk.Sheets(1).Range("AA2", "AM" & lastRow) 
       dataRange.Select 
      wbk.Application.CutCopyMode = True 
      Set copyRange = Workbooks(newBook.name).Sheets(1).Range("A1048576").End(xlUp) 
      If Not copyRange = "" Then 
       Set copyRange = copyRange.Offset(1, 0) 
      End If 
      dateRange.Copy 
      copyRange.PasteSpecial Paste:=xlPasteValues 
      wbk.Application.CutCopyMode = False 
      wbk.Application.CutCopyMode = True 
      Application.Wait (Now + 500 * 0.00000001) 
      dataRange.Copy 
      copyRange.Offset(0, 1).PasteSpecial Paste:=xlPasteValues 
      wbk.Application.CutCopyMode = False 
      wbk.Close SaveChanges:=False 
     Next oFile 
    Loop 
    app.Quit 
    Set app = Nothing 
    Range("B:B").Delete 
    Range("G:G").Delete 
    Range("L:L").Delete 
    Application.ScreenUpdating = True 
End Sub 

我肯定有更好的方式做了很多對我有去的東西。我真的只是使用VBA使我的工作更輕鬆,所以我使用的很多代碼都是複製,粘貼和修改以適應我的需求。我無法弄清楚如何使這種方法的工作wbk2.sht2.Range("A1:A5") = wbk1.sht1.Range("B1:B5")我讀過的一切說這應該是一個更好的方法。此外,讀取dataRange.SelectdateRange.Select的代碼部分僅用於調試目的。

+0

你在哪裏運行該代碼?字?訪問? VBScript的? VB.Net?事實上,你不得不創建兩個新的Excel應用程序對象('app'和'objExcel'),這讓我認爲它不是Excel。糟糕,不,也許是Excel--你使用的是「Workbooks」對象,而沒有提及「app」或「objExcel」。所以'daterange'和'datarange'位於Excel的'app'實例中,'copyRange'位於本地實例中。這很混亂。爲什麼你需要這麼多的實例? – YowE3K

+0

當我嘗試打開Excel工作簿的新方法時,可能會有一個額外的我忘記刪除。我試圖在excel的一個實例中讀取CSV文件中的數據,即在後臺即不可見 – awsmagala

+0

Excel的多個實例可能(可能是)導致無法將值從一個位置分配給其他,並可能複製/粘貼您的問題。 – YowE3K

回答

0

試試這個....

wbk2.sht2.Range("A1:A5").value = wbk1.sht1.Range("B1:B5").value 
+0

我說我試圖讓這種方法工作,但遇到的問題與我試圖拉我的數據範圍不是所有相同的大小和變化相當顯着的事實。 – awsmagala

+0

基本上,您需要將要複製的範圍與您正在複製的範圍大小相同。 'Dim copyWbk As Workbook Set copyWbk = Workbooks(newBook.Name).Sheets(1) copyWbk.Range(copyRange,copyRange.Offset(dataRange.Rows.Count - 1) ,dataRange.Columns.Count - 1))。Values = dataRange.value' – moconnorism

+0

我剛剛發現了一些錯誤。我的意思是把這個... '昏暗copySht作爲工作表 設置copySht =工作簿(newBook.Name).Sheets(1) copySht.Range(copyRange是,copyRange.Offset(dataRange.Rows.Count - 1 ,dataRange.Columns.Count - 1))。Values = dataRange.value' – moconnorism