将Active.Sheet设置为Range时,“对象必需”

时间:2018-08-21 02:36:50

标签: excel vba excel-vba automation

我尝试了所有可以找到的解决方案。

我想做的是为选定范围运行一个功能(ActiveSheet) 我什至无法进入循环部分,因为它在第5行(arc = ActiveSheet.Row.Count)出错。它引发的错误是“ Object Required”。我尝试了几种在线找到的解决方案,但都没有走运。我是excel vba的完全菜鸟(我的背景是vb.net和c#)。我将不胜感激在错误的方向上向正确的方向发展。在此先感谢:)

Sub TestV2()
Dim rng As Range
Dim selectedRange As Range
Dim arc As Range
Set arc = ActiveSheet.Rows.Count
Set selectedRange = ActiveSheet.Rows.Count
For Each rng In selectedRange.Cells
If Application.CalculationState = xlDone Then
FireValidate
End If
    Next rng
    End
End Sub

5 个答案:

答案 0 :(得分:3)

由于声明了arc as Range,但您正在尝试为其分配一个Long号,因此您收到此错误。

答案 1 :(得分:2)

在VBA中,必须使用Set关键字才能分配对象引用

Set arc = ActiveSheet.Rows.Count
Set selectedRange = ActiveSheet.Rows.Count

arcselectedRange都被声明为As Range,这对象类型-因此Set关键字是正确的。

问题出在赋值运算符右侧的表达式上:ActiveSheet.Rows.Count的计算结果是一个Long整数,这是不是一个对象类型。 ActiveSheet.Rows.Count为您提供ActiveSheet上的行数,...无论当前处于活动状态的特定工作表如何,其行数都应相同(所有工作表的行数均相同)。

因此,需要对象:您不能合法地将Range对象引用分配给Long整数值;您需要使用右侧的表达式来求出对象引用

Tim Williams' answer显示了如何正确地将selectedRange分配给Application.Selection,假设当前选择的是Range对象(类型不匹配否则将发生错误。

  

我想做的是为选定范围(ActiveSheet)运行一个函数

ActiveSheet不会返回所选范围-它会为您提供当前处于活动状态的工作表

  

我是excel vba的完全菜鸟(我的背景是vb.net和c#)

您也可以从VB.NET或C#引用Excel对象模型,如果对这些功能更强大的.net语言更满意,则可以通过Visual Studio Tools for Office(VSTO)自动执行Excel-但是对象模型将行为相同。

答案 2 :(得分:1)

如果只需要当前选择,则:

Set selectedRange = Selection

答案 3 :(得分:1)

您可以尝试如下修改代码:

Sub TestV2()
Dim rng As Range
For Each rng In Selection
If Application.CalculationState = xlDone Then
    FireValidate
End If
Next rng
End Sub

希望它对您有所帮助。

答案 4 :(得分:0)

您的代码中存在三个错误:

.1。 关键错误。直接使用 ActiveSheet.Rows.Count 可能会遇到“ Object Required”异常,相反,您可以使用以下工作代码:

Dim ws As Worksheet
Set ws = ActiveSheet
'MsgBox ws.Rows.Count
Set arc = ws.Rows.Count
  1. 正如 hod 所说(这不是关键问题,但需要解决)
  

您收到此错误是因为您将arc声明为Range,但您正在尝试为其分配Long数。

  1. 正如威廉所指出的,如果要操作选定的范围,可以直接使用设置selectedRange =选择

Sub TestV2()

Dim rng As Range

Dim selectedRange As Range
  Set selectedRange = Selection
    For Each rng In selectedRange.Cells
      If Application.CalculationState = xlDone Then
       'FireValidate
       'MsgBox "OK"
       End If
     Next rng    
End Sub

而且我认为大多数时候我们只需要 UsedRange.Rows ,而不需要全部 Rows

当前工作表的ActiveSheet.UsedRange.Rows.Count

工作表(“工作表名称”)。UsedRange.Rows.Count用于特定工作表。

相关问题