Arrays 取字符串的最后一个字,变量是否未声明?

Arrays 取字符串的最后一个字,变量是否未声明?,arrays,vba,excel,split,Arrays,Vba,Excel,Split,我取的单元格值有时是flores,有时是de las flores,但我无法真正知道值,因为有10000多条记录 我想做的就是让弗洛雷斯做最后的决定,如果只有一个,那么就是那个。我尝试过使用split和ubound,但是我得到了一个未声明的错误。但我试图让它含蓄 Function CheckFirstLetter(mystring, text, indexCurp, index) As Boolean Dim outStr, asciinum, vocal As Stri

我取的单元格值有时是flores,有时是de las flores,但我无法真正知道值,因为有10000多条记录

我想做的就是让弗洛雷斯做最后的决定,如果只有一个,那么就是那个。我尝试过使用split和ubound,但是我得到了一个未声明的错误。但我试图让它含蓄

Function CheckFirstLetter(mystring, text, indexCurp, index) As Boolean
            Dim outStr, asciinum, vocal As String, i As Long
---->            arr = Split(mystring, " ")
---->            vocal = arr(UBound(ary))
            outStr = LCase(Mid(text, indexCurp, 1))
            asciinum = LCase(Mid(mystring, 1, 1))
            Cells(index, "M") = vocal
            Cells(index, "O") = asciinum
            If (asciinum = outStr) Then
                CheckFirstLetter = True
                Else: CheckFirstLetter = False
                End If
End Function

谢谢

未声明的变量是一个编译时错误,这表明您已经指定了Option Explicit-这是一件很好的事情,不要删除它

但我试图让它含蓄

Function CheckFirstLetter(mystring, text, indexCurp, index) As Boolean
            Dim outStr, asciinum, vocal As String, i As Long
---->            arr = Split(mystring, " ")
---->            vocal = arr(UBound(ary))
            outStr = LCase(Mid(text, indexCurp, 1))
            asciinum = LCase(Mid(mystring, 1, 1))
            Cells(index, "M") = vocal
            Cells(index, "O") = asciinum
            If (asciinum = outStr) Then
                CheckFirstLetter = True
                Else: CheckFirstLetter = False
                End If
End Function
没有理由想那样做

选项显式需要变量声明。所以您必须声明您使用的所有变量

如果要为变量指定隐式类型,请在不使用As子句的情况下声明它:

我怀疑ary在这里是个打字错误:

vocal = arr(UBound(ary))
如果这意味着要在arr的上限获取项目,那么ary应该是arr

这是多余的:

If (asciinum = outStr) Then
    CheckFirstLetter = True
    Else: CheckFirstLetter = False
    End If
可以写成一个简单的作业:

CheckFirstLetter = (asciinum = outStr)
您的代码已经非常隐式了。这两条指令隐含地引用了ActiveSheet:

这些声明将outStr和asciinum声明为隐式变量:

这些参数都是由ref ByVal隐式传递的,这就足够了,而且它们都是隐式变量:

VS

这些函数调用返回一个变量,这意味着如果outStr和asciinum是字符串,则隐式转换为字符串:

outStr = LCase(Mid(text, indexCurp, 1))
asciinum = LCase(Mid(mystring, 1, 1))
它们将返回一个字符串:

看,您的代码已经有了足够多的隐式特性。不需要在上面添加隐式变量!荣誉:

使用选项显式 返回显式布尔值 使用PascalCase命名函数
我相信你把事情搞得太复杂了。除非我读错了,很可能你可以简化很多

Function CheckFirstLetter(mystring, text, indexCurp, index) As Boolean
    Dim vocal() As String

    vocal = Split(mystring, " ")

    Cells(index, "M") = vocal(UBound(vocal))
    Cells(index, "O") = LCase(Mid(mystring, 1, 1))

    CheckFirstLetter = Cells(index, "O") = LCase(Mid(text, indexCurp, 1))

End Function

请你把你的问题重新措辞好吗?不清楚,至少对我来说是这样?使用OptionExplicit告诉您有关打字错误的信息,我感到很荣幸。下一步,修复错误。ary不是arr。arr在哪里声明?
mystring, text, indexCurp, index
ByVal mystring As String, ByVal text As String, ByVal indexCurp As Long, ByVal index As Long
outStr = LCase(Mid(text, indexCurp, 1))
asciinum = LCase(Mid(mystring, 1, 1))
outStr = LCase$(Mid$(text, indexCurp, 1))
asciinum = LCase$(Mid$(mystring, 1, 1))
Function CheckFirstLetter(mystring, text, indexCurp, index) As Boolean
    Dim vocal() As String

    vocal = Split(mystring, " ")

    Cells(index, "M") = vocal(UBound(vocal))
    Cells(index, "O") = LCase(Mid(mystring, 1, 1))

    CheckFirstLetter = Cells(index, "O") = LCase(Mid(text, indexCurp, 1))

End Function