将单元格范围从一个工作簿复制到另一个工作簿会产生400错误

时间:2015-04-17 18:30:27

标签: excel vba excel-vba

好的,所以我对Excel VBA比较陌生。我正在尝试做一些对我来说似乎很简单的事情,并且有许多很多很多例子,我已经详尽地阅读了这些内容,但我似乎无法解决这个问题......这里就是这样。

我试图在Excel Microsoft Office Professional Plus 2010中将一系列单元格从一个工作表粘贴到另一个工作表。我想我已经将问题简化为绝对最简单的形式来说明问题。这只是一个片段。 VictimResults和TempWorksheet变量设置得更高。我没有包含代码,因为我认为它可能会混淆问题的清晰度。

Dim SourceWorksheet As Worksheet
Dim TargetWorksheet As Worksheet
Dim SourceRange As Range
Dim TargetRange As Range    

Set SourceWorksheet = VictimResults
Set TargetWorksheet = TempWorksheet
Set SourceRange = Cells(1, 1)
Set TargetRange = Cells(1, 1)    

TargetWorksheet.Range(TargetRange)= SourceWorksheet.Range(SourceRange) 我将变量SourceWorksheet,TargetWorksheet,SourceRange和TargetRange放在一个监视器中,并在最后一行设置一个断点,它们都是有效的对象(非空)。当我跨过断点时,我得到一个简单地说“400”的对话框。

非常感谢任何帮助。

--- ---编辑 我创建了这个完整的VBA文件来复制问题。想到可能会帮助别人回答。

Option Explicit

Sub Main()
    GetFirstWorksheetContainsName("Sheet1").Range(Cells(1, 1)).Value = GetFirstWorksheetContainsName("Sheet2").Range(Cells(1, 1)).Value
End Sub

Function GetFirstWorksheetContainsName(worksheetNameContains) As Worksheet
    Dim m As Long
    Dim result As Worksheet

    m = 1

    Do
        If InStr(1, Sheets(m).Name, worksheetNameContains) Then
            Set result = Sheets(m)
            Exit Do
        End If

        m = m + 1
    Loop Until m > ThisWorkbook.Worksheets.Count

    Set GetFirstWorksheetContainsName = result
End Function

这是我尝试的其他东西,它产生了一些更冗长的东西。

Option Explicit

Sub Main()
    Sheets("Sheet1").Select
    Range(Cells(1, 1)).Select
    Selection.Copy
    Sheets("Sheet2").Select
    Range(Cells(1, 1)).Select
    ActiveSheet.Paste
End Sub

执行第一个范围(单元格(1,1))时,它给出了对象'_Global'失败的“方法'范围”错误。选择行。

2 个答案:

答案 0 :(得分:0)

如果您要复制并粘贴原因,请不要使用.copy.pastespecial。它们可能会减慢你的代码速度,但只要你不复制和粘贴成千上万的东西就应该没问题。

答案 1 :(得分:0)

我不确定400来自哪里,但抛出的异常与你的详细示例相同(1004 - 对象'_Worksheet'的方法'范围'失败“,并且被抛出同样的原因。

问题在于你如何处理范围。 Cells(1, 1)隐式设置为活动工作表,而不是您将其作为参数传递给的任何范围。由于您只需要一个单元格,因此您只需使用.Cells属性:

Sub Main()

    GetFirstWorksheetContainsName("Sheet1").Cells(1, 1).Value = _
        GetFirstWorksheetContainsName("Sheet2").Cells(1, 1).Value

End Sub

如果您需要复制多个单元格,则必须获取对工作表的引用,而不是在使用动态范围时内联对GetFirstWorksheetContainsName的调用:

Sub Main()

    Dim source As Worksheet
    Dim data As Range

    Set source = GetFirstWorksheetContainsName("Sheet2")
    Set data = source.Range("A1:B2")

    GetFirstWorksheetContainsName("Sheet1").Range(data.Address).Value = data.Value

End Sub

或硬编码:

Sub Main()

    GetFirstWorksheetContainsName("Sheet1").Range("A1:B2").Value = _
        GetFirstWorksheetContainsName("Sheet2").Range("A1:B2").Value

End Sub