2012-09-03 70 views
0

我想将整个工作表从一个封闭的Excel文件复制到当前打开的Excel文件中,但是我不想使用范围,因为文件中的行数会有所不同。将整个工作表从一个Excel复制到另一个

我使用从范围内rereive数据的代码

Public Sub GetData(SourceFile As Variant, SourceSheet As String, _ 
    SourceRange As String, TargetRange As Range, Header As Boolean,   
UseHeaderRow As Boolean) 
' 30-Dec-2007, working in Excel 2000-2007 
Dim rsCon As Object 
Dim rsData As Object 
Dim szConnect As String 
Dim szSQL As String 
Dim lCount As Long 

' Create the connection string. 
If Header = False Then 
    If Val(Application.Version) < 12 Then 
     szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
        "Data Source=" & SourceFile & ";" & _ 
        "Extended Properties=""Excel 8.0;HDR=No"";" 
    Else 
     szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
        "Data Source=" & SourceFile & ";" & _ 
        "Extended Properties=""Excel 12.0;HDR=No"";" 
    End If 
Else 
    If Val(Application.Version) < 12 Then 
     szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
        "Data Source=" & SourceFile & ";" & _ 
        "Extended Properties=""Excel 8.0;HDR=Yes"";" 
    Else 
     szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
        "Data Source=" & SourceFile & ";" & _ 
        "Extended Properties=""Excel 12.0;HDR=Yes"";" 
    End If 
End If 

If SourceSheet = "" Then 
    ' workbook level name 
    szSQL = "SELECT * FROM " & SourceRange$ & ";" 
Else 
    ' worksheet level name or range 
    szSQL = "SELECT * FROM [" & SourceSheet$ & "$" & SourceRange$ & "];" 
End If 

On Error GoTo SomethingWrong 

Set rsCon = CreateObject("ADODB.Connection") 
Set rsData = CreateObject("ADODB.Recordset") 

rsCon.Open szConnect 
rsData.Open szSQL, rsCon, 0, 1, 1 

' Check to make sure we received data and copy the data 
If Not rsData.EOF Then 

    If Header = False Then 
     TargetRange.Cells(1, 1).CopyFromRecordset rsData 
    Else 
     'Add the header cell in each column if the last argument is True 
     If UseHeaderRow Then 
      For lCount = 0 To rsData.Fields.Count - 1 
       TargetRange.Cells(1, 1 + lCount).Value = _ 
       rsData.Fields(lCount).Name 
      Next lCount 
      TargetRange.Cells(2, 1).CopyFromRecordset rsData 
     Else 
      TargetRange.Cells(1, 1).CopyFromRecordset rsData 
     End If 
    End If 

Else 
    MsgBox "No records returned from : " & SourceFile, vbCritical 
End If 

' Clean up our Recordset object. 
rsData.Close 
Set rsData = Nothing 
rsCon.Close 
Set rsCon = Nothing 
Exit Sub 

SomethingWrong: 
MsgBox "The file name, Sheet name or Range is invalid of : " & SourceFile, _ 
     vbExclamation, "Error" 
On Error GoTo 0 

End Sub 

与导入的整个工作表及其所有行的任何帮助/列将是巨大的。

谢谢。

回答

0

为什么不只是这样做呢?

Dim wbkSource As Workbook 
Set wbkSource = Workbooks.Open("C:\BookFromWhichToCopy.xlsx") 
wbkSource.Sheets("MySheet").Copy Before:=ThisWorkbook.Sheets(2) 
wbkSource.Close 

注意,您可以通过他们的名字.Sheets("MySheet")或者它们的数量在工作簿.Sheets(2),看哪个适合你打电话张。

+0

这不起作用,说工作表太大,我应该复制并粘贴它。我已经设法得到这个工作,但是无论何时我加载文件,它打开我从复制的文件,这是烦人的。它可能发生,因为该文件不存储在本地。 – EmberZ

+0

我不是很遵循...它工作与否?你为了使它工作而添加了什么?是的,这会打开工作簿。但是*任何*您读取文件都会以某种方式打开工作簿文件。 –

相关问题