【问题标题】:Can't work with ranges if workbook and sheet are not active [duplicate]如果工作簿和工作表未处于活动状态,则无法使用范围 [重复]
【发布时间】:2015-05-05 20:01:45
【问题描述】:

当我尝试将值从一个工作簿导入到另一个工作簿时,出现应用程序或对象定义错误。我已经能够通过显式激活工作簿并在引用每个工作簿的范围之前选择工作表来解决它,但如果可能的话,我想避免这种情况。此时代码中的两个工作簿都是打开的。有什么想法吗?

这会给我带来错误:

Dim wbImport As Workbook
Dim wbReceive As Workbook
Const sExcept = "Sheet2 Name"  
Const sSht = "Sheet1 Name"
Dim rExceptions As Range

wbReceive.Sheets(sExcept).Rows(1).Insert shift:=xlDown
Set rExceptions = wbImport.Sheets(sSht).Range(Cells(rCell.Row, iHeadCol), Cells(rCell.Row, iLastCol))
wbReceive.Sheets(sExcept).Range(Cells(1, iHeadCol), Cells(1, iLastCol)).Value = rExceptions.Value 'error occurs here

这运行良好,但我想避免使用 .Select.Activate

wbReceive.Sheets(sExcept).Rows(1).Insert shift:=xlDown
wbImport.Activate
wbImport.Sheets(sSht).Select
Set rExceptions = wbImport.Sheets(sSht).Range(Cells(rCell.Row, iHeadCol), Cells(rCell.Row, iLastCol))
wbReceive.Activate
wbReceive.Sheets(sExcept).Select
wbReceive.Sheets(sExcept).Range(Cells(1, iHeadCol), Cells(1, iLastCol)).Value = rExceptions.Value

当我调试时,看起来wbReceive.Sheets(sExcept) 行中引用的单元格实际上引用了wbReceive 工作簿中的不同工作表。不知道为什么会这样,因为 wb 和 sheet 已被明确引用?

【问题讨论】:

  • @DavidZemens OP 清楚地明白了这一点——他只是对在这个例子中他做错了什么感到困惑。
  • 我确实审查了这个问题,但仍然没有看到问题所在。感谢@TimWilliams 的完美解释和修复。

标签: vba excel


【解决方案1】:
Set rExceptions = wbImport.Sheets(sSht).Range(Cells(rCell.Row, iHeadCol), _
                                              Cells(rCell.Row, iLastCol))

您已经符合Range,但不是Cells:如果没有符合特定工作表的条件,则其中任何一个都将引用ActiveSheet。有点违反直觉,(合格的)包装Range 不会“层叠”下来......

试试这个:

With wbImport.Sheets(sSht)
    Set rExceptions =  .Range(.Cells(rCell.Row, iHeadCol), _
                              .Cells(rCell.Row, iLastCol))
End with

【讨论】:

    【解决方案2】:

    范围内的单元格引用可能是挂断。使用带有两个单元格的 Range() 时,我遇到了奇怪的错误。只需:

    Range(Cells(1, iHeadCol), Cells(1, iLastCol))
    

    它可能正在查看 ActiveSheet.Cells,如果您尝试组合不同工作表中的单元格(或在范围上明确引用),则会出现错误。尝试使用以下命令显式引用单元格:

    Range(wbReceive.Sheets(sExcept)Cells(1, iHeadCol), wbReceive.Sheets(sExcept)Cells(1, iLastCol))
    

    它看起来很丑,但你可以用一些工作表对象来清理它。

    【讨论】:

    • 它可能正在查看 ActiveSheet.CellsIS正在查看ActiveSheet.Cells。仅仅因为它在括号内并不能免除它的资格:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多