Chuỗi bộ lọc VBA Excel chứa số


3

Tôi đã tạo Công thức trong Excel VBA. chuỗi trích xuất có chứa số từ một ô. ví dụ: một chuỗi chứa: "121A Nariman Street", nó sẽ trích xuất "121A"

Dưới đây là mã

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

nhưng khi có hai số trong một chuỗi, nó trả về số thứ hai, ví dụ: nó trả về "121A Nariman Street, Khối thứ 12", nó sẽ trả về "12th"

tôi muốn hàm này chỉ trả về chuỗi First Number. làm như thế nào ?

tôi rất mới với VBA Excel.


1
Bạn đang thiếu mộtEnd If
Dave

Câu trả lời:


1

Nếu tất cả các địa chỉ bắt đầu bằng một số, bạn có thể trả về mục đầu tiên:

Public Function DoorNo1(ByVal address As String) As String

    DoorNo1 = Split(address)(0)

End Function

khác, thoát khỏi hàm khi chữ số đầu tiên được tìm thấy:

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

Câu hỏi của bạn là về việc chọn lần đầu tiên bạn gặp điều gì đó IsNumeric()trả về đúng

Phiên bản cập nhật này nên làm điều đó

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

Bỏ qua tất cả những điều khác sai (và giữ logic hiện tại của bạn ở nơi có thể), logic bạn có thể sử dụng là sử dụng một Exit For(cũng như đóng IFcâu lệnh).

Exit Forsẽ thoát khỏi Forvòng lặp. Bạn làm điều này sau khi từ đầu tiên đã được phân tích và tạo ra.

Sau đó, bạn chỉ cần kiểm tra xem từ đầu tiên mới ( DoorNo) có giá trị hay không. Nếu có, gán nó và thoát khỏi vòng lặp

Ngoài ra, vì hàm của bạn trả về một cái gì đó, bạn nên làm cho nó rõ ràng bằng cách sử dụng As

Tuy nhiên, sẽ không có ý nghĩa gì vì tất cả logic hiện tại của bạn đang kiểm tra xem có bất kỳ ký tự nào trong chuỗi là số hay không và trả về nếu có! Điều này có nghĩa là địa chỉ a12 (nếu nó tồn tại) sẽ không bao giờ được chọn. Trường hợp là doanh nghiệp của tôi, không có số nhưng có tên ngu ngốc 5tars C3entresẽ được chấp nhận bởi logic của bạn

Không biết tình hình, logic của bạn, loại giá trị bạn nhận được (ví dụ: Nhà 12, Nhà mười hai, Nhà 12a, Nhà khác, v.v.) thật khó để giúp đỡ nữa nhưng điều này sẽ giúp bạn đi


-2

Bạn thậm chí không cần sử dụng VBA cho điều đó.

Tôi sử dụng RegEx find / thay thế bổ trợ để có được chức năng biểu thức chính quy trong Excel.
( Tôi không được kết nối với bổ trợ đó hoặc là tác giả theo bất kỳ cách nào, tôi chỉ là một người dùng đam mê. )

Với điều đó, bạn chỉ có thể sử dụng công thức này:
=RegExFind(A1,"\d+[a-zA-Z]*")

nhập mô tả hình ảnh ở đây


Về mã của bạn:

khắc phục nhanh bạn nên thoát khỏi Forvòng lặp bên ngoài sau khi bạn tìm thấy một số

sửa chữa lâu hơn:

  • Tôi thậm chí sẽ không sử dụng forở đây, do ... loopsẽ hiệu quả hơn (hoặc sử dụng biểu thức chính quy trong mã của bạn nếu bạn bị thuyết phục viết mã)
  • không khai báo biến trong vòng lặp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.