我在 Excel VBA 中创建了一个公式。它从单元格中提取包含数字的字符串。例如,一个字符串包含:“121A Nariman Street”,它将提取“121A”
以下是代码
Function DoorNo(ADRESS)
Dim AddressArray() As String
AddressArray = Split(ADRESS)
Dim i As Integer
For i = 0 To UBound(AddressArray)
Dim iCnt As Integer
For iCnt = 1 To Len(AddressArray(i))
If IsNumeric(Mid(AddressArray(i), iCnt, 1)) Then
DoorNo = AddressArray(i)
Next iCnt
Next i
End Function
但是当字符串中有两个数字时,它会返回第二个数字,例如它返回“121A Nariman Street, 12th Block”,它将返回“12th”
我希望此函数仅返回第一个数字字符串。如何做到这一点?
我对 Excel VBA 还很陌生。
答案1
如果所有地址都以数字开头,则可以返回第一项:
Public Function DoorNo1(ByVal address As String) As String
DoorNo1 = Split(address)(0)
End Function
否则,当找到第一个数字时退出该函数:
Public Function DoorNo2(ByVal address As String) As String
Dim addressArray() As String, i As Long, j As Long
addressArray = Split(address)
For i = 0 To UBound(addressArray)
For j = 1 To Len(addressArray(i))
If IsNumeric(Mid(addressArray(i), j, 1)) Then
DoorNo2 = addressArray(i)
Exit Function
End If
Next
Next
End Function
答案2
您的问题是关于选择第一次遇到IsNumeric()
返回 true 的事情
这个更新的版本应该可以做到
Option Explicit
Sub doIt()
Dim dn As String
dn = DoorNo("12A Street 12th")
End Sub
Function DoorNo(addy As String) As String
Dim door As String
Dim AddressArray() As String
AddressArray = Split(addy)
Dim i As Integer
For i = 0 To UBound(AddressArray)
Dim iCnt As Integer
For iCnt = 1 To Len(AddressArray(i)) 'why are you looping here?
If IsNumeric(Mid(AddressArray(i), iCnt, 1)) Then
door = AddressArray(i)
End If
Next iCnt
If Not IsEmpty(DoorNo) Or Not DoorNo = Null Then
DoorNo = door
Exit For
End If
Next i
End Function
忽略所有其他错误(并尽可能保留现有的当前逻辑),您可以使用的逻辑是使用Exit For
(以及关闭IF
语句)。
Exit For
将退出For
循环。在分析并创建第一个单词后执行此操作。
然后你只需检查新的第一个单词(DoorNo
)是否有值。如果有,则分配它并退出循环
此外,由于你的函数返回了某些内容,因此你应该使用As
然而,这毫无意义,因为您当前的所有逻辑都在检查字符串中是否有任何字符是数字,如果是,则返回它!这意味着地址 a12(如果存在)永远不会被拾取。而我的公司没有数字,但名字很蠢,5tars C3entre
您的逻辑会接受它
如果不知道具体情况、你的逻辑、你收到的值的类型(例如,12 号房子、12 号房子、12a 号房子、房子、其他等等),就很难再提供任何帮助,但这应该可以让你继续前进
答案3
您甚至不需要使用 VBA。
我用RegEx 查找/替换插件来获取 Excel 中的正则表达式功能。
(我与该插件或其作者没有任何关系,我只是一个狂热用户。)
你可以使用这个公式:
=RegExFind(A1,"\d+[a-zA-Z]*")
关于您的代码:
For
快速修复你应该在找到数字后退出外层循环
更长的修复:
- 我甚至不会
for
在这里使用,do ... loop
会更有效率(或者如果你确信要写代码的话,在你的代码中使用正则表达式) - 不要在循环内声明变量