簡體   English   中英

如何更新舊的VBA代碼以在excel上工作?

[英]How to update an old vba code to work on excel?

我有這本舊書中的代碼,該書在Excel不起作用。 它應該根據一系列數字x和y計算Deming回歸的斜率和截距

Function Deming(XValues, YValues)
Dim MeanX(), MeanY()
Ncells = XValues.Count
ReDim MeanX(Ncells / 2), MeanY(Ncells / 2)

For x = 2 To Ncells Step 2
    MeanX(x / 2) = (XValues(x - 1) + XValues(x)) / 2
    MeanY(x / 2) = (YValues(x - 1) + YValues(x)) / 2
    SumX = SumX + MeanX(x / 2): SumY = SumY + MeanY(x / 2)
    SumX2 = SumX2 + (MeanX(x / 2)) ^ 2
    SumY2 = SumY2 + (MeanY(x / 2)) ^ 2
    SumXY = SumXY + MeanX(x / 2) * MeanY(x / 2)
    SumDeltaX2 = SumDeltaX2 + (XValues(x - 1) - XValues(x)) ^ 2
    SumDeltaY2 = SumDeltaY2 + (YValues(x - 1) - YValues(x)) ^ 2
Next

XBar = SumX / N: YBar = SumY / N
Sx2 = (N * SumX2 - SumX ^ 2) / (N * (N - 1))
Sy2 = (N * SumY2 - SumY ^ 2) / (N * (N - 1))
Sdx2 = SumDeltaX2 / (2 * N)
Sdy2 = SumDeltaY2 / (2 * N)
rPearson = (N * SumXY - SumX * SumY) / Sqr((N * SumX2 - SumX ^ 2) * (N * 
SumY2 - SumY ^ 2))


lambda = Sdx2 / Sdy2
U = (Sy2 - Sx2 / lambda) / (2 * rPearson * Sqr(Sx2) * Sqr(Sy2))
Slope = U + Sqr(U ^ 2 + 1 / lambda)
Intercept = YBar - Slope * XBar

Deming = Array(Slope, Intercept)
End Function

這是否語法錯誤?

首先,這不是舊代碼 ,這簡直是不好的代碼

當有人在模塊/工作表的頂部寫Option Explicit時,VBA中任何無法編譯的內容都是錯誤的語法。 這是一個經驗法則。 對於代碼,如果將此代碼粘貼到編輯器,則以下行為紅色:

rPearson = (N * SumXY - SumX * SumY) / Sqr((N * SumX2 - SumX ^ 2) * (N * 
SumY2 - SumY ^ 2))

這是因為它應該在1行中,而不是2行中。

因此,關於這個問題-如何更新它-第一步,請確保代碼在頂部帶有Option Explicit編譯( Option Explicit語句 )。 因此,編寫Option Explicit ,然后轉到VBEditor的功能區上的Debug> Compile。 VBeditor將突出顯示該問題。 第一個是未定義Ncell

在此處輸入圖片說明

然后找到一種定義它的方法,例如將Dim Ncells as VariantDim Ncells as Variant或其他您認為在高亮行頂部有用的內容。 僅僅聲明一個變量可能是不夠的,因為代碼中存在XBar = SumX / N的計算。 在那里,應聲明N並將其分配給一個值。 如果僅聲明,它將為0 ,然后除以0將是錯誤。 因此,根據邏輯,可能應該這樣寫: Dim N as Double: N = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM