【问题标题】:Copying Entire Worksheet from one Excel to another将整个工作表从一个 Excel 复制到另一个
【发布时间】:2012-08-28 01:54:00
【问题描述】:

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

我用来从范围内重新获取数据的代码是

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

任何有关导入整个工作表及其所有行/列的帮助都会很棒。

谢谢。

【问题讨论】:

    标签: excel vba adodb


    【解决方案1】:

    为什么不这样做呢?

    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) 调用工作表,以最适合您的方式调用。

    【讨论】:

    • 这不起作用,说工作表太大,我应该复制并粘贴它。我现在已经设法让它工作了,但是每当我加载文件时,它都会打开我正在复制的文件,这很烦人。这可能是因为文件没有存储在本地。
    • 我不太了解...它是否有效?你添加了什么使它工作?是的,这将打开工作簿。但是任何您为读取文件所做的一切都会以一种或另一种方式打开工作簿文件。
    猜你喜欢
    • 2014-07-27
    • 2018-07-22
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    相关资源
    最近更新 更多