【问题标题】:"Argument Not Optional" VBA Excel SUB“参数不是可选的”VBA Excel SUB
【发布时间】:2016-12-09 14:26:42
【问题描述】:

我正在编写一些 VBA 代码,我得到了一个

参数不是可选的

错误。我查看了这个问题的其他一些答案,但他们似乎没有回答我的问题。

代码在Sub Finding_number () 的第一次迭代中卡住了,这让我很困惑。我没有向该 Sub 传递任何参数或从该 Sub 传递任何参数,那么为什么会出现错误?

我的代码

Sub Pedal_Actuations_per_hour()

Dim counter As Integer
Dim average_actuations As Single

counter = 1    
Do While IsEmpty(ActiveCell.Value) = False    
    Finding_number
    average_actuations = (average_actuations + Pedal_actuations()) / counter
    counter = counter + 1    
Loop

Range("J2").Value = average_actuations    

End Sub


Sub Finding_number()

    Dim index As Integer
    index = 1        
    Range("E2").Select

    Do While index = 1
        If ActiveCell.Value = 121 Then
            index = 0
        End If

        Range.Offset (1)
    Loop

End Sub

Function Pedal_actuations() As Integer

Dim time_sum As Single
Dim index As Integer

index = 1
time_sum = 0    
Do While time_sum < 1            
    If IsEmpty(ActiveCell.Value) = 0 Then 
        date_number = Int(ActiveCell(, -2).Value)
        ActiveCell(, 6).Value = ActiveCell(, -2).Value - date_number
        ActiveCell(, 7).Value = Abs(ActiveCell(, 6).Value - ActiveCell(2, 6)) *24 
    Else
        index = 0
    End If

    Pedal_actuations = Pedal_actuations + 1
    time_sum = time_sum + ActiveCell(, 7).Value                
Loop

End Function

【问题讨论】:

  • Range.Offset (1) 错了,不代表什么。
  • 错误在这里Range.Offset (1)。您没有说明要偏移哪个单元格,也没有告诉它如何处理该单元格。

标签: vba excel


【解决方案1】:

最好避免使用SelectActiveCell等... 而是将引用对象用作SheetsRanges。

Sub Finding_number()

    Dim index As Integer
    index = 1

    Dim Rng As Range
    Set Rng = Range("E2")

    Do While index = 1
        If Rng.Value = 121 Then
            index = 0
        End If

        Set Rng = Rng.Offset(1)
    Loop

End Sub

下面的较短版本会得到相同的结果:

Sub Finding_number()

    Dim Rng As Range
    Set Rng = Range("E2")

    Do While Rng.Value <> 121
        Set Rng = Rng.Offset(1)
    Loop

End Sub

【讨论】:

  • Range 是否具有与 Activecell 相同的所有功能,但更高效/更快?例如,您在我的代码的函数中看到我使用 activecell 来执行某些事情。除了使用范围对象之外,我可以做所有这些事情并且只做 Rng(, 6).value = ... 吗?
  • @VincentCeyssens 您可以在此处阅读有关Range 对象的更多信息:msdn.microsoft.com/en-us/library/office/ff838238.aspx。第二部分,我想你的意思是Offset,对吧?正确的语法是Rng.Offset(,6).Value
【解决方案2】:

很有可能

Range.Offset (1)

您可能希望将代码更改为类似

Sub Finding_number()

    Dim index As Integer
    index = 1

    Dim rng As Range
    Set rng = Range("E2")

    Do While index = 1
        If rng.Value = 121 Then index = 0
        Set rng = rng.Offset(1, 0)
    Loop
End Sub

那么,出了什么问题?

您想使用您之前在代码中选择的范围,然后转到下一个单元格,依此类推。

你可能想做的是

Selection.Offset(1, 0).Select

这会将 偏移到我们当前选定单元格下的单元格,然后选择它。

但是:最好只定义和设置范围对象

Dim rng As Range
Set rng = Range("E2")

然后将其设置为每个循环后的下一个单元格

Set rng = rng.Offset(1, 0)

最后,为了进一步改进您的 sub,请考虑您是否真的需要您的 index-Variable。这是没有它的镜头

Sub Finding_number()

    Dim rng As Range
    Set rng = Range("E2")

    Do While Not rng.Value = 121
        Set rng = rng.Offset(1, 0)
    Loop
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2020-08-23
    • 2015-09-28
    • 2023-03-21
    相关资源
    最近更新 更多