【问题标题】:VBA - Declaring and Setting Range with nested pre-declared variables (Runtime error '91':)VBA - 使用嵌套的预声明变量声明和设置范围(运行时错误'91':)
【发布时间】:2021-02-23 21:23:55
【问题描述】:

第一次在这里查询!

我想在 Excel 工作表上定义我的数据框。但是,当我尝试设置范围时,我得到一个运行时 91 错误。

Dim i As Long
Dim WSCount As Long
WSCount = Application.ActiveWorkbook.Worksheets.Count

For i = 1 To WSCount Step 1

Select Case Worksheets(i).Name

Case "Page1_1", "Page2_2", "Written", "Waived", "Earned"

Dim LR As Long
LR = Worksheets(i).Cells(Rows.Count, 1).End(xlUp).Row + 1
Dim LC As Long
LC = Worksheets(i).Cells(1, Columns.Count).End(xlToLeft).Column
Dim DataFrame As Range
**DataFrame = Worksheets(i).Range("A2").Resize(LR, LC)**

DataFrame.ClearContents


End Select

Next i

LR 和 LC 都生成正确答案。

但是,当我尝试将 Dataframe 声明为 Range,然后按以下方式设置 Dataframe 时,我收到一个我无法弄清楚的错误...

“运行时错误‘91’: 对象变量或未设置块变量”

有人知道问题是什么吗?

提前非常感谢!

亚瑟

【问题讨论】:

  • 假设您想从A1 开始,只需使用Set Dataframe = Range("A1").Resive(LR, LC) - 您的方法没有任何问题,这似乎更容易遵循。您那里还有不合格的对象,并且依赖于 Active 对象,这些对象有时可能会很混乱。最好是明确的。
  • @urdearboy 关于不合格对象;我想 Dataframe.clearcontents 然后根据工作表名称使用 Select Case 循环遍历工作表。这样我认为我需要保留对象 activeworkbook 和 activesheet
  • 随手设置工作表
  • 哪一行出现错误?我怀疑问题出在您不合格的 Cells 对象上。但是,您在这里拥有的代码还不足以知道。分享更多相关代码...
  • 你为什么使用Row + 1Cells(2, LC)?我的意思是+ 12?

标签: excel vba runtime-error


【解决方案1】:

数据框

  • 要以您“构建”它的方式完全限定范围,您必须执行以下操作:

    Set DataFrame = ThisWorkbook.Worksheets("Sheet1").Range(ThisWorkbook.Worksheets("Sheet1").Cells(2, 1), ThisWorkbook.Worksheets("Sheet1").Cells(LR, LC))
    
  • 要避免以前的情况,您可以使用With 语句,它还允许您在一个地方轻松更改工作表。

  • 注意RangeCellsRowsColumns 前面的点 (.)。

守则

Option Explicit

Sub df()
    
    Dim LR As Long
    Dim LC As Long
    Dim Dataframe As Range
    
    With ActiveWorkbook.ActiveSheet
        LR = .Cells(.Rows.Count, 1).End(xlUp).Row
        LC = .Cells(1, .Columns.Count).End(xlToLeft).Column
        ' Explicitly: note the '2'.
        Set Dataframe = .Range(.Cells(2, 1), .Cells(LR, LC))
        ' Implicitly i.e. you have the full range incl. the headers:
        ' Define 'full' range.
        'Dim rng As Range
        'Set rng = .Range(.Cells(1, 1), .Cells(LR, LC))
        ' Resize and offset to exclude the headers.
        'Set Dataframe = rng.Resize(rng.Rows.Count - 1).Offset(1)
    End With
    
    Dataframe.Select

End Sub

编辑

  • 这就是我使用 For Each Next 循环和带有工作表名称数组的 Application.Match 编写代码的方式。
  • 这不像你的Select Case 版本那样区分大小写,所以我可以有例如WriTTeN 仍然可以找到工作表。
  • 不需要Dataframe 变量。
  • 2 表示范围将从保留标题的第二行开始。

守则

Sub df2()
        
    Dim wsNames As Variant
    wsNames = Array("Page1_1", "Page2_2", "Written", "Waived", "Earned")
    
    Dim ws As Worksheet
    Dim LR As Long
    Dim LC As Long
    
    For Each ws In ActiveWorkbook.Worksheets
        If Not IsError(Application.Match(ws.Name, wsNames, 0)) Then
            LR = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
            LC = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
            ws.Range(ws.Cells(2, 1), ws.Cells(LR, LC)).ClearContents
        End If
    Next ws

End Sub

【讨论】:

  • 非常感谢。它就像一个魅力。非常感谢,我从中学到了很多!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2015-03-14
  • 1970-01-01
  • 2015-02-08
  • 2012-06-11
  • 1970-01-01
相关资源
最近更新 更多