VBA错误1004 - 范围类的select方法失败

时间:2012-06-08 13:34:07

标签: vb.net excel-vba excel-2010 powerpoint-vba vba

第一次发布海报,如果有任何格式或指导我没有遵守,请告诉我,以便我可以解决。

所以我基本上要求用户提供excel文件的文件目录,然后设置一些变量(最初设置为public作为项目变量,因为这些变量在其他地方被使用和更改)。我还添加了行来将这些变量设置为空(以防万一,我不认为它应该重要)。然后我将这些变量设置为我想要访问的excel文件,工作簿和工作表。

Dim filepath as String
filePath = CStr(fileDialog)              'ask file dir, set to string
Dim sourceXL As Variant                  'these three were orig project variables
Dim sourceBook As Variant
Dim sourceSheet As Variant
Dim sourceSheetSum As Variant

Set sourceXL = Nothing                    'set to nothing in case...?
Set sourceBook = Nothing
Set sourceSheet = Nothing
Set sourceSheetSum = Nothing

Set sourceXL = Excel.Application          'set to the paths needed
Set sourceBook = sourceXL.Workbooks.Open(filePath)
Set sourceSheet = sourceBook.Sheets("Measurements")
Set sourceSheetSum = sourceBook.Sheets("Analysis Summary")

Dim measName As Variant                    'create variable to access later
Dim partName As Variant

sourceSheetSum.Range("C3").Select           'THIS IS THE PROBLEM LINE

measName = sourceSheetSum.Range(Selection, Selection.End(xlDown)).Value
sourceSheetSum.Range("D3").Select
partName = sourceSheetSum.Range(Selection, Selection.End(xlDown)).Value

所以我创建了两个不同的工作表变量'sourceSheets'和'sourceSheetsSum',如果我使用'sourceSheets',代码可以工作,但如果我使用'sourceSheetsSum',则会出现错误1004。我还尝试完全删除变量'sourceSheet'的代码,以防由于某种原因覆盖'sourceSheetSum'。

我相当确信excel工作簿和工作表存在且被正确调用,因为我运行了一些代码来循环遍历工作簿中的所有工作表并输出名称,如下所示。

For j = 1 To sourceBook.Sheets.Count
Debug.Print (Sheets(j).name)
Next j

使用

的调试输出
  

测量
  分析总结
  分析设置

那么,有没有人知道这个错误可能意味着什么,或者我怎么可能去寻找更多关于错误实际上是什么?

编辑: 所以我决定在工作表名称列表中添加一些内容,不确定它是否会有所帮助。

For j = 1 To sourceBook.Sheets.Count
    listSheet(j) = Sheets(j).name
Next j    
Debug.Print (listSheet(2))    
Set sourceSheetSum = sourceBook.Sheets(listSheet(2))

调试打印分析摘要,因此我知道工作簿中存在工作表,并且名称中的“拼写错误”不应该存在任何问题。
但是代码在同一行仍然有相同的错误。

deusxmach1na:我想你要我改变

Dim sourceXL As Variant                  
Dim sourceBook As Variant
Dim sourceSheet As Variant
Dim sourceSheetSum As Variant

Set sourceSheet = sourceBook.Sheets("Measurements")

Dim sourceXL As Excel.Application
Dim sourceBook As Excel.Workbook
Dim sourceSheet As Worksheet
Dim sourceSheetSum As Worksheet

Set sourceSheet = sourceBook.Worksheets("Measurements")

但是这并没有改变错误,我记得我有类似的错误,然后改变它,因为我读到这个变体就像一个捕获所有,实际上并不是什么样的变体。

4 个答案:

答案 0 :(得分:25)

您必须先选择工作表,然后才能选择范围。

我简化了示例以隔离问题。试试这个:

Option Explicit


Sub RangeError()

    Dim sourceBook As Workbook
    Dim sourceSheet As Worksheet
    Dim sourceSheetSum As Worksheet

    Set sourceBook = ActiveWorkbook
    Set sourceSheet = sourceBook.Sheets("Sheet1")
    Set sourceSheetSum = sourceBook.Sheets("Sheet2")

    sourceSheetSum.Select

    sourceSheetSum.Range("C3").Select           'THIS IS THE PROBLEM LINE

End Sub

将Sheet1和Sheet2替换为工作表名称。

重要提示:使用变体是危险的,可能导致难以杀死的错误。只有在您有非常具体的理由时才使用它们。

答案 1 :(得分:8)

如果没有首先选择它所在的工作表,则无法选择范围。请先尝试选择工作表,看看是否仍然出现问题:

sourceSheetSum.Select
sourceSheetSum.Range("C3").Select

答案 2 :(得分:3)

assylias和Catering负责人已经说明了错误发生的原因。

现在关于你在做什么,根据我的理解,你根本不需要使用Select

我猜你是从VBA PowerPoint做的吗?如果是,那么您的代码将被重写为

Dim sourceXL As Object, sourceBook As Object
Dim sourceSheet As Object, sourceSheetSum As Object
Dim lRow As Long
Dim measName As Variant, partName As Variant
Dim filepath As String

filepath = CStr(FileDialog)

'~~> Establish an EXCEL application object
On Error Resume Next
Set sourceXL = GetObject(, "Excel.Application")

'~~> If not found then create new instance
If Err.Number <> 0 Then
    Set sourceXL = CreateObject("Excel.Application")
End If
Err.Clear
On Error GoTo 0

Set sourceBook = sourceXL.Workbooks.Open(filepath)
Set sourceSheet = sourceBook.Sheets("Measurements")
Set sourceSheetSum = sourceBook.Sheets("Analysis Summary")

lRow = sourceSheetSum.Range("C" & sourceSheetSum.Rows.Count).End(xlUp).Row
measName = sourceSheetSum.Range("C3:C" & lRow)

lRow = sourceSheetSum.Range("D" & sourceSheetSum.Rows.Count).End(xlUp).Row
partName = sourceSheetSum.Range("D3:D" & lRow)

答案 3 :(得分:-1)

在复制之前删除范围选择。感谢您的帖子。