Изменение значений ячеек Excel на основе их длины с помощью UDF

#vba

#vba

Вопрос:

Меня попросили изменить некоторые значения телефонных номеров в столбце Excel, и я хотел воспользоваться возможностью впервые создать UDF.

В настоящее время у меня есть список телефонных номеров, которые различаются по размеру. Некоторые числа являются полными, а некоторые — неполными (т.е. длина варьируется от 7 цифр до 11). Целевая длина для каждого числа составляет 10 цифр. Если число больше 10 цифр, я урезаю первое число, если оно меньше, я бы добавлял «0» к началу строки, пока она не станет длиной в 10 цифр.

Я не совсем уверен, что я делаю неправильно, поэтому я надеялся, что кто-нибудь сможет указать мне правильное направление. На данный момент я получаю «#VALUE» в моей функциональной ячейке. Я ориентируюсь на ячейку, которая отформатирована как «текстовая» ячейка. Приветствуются любые советы! Вот моя функция…

 Public Function phone_number_trim(phone_number As String)

Dim phone_number_length As Integer
Dim s_phone_number As String


phone_number_length = phone_number.Len
s_phone_number = phone_number

If phone_number_length > 10 Then s_phone_number = Mid(s_phone_number, 2, 10)

If phone_number_length < 10 Then
    For i = 0 To phone_number_length
    s_phone_number = "0"   s_phone_number
    Next
End If

phone_number = s_phone_number

End Function
  

Вот как выглядит мой редактор на всякий случай…
Редактор

Комментарии:

1. Если вы вызовете свою функцию из VBA sub, вы получите больше информации о том, в чем может заключаться проблема.

2. … и ваша ошибка, по крайней мере, здесь phone_number_length = phone_number.Len должна быть phone_number_length = Len(phone_number)`

3. phone_number_trim = Right(String(10, "0") amp; Right(phone_number, 10), 10)

Ответ №1:

На всякий случай, если кому-то интересно, вот функция, с которой я в итоге перешел…

В итоге мне пришлось немного почистить свои данные, поэтому я написал вспомогательную функцию. Это не идеально, и я знаю, что есть случаи, когда это не сработало бы, но я буду пересекать эти мосты по мере их поступления!

 Public Function prepare_the_subject(subject As String) As String

Dim bad_guys() As Variant
bad_guys = Array(" ", "-", ")", "(", "'", ".", "/", "")
Dim test As String

test = subject

For Each guy In bad_guys
    test = Replace(test, guy, "")
Next guy

prepare_the_subject = test

End Function

Public Function phone_number_trim(phone_number As String) As String

Dim phone_number_length As Integer
Dim s_phone_number As String
Dim i As Integer
Dim zero_len As Integer

s_phone_number = phone_number
s_phone_number = prepare_the_subject(s_phone_number)
phone_number_length = Len(s_phone_number)
zero_len = 10 - phone_number_length

If phone_number_length > 10 Then s_phone_number = Mid(s_phone_number, 2, 10)

If phone_number_length < 10 Then
    For i = 1 To zero_len
    s_phone_number = "0"   s_phone_number
    Next
End If

phone_number_trim = s_phone_number

End Function