好的,所以我对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'失败的“方法'范围”错误。选择行。
答案 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