excel vba 运行时错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了excel vba 运行时错误相关的知识,希望对你有一定的参考价值。

我想在"第一部分"这个表中访问"第二部分"中的内容 但是 提示“运行时错误“ 具体代码如下图所示,能帮我看看是什么问题吗?

工具:office excel

步骤:

1、打开office excel,vba运行时错误如下。

2、这段代码是测试当前VBA版本的:

代码如下:

Sub 获取VBA版本() 
MsgBox Application.VBE.Version 
End Sub 

3、当按F5键,就报:运行时错误1004。经老师指点,单击文件――选项――信任中心――打开“信任中心”对话框,宏设置――勾选“信任对VBA工程对象模型的访问”。再次运行,就不会出现运行时错误1004提示。完成。

参考技术A

    在错误对话框弹出后,仔细阅读出错信息。如“下标越界”,那么在检查错误的时候,就要仔细检查数组下标。

    接下来点击出错对话框上面的“调试”按钮,系统会自动跳转到出错的代码行,并变色显示

    在出错行,根据“出错信息”,仔细检查代码

    修正代码后,重新运行

参考技术B 你这个过程很容易看出问题来呀,你最开始定义了一个变量dim j 并且 j=0 那么 worksheets("第二部分").cells(j,9) 肯定报错,因为工作表当中的单元格最小的行数是1,不是0
所以你至少应该把j=1而不是j=0本回答被提问者采纳
参考技术C dim clk as workSheet
set clk=sheet1
然后才是你黄色部分的代码,你连工作表都不指定,肯定报错
参考技术D j初始为0了,行号最小是1的

Excel vba:.find 函数返回运行时错误 91

【中文标题】Excel vba:.find 函数返回运行时错误 91【英文标题】:Excel vba: .find function returns runtime error 91 【发布时间】:2017-01-16 14:52:53 【问题描述】:

我已经阅读了几个小时的相关主题,但似乎找不到解决方案。非常感谢您的帮助,谢谢。

我试图找到一个范围内的最大值,然后找到它在哪一行。 这段代码适用于我的前 600 多行数字,然后崩溃并给我运行时错误 91。它似乎总是在同一个地方崩溃,与我所做的无关。

Dim rSearchRange As Range
Dim dMaxToFind As Double
Dim rSolutionrange As Range

Set rSearchRange = Sheets("MySheet").Range(Cells(672, 1), Cells(681, 1))

With Application.WorksheetFunction
       dMaxToFind = .Max(rSearchRange)
End With

'This bit here returns "nothing" even though i found the max value in this range
Set rSolutionrange = rSearchRange _
            .Find(What:=dMaxToFind, _
            LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, _
            SearchDirection:=xlNext, MatchCase:=False)

查看我的数据,这些行中的格式似乎发生了变化?

    Row 670 - 0.000458587
    Row 671 - 0.000458587
    Row 672 - 9.80465E-05
    Row 673 - 9.80465E-05

编辑:

dMaxToFind 返回 9.80465352566588E-05

单元格公式返回 0.0000980465352566588

Range(Cells(672, 1), Cells(681, 1) 之间的单元格中的值相同

似乎 vba 无法理解这两个是相同的?

谢谢,

标记

【问题讨论】:

试试... LookIn:=xlValues... 如果搜索条件不匹配,.Find 将返回 Nothing。当您稍后使用 rSolutionRange 对象变量并假设它设置为有效引用时,错误 91 被引发(不是“返回”)(Nothing 不是有效的对象引用) - 您需要在使用之前检查If rSolutionRange Is Nothing 如果Sheets("MySheet") 不是活动工作表,Sheets("MySheet").Range(Cells(672, 1), Cells(681, 1)) 也会爆炸,因为Cells(xxx, yyy) 调用隐含地引用ActiveSheet,所以你也需要限定这些调用;使用With Worksheets("MySheet"),然后在With 块内执行Set rSearchRange = .Range(.Cells(672, 1), .Cells(681,1))(注意点)。 谢谢大家,还是没有运气。 user3598756 - 似乎没有改变结果 Mat's Mug - 我尝试了各种方法来调用范围的行或直接使用行而不使用范围。该范围不返回任何内容,因此该行返回错误 91。我也合并了工作表(“MySheet”),但没有运气 【参考方案1】:

这是一个直接告诉你行号的函数。这与您使用内置函数获取最大值然后再次找到它的方法相反!

Function GetMaxRow(ByRef myRange As Range) As Long

    Dim aCell As Range

    Dim maxVal As Double
    Dim maxRow As Long

    maxVal = Application.WorksheetFunction.Min(myRange)
    maxRow = 0

    For Each aCell In myRange

        If aCell.Value > maxVal Then

            maxRow = aCell.row
            maxVal = aCell.Value

        End If

    Next aCell

    GetMaxRow = maxRow

End Function

您可能希望在此函数的结果中添加一些错误检查代码,例如,当函数返回 0 时,这意味着您没有向其传递超过 1 个单元格的范围。

例子:

1 - 3.0
2 - 5.2
3 - 7.8
4 - 2.2
5 - 4.5
6 - 3.6

Dim rw as Long
rw = GetMaxRow(ActiveSheet.Range("A1:A6"))
' >> rw = 3

编辑:

您询问了循环的使用,大概是因为节省时间。下面是一个时序表,当然这在计算机之间会有所不同,但您可以看到这是一个相当快的例程,除非您的数据集很大......而且操作的顺序是线性的,正如预期的那样,这意味着范围加倍大约加倍花费的时间。

2000  rows: 0.0050000s
4000  rows: 0.0099219s
8000  rows: 0.0196875s
16000 rows: 0.0392969s

测试的单元格值是 0 到 1 之间的随机双精度值。

编辑 2:

您使我对速度的兴趣达到了顶峰...因此,我没有在范围内循环(慢),而是编写了相同的函数,但使用了数组。范围被转换为数组,然后循环。这提供了约 10 倍的速度提升!有关相同数据的代码和时序,请参见下文。

Function GetMaxRow(ByRef myRange As Range) As Long

    Dim i As Long

    Dim maxVal As Variant
    Dim maxRow As Long

    maxVal = Application.WorksheetFunction.Min(myRange)
    maxRow = 0

    Dim myArray() As Variant
    myArray = myRange

    For i = 1 To myRange.Count

        If myArray(i, 1) > maxVal Then

            maxRow = i
            maxVal = myArray(i, 1)

        End If

    Next i

    GetMaxRow = myRange.Cells(maxRow).Row

End Function

时间安排:

2000  rows: 0.0006250s
4000  rows: 0.0018750s
8000  rows: 0.0034375s
16000 rows: 0.0068750s

【讨论】:

这看起来不错 - 有没有办法在不循环的情况下做同样的事情? @Mark,我添加了一个更快的版本,请参阅编辑 2 @Mark 不用担心,请注意上面的函数中没有没有错误检查。例如,我没有测试过,如果您的范围包含字符串(可能没问题,但可能会产生意外结果)或错误代码(如 #DIV/0!#VALUE!,这可能会使函数崩溃!)会发生什么情况!

以上是关于excel vba 运行时错误的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 运行 Excel 宏:从 VBA 捕获运行时错误

奇怪的 excel-vba 运行时错误,不会删除现有工作表

错误处理中的 Excel VBA 运行时错误 1004

使用 VBA 退出 Excel 会导致运行时错误 424

Excel 2007 VBA ActiveWorkbook SaveAs 未保存...运行时错误 1004

运行时错误 1004 文档未使用 Vba Excel 2016 保存