VBA “Argument Not Optional” - unsure how to declare variables

╄→尐↘猪︶ㄣ 提交于 2020-01-07 08:35:08

问题


I am trying to write a VBA macro that assigns values to specific cells by calculating the average of the cells directly above and below it. I am running it by selecting the Macros button on the Developer toolbar, then I have to type in the name of my function (it doesn't appear on the list) "interpprob" and select run. I then get a popup that states "Argument is not optional." I'm not quite sure what the problem is. The full macro is below. "tstep" is meant to be an array of the set of rows that need some cell values changed.

Function interpprob(f As Integer, d As Integer, spec As String, tstep As Long, above As Long, below As Long, i As Integer, j As Integer)

f = 41
d = 441
spec = ETHA

tstep(0) = f
tstep(1) = f + d
tstep(2) = f + 2 * d
tstep(3) = f + 5 * d

For i = 0 To 4
    For j = 52 To 57
        above = Cells(tstep(i) - 1, j).Value
        below = Cells(tstep(i) + 1, j).Value
        Sheets(spec).Cells(tstep(i), j).Value = (above + below) / 2
    Next j
Next i

End Function

Thanks, BL Roo


回答1:


Based on your expectations, change Function into Sub and remove the parameters.

Sub interpprob()

    f = 41
    d = 441
    spec = "ETHA"

    tstep(0) = f
    tstep(1) = f + d
    tstep(2) = f + 2 * d
    tstep(3) = f + 5 * d

    For i = 0 To 3  'Changed from 4 as you do not assign a value to tstep(4)
        For j = 52 To 57
            above = Cells(tstep(i) - 1, j).Value
            below = Cells(tstep(i) + 1, j).Value
            Sheets(spec).Cells(tstep(i), j).Value = (above + below) / 2
        Next j
    Next i

End Sub

You can also insert the following declarations just after the Sub:

Dim f As Long
Dim d As Long
Dim spec As String
Dim tstep(0 To 3) As Long
Dim above As Long
Dim below As Long
Dim i As Long
Dim j As Long

It is a practice which pays off when a program grows. It keeps you safe from several kinds of mistakes.

To make this practice mandatory, insert the following directive as first line of the file (just before everything else):

Option Explicit

You can also see that type Integer was replaced by Long because Integer is too short (–32768 ... +32767) and unpractical for standard use and keeping around both Integer and Long has no real benefit (and has a performance penalty). Just declare every integer variable as Long.

Credits for suggestions and fixes go to YowE3K and robinCTS.



来源:https://stackoverflow.com/questions/46045128/vba-argument-not-optional-unsure-how-to-declare-variables

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!