【问题标题】:VBA Access Arguments Passing ValuesVBA 访问参数传递值
【发布时间】:2016-06-30 15:24:39
【问题描述】:

访问 2013

我正在调用一个公式来修改一个字符串,它正在更改父子中的值。

例子:

Debug.Print Str 'Hello World my name is bob
BOBexists = InStringChceck(Str,"bob")
Debug.Print Str 'HELLO WORLD MY NAME IS BOB
Debug.Print BOBexists 'TRUE

我之前在 Excel VBA 中使用过这个函数,InStringCheck(这只是一个例子,我所有的字符串工具现在都在做同样的事情,我不知道为什么)

Function InStringCheck(Phrase as string, Term as string) as Boolean
    Phrase = UCase(Phrase)
    Term = UCase(Term)
    if instr(1, Phrase, Term) then InStringCheck = True else InStringCheck = False
end function

在我的几个函数中,我操纵了输入变量,以得出一个解决方案,但我不希望这些操纵在函数之外持续存在,除非我将它们传回 - 一些它们是如何被传递的,但它们没有作为公共变量进行调整

【问题讨论】:

  • 在参数声明中使用 ByVal 关键字 InStringCheck(ByVal Phrase as string, ByVal Term as string)
  • 顺便说一句,您可以将if instr(1, Phrase, Term) then InStringCheck = True else InStringCheck = False 更改为InStringCheck = InStr(1, Phrase, Term)。永远不要基于布尔条件返回 TrueFalse。根据定义,它已经是TrueFalse。只需返回布尔条件本身。您不必询问它并返回另一个布尔值。
  • 其他注解:除非您在调用或Option Compare 中指定vbBinaryCompare,否则InStr() 不区分大小写。所以不需要UCase

标签: string ms-access vba


【解决方案1】:

VBA 参数通过引用 (ByRef) 隐式传递。这意味着您将 reference 传递给该值,而不是该值本身:在过程中更改该值将导致该更改后的值对调用代码可见。

这通常被用作从函数/过程返回多个值的技巧:

Public Sub DoSomething(ByVal inValue1 As Integer, ByRef outResult1 As Integer, ...)

你有两个选择:

  • 按值传递参数(ByVal
  • 引入局部变量并改变它们而不是改变参数(见鬼,显式传递参数ByRef

如果您的项目中有很多参数被隐式传递ByRef,那么到处修复它们很容易变得乏味。使用Rubberduck,您可以轻松定位所有事件、导航到那里并应用适当的修复:

免责声明:我积极参与 Rubberduck 项目。

【讨论】:

    【解决方案2】:

    基于@Sorcer 的回答,VBA 具有默认的 Sub/Functions 参数,通过“引用”传递(即:如果未指定,则假定为“ByRef”关键字),因此如果您不希望它们的“内部”修改在外部存在您必须在参数列表中显式键入“ByVal”关键字。

    但您可以选择使用StrComp() 来避免此类修改发生:

    Function InStringCheck(Phrase as string, Term as string) as Boolean
        InStringCheck = StrComp(Phrase, Term, vbTextCompare) = 0
    End Function
    

    这也可能导致您避免使用InStringCheck(),而是在代码中直接使用StrComp()

    【讨论】:

      猜你喜欢
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 2021-02-06
      相关资源
      最近更新 更多