2015-02-08 210 views
0

我必须得到正弦波的波峰和波谷值。但数据有噪音。我使用了下面的代码。但是它似乎在代码的一部分中存在问题。它给运行时错误91.运行时错误91 vba

这是代码。

Range("B2").Activate 
last = Application.CountA(Range("A:A")) 
Dim f, g, tp, tm As Double 
Dim zpo, zpt, zmo, zmt As Range 
f = 0 
g = 0 
For a = 0 To 2 
For k = 0 To last 
    If ActiveCell.Offset(k, a).Value > 0 Then 
     If ActiveCell.Offset(k + 1, a).Value < 0 Then 
      zpo = ActiveCell.Offset(k, a).Address 
      zmo = ActiveCell.Offset(k + 1, a).Address 
      tp = f + 1 
      f = tp 
     End If 
    End If 
    If ActiveCell.Offset(k, a).Value < 0 Then 
     If ActiveCell.Offset(k + 1, a).Value > 0 Then 
      zmt = ActiveCell.Offset(k, a).Address 
      zpt = ActiveCell.Offset(k + 1, a).Address 
      tm = g + 1 
      g = tm 
     End If 
    End If 
    If f > 0 Then 
     If f = g Then 
      Sheets("extract").Cells((5 * a) + 1, f).Value = WorksheetFunction.max("zpo:zpt") 
      Sheets("extract").Cells((5 * a) + 2, f).Value = WorksheetFunction.Min("zmo:zmt") 
     End If 
    End If 
Next 
Next 

它到达第二个if语句时出现问题。

它说对象变量或块变量未设置

+0

哪行代码给行? – 2015-02-08 06:59:50

+0

其中地址分配给zmt 第19行 它将值赋给zpo或zmo时没有问题。 – 2015-02-08 07:12:20

+0

我改变它的变体,它的工作原理,但不知道为什么它有问题定义为范围 – 2015-02-08 07:19:12

回答

1

你有一个错误,因为你的代码试图把一个字符串转换成一个对象:

Dim...zmt As Range (<--- zmt is set as an object becuase Range is an object) 

    zpt = ActiveCell.Offset(k + 1, a).Address (the "Address" is a string) 

一般来说,当你有一个对象,你需要使用“设置”,例如:

set object1 = object2 

这不是你的代码的情况下,因为一个“串”不被认为 为对象在VBA中,所以你在处理它们时不要使用“set”。

的主要问题是,当你定义一个行:

Dim zpo, zpt, zmo, zmt As Range 

什么你实际上做的是要求: “民事诉讼法,ZPT,ZMO”
是Variant类型和 变量zmt 是一个范围类型(​​一个对象)。

将zmt更改为变体后,代码就起作用了,如您所见, 因为一个字符串(地址)可以放入Variant中。