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

时间:2017-04-07 17:49:56

标签: arrays vba excel-vba split excel

我正在考虑一个单元格值(有时是" flores"有时候" de las flores")但是我真的不知道这个值,因为有超过10000条记录。

我想要做的只是" flores" (最后一句话,如果只有一个,那么,那个)。香港专业教育学院曾尝试使用拆分,然后使用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

谢谢!

2 个答案:

答案 0 :(得分:1)

我认为无论如何你都过于复杂了。除非我读错了(非常可能),否则你可以简化这个A LOT。

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

答案 1 :(得分:0)

“未声明的变量”是编译时错误,表示您已指定Option Explicit - 这是优秀的事情,不会将其删除!

  

但我试图让它隐含。

没有理由想要这样做。

Option Explicit 需要变量声明。所以你必须声明你使用的所有变量。

如果您想为变量隐式类型,请在没有As子句的情况下声明它:

Dim arr ' implicit: As Variant

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

vocal = arr(UBound(ary))

如果这意味着将项目置于arr的上限,那么ary应为arr

这是多余的:

If (asciinum = outStr) Then
    CheckFirstLetter = True
    Else: CheckFirstLetter = False
    End If

可以写成一个简单的作业:

CheckFirstLetter = (asciinum = outStr)

您的代码已经非常隐含了。这两条指令隐含地引用了ActiveSheet

Cells(index, "M") = vocal
Cells(index, "O") = asciinum

这些声明将outStrasciinum声明为隐式Variant

Dim outStr [As String], asciinum [As String], vocal As String, i As Long

参数全部隐式传递ByRefByVal就足够了),并且它们都是隐式的Variant

mystring, text, indexCurp, index

VS

ByVal mystring As String, ByVal text As String, ByVal indexCurp As Long, ByVal index As Long

这些函数调用返回Variant,这意味着如果StringoutStr是字符串,则隐式转换为asciinum

outStr = LCase(Mid(text, indexCurp, 1))
asciinum = LCase(Mid(mystring, 1, 1))

这些将返回String而不是:

outStr = LCase$(Mid$(text, indexCurp, 1))
asciinum = LCase$(Mid$(mystring, 1, 1))

看,你的代码已经绰绰有余了。除此之外不需要隐式变量!荣誉:

  • 使用Option Explicit
  • 返回明确的Boolean
  • 使用PascalCase命名您的功能