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

Posted

技术标签:

【中文标题】VBA 错误 1004 - 范围类的选择方法失败【英文标题】:VBA error 1004 - select method of range class failed 【发布时间】:2012-06-12 13:47:42 【问题描述】:

第一次发帖,所以如果有任何格式或我未能遵守的准则,请告诉我,以便我修复它。

所以我基本上是在向用户询问 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")

但这并没有改变错误,我记得我有类似的错误,然后改变了它,因为我读到这个变体就像一个包罗万象,实际上并没有那么确定变体是什么。

【问题讨论】:

我可能会专门将您的工作表调暗为工作表,看看会发生什么。 Dim sourceSheetSum as Worksheet 实际上,您可能希望更具体地暗淡一切。 【参考方案1】:

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

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

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 替换为您的工作表名称。

重要提示:使用变体是危险的,可能会导致难以消除的错误。仅当您有非常具体的原因时才使用它们。

【讨论】:

我不敢相信你在一个 2 小时前的问题上以 13 秒的优势击败了我! +1 速度 ;-) 不错! *** Excel 帮助台开始营业! @HeadofCatering 好电话!我几乎从不使用 Selects 并且忘记了您必须先选择工作表。叹了口气,很好的宏记录代码。 我不得不说 Excel VBA 错误信息真的很糟糕。为什么excel不能说“错误选择非当前工作表上的单元格”或类似的?叹息。 如果错误信息有那么大的帮助,堆栈溢出就不会存在了。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

assylias 和餐饮主管已经向您说明了错误发生的原因。

现在关于你在做什么,据我了解,你根本不需要使用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)

【讨论】:

嗨我有一个相关的问题(很抱歉劫持)。我正在重构一些代码并将其从工作表移动到模块。它使用 Worksheets(name).Range 访问工作表。在我将其移至模块之前,它在没有 Select 的情况下运行良好。现在我需要在它之前添加一个Worksheet.Select 行以使其工作,否则它会给我一个'1004'。在少数情况下,即使这样也行不通。知道为什么移动代码会产生问题,以及如何在不添加一百万次代码的情况下解决它。对不起,我是 VBA 新手。 @DPD : 是的...查看此链接 ;) ***.com/questions/10714251/…【参考方案4】:

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

【讨论】:

以上是关于VBA 错误 1004 - 范围类的选择方法失败的主要内容,如果未能解决你的问题,请参考以下文章

vba 错误无法设置范围类的隐藏属性 错误 1004

运行时错误“1004”:工作表类的粘贴方法失败错误

无法调试“范围类的删除方法失败”

使用 VBA 密码保护进行保存时出现错误消息“运行时错误‘1004’:对象‘_Workbook’的方法‘SaveAs’失败”

粘贴特殊错误1004 Range类的PasteSpecial方法失败

“ Range类的VBA自动过滤器方法失败”,今天开始工作的代码出现错误