2015-02-08 258 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中。