Страницы: 1
RSS
Преобразование семизначных чисел в текстовые маски
 
Добрый день!

Возникла потребность в преобразовании списка семизначных чисел (номера телефонов) в вид текстовых масок для дальнейшей группировки.

Пример:

Каждому знаку может быть присвоена буква:
1 цифра - A
2 цифра - B
3 цифра - C
4 цифра - D
5 цифра - E
6 цифра - F
7 цифра - G

Для номера 123-45-67 маска будет выглядеть так: ABC DE FG
Для номера 234-56-78 будет выглядеть аналогично: ABC DE FG

Но в случае, если цифры в номере повторяются маска должна выглядеть так:

Для номера 926 26 26 маска будет выглядеть ABC BC BC
Для номера 223 32 32 маска будет выглядеть  AAB BA BA

Можно ли это сделать силами excel?
Уже 2 дня ищу в гугле, но ничего не выходит, т.к. все возможные варианты формулировок для поиска выдают абсолютно ненужные результаты. :(
 
Цитата
Каждому знаку может быть присвоена буква:
Цитата
Для номера 234-56-78 будет выглядеть аналогично: ABC DE FG
Почему?
Логичнее
Для номера 234-56-78 будет выглядеть аналогично: BCD EF GH
 
Смотря с какой стороны смотреть)) Здесь привязка идет не к самому числу, а к порядковому номеру.
 
iQuote,
Код
Function NumToChar(MyRange As Range)
Dim i As Long, Iter As Long
Dim ya As Variant
Dim NewNum As String

Const MyDict As String = "ABCDEFG" 'Справочник символов

If MyRange.Count > 1 Then NumToChar = CVErr(xlErrRef): Exit Function
If Len(MyRange) = 0 Or Len(MyRange) > Len(MyDict) Or Not IsNumeric(MyRange) Then NumToChar = CVErr(xlErrValue): Exit Function

ReDim MyArray(1 To Len(MyRange))
Iter = 1
For i = 1 To Len(MyRange)
    ya = Application.Match(CInt(Mid(MyRange, i, 1)), MyArray, 0)
    If Not IsError(ya) Then
            NewNum = NewNum & Mid(MyDict, ya, 1)
        Else
            MyArray(Iter) = CInt(Mid(MyRange, i, 1))
            NewNum = NewNum & Mid(MyDict, Iter, 1)
            Iter = Iter + 1
    End If
Next

NumToChar = NewNum

End Function
Изменено: Polkilo - 06.02.2020 18:18:15 (Добавил проверку на число и диапазон)
 
Десять подстановок с поиском.
Хотя это
Цитата
iQuote написал:
Для номера 223 32 32 маска будет выглядеть  AAB BA BA
противоречит условию.
по нему должно быть AAC CA CA

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1;0;IFERROR(CHAR(64+FIND(0;SUBSTITUTE(SUBSTITUTE(A1;"-";"");" ";)));));1;IFERROR(CHAR(64+FIND(1;SUBSTITUTE(SUBSTITUTE(A1;"-";"");" ";)));));2;IFERROR(CHAR(64+FIND(2;SUBSTITUTE(SUBSTITUTE(A1;"-";"");" ";)));));3;IFERROR(CHAR(64+FIND(3;SUBSTITUTE(SUBSTITUTE(A1;"-";"");" ";)));));4;IFERROR(CHAR(64+FIND(4;SUBSTITUTE(SUBSTITUTE(A1;"-";"");" ";)));));5;IFERROR(CHAR(64+FIND(5;SUBSTITUTE(SUBSTITUTE(A1;"-";"");" ";)));));6;IFERROR(CHAR(64+FIND(6;SUBSTITUTE(SUBSTITUTE(A1;"-";"");" ";)));));7;IFERROR(CHAR(64+FIND(7;SUBSTITUTE(SUBSTITUTE(A1;"-";"");" ";)));));8;IFERROR(CHAR(64+FIND(8;SUBSTITUTE(SUBSTITUTE(A1;"-";"");" ";)));));9;IFERROR(CHAR(64+FIND(9;SUBSTITUTE(SUBSTITUTE(A1;"-";"");" ";)));))
Изменено: БМВ - 06.02.2020 20:07:15
По вопросам из тем форума, личку не читаю.
 
Доброе время суток.
Цитата
Polkilo написал:
Len(MyRange) > Len(MyDict)
Не слишком ли сурово? А если формат входа
Цитата
iQuote написал:
234-56-78
Цитата
БМВ написал:
противоречит условию.
Привет, Михаил.
Где?
Цитата
iQuote написал:
Здесь привязка идет не к самому числу, а к порядковому номеру.
22 имеют один и тот же порядковый номер появления => A. 3 второй номер явления => B :)
 
Андрей VG,  Андрей, привет.
Ну это как читать 1 цифра - A , означает первая цифра  , для меня 3я цифра, эта та которая идет после 2й и перед 4й, а не та которая идет после всех повторений первой.
Изменено: БМВ - 06.02.2020 22:30:08
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Ну это как читать
Читать как сказано, а не как лучше видится. :)   Интересно, это темы с одного заведения?
 
Здравствуйте, коллеги! В норматив Михаила не уложился.
Код
Function DigitsToChars(ByVal s As String)
  Dim i As Long, j As Long, n As Long, s2 As String, arr(0 To 9) As Long
  For n = 1 To Len(s)
    s2 = Mid(s, n, 1)
    If s2 Like "#" Then
      i = CLng(s2)
      If arr(i) = 0 Then
        j = j + 1
        arr(i) = j
      End If
      s = Replace(s, s2, Mid("ABCDEFGHIJ", arr(i), 1))
    End If
  Next n
  DigitsToChars = s
End Function
Изменено: sokol92 - 06.02.2020 20:29:04
Владимир
 
Цитата
sokol92 написал:
В норматив Михаила не уложился.
Таже фигня  :D
Код
Function DigitsToChars(ByVal s As String)
  Dim n As Long, a As Integer
  a = Asc("A")-1
  s = Replace(s, Mid(s, 1, 1), Chr(a))
  For n = 2 To Len(s)
    If Mid(s, n, 1) Like "#" Then
        a = a + 1
        s = Replace(s, Mid(s, n, 1), Chr(a))
    End If
 Next
  DigitsToChars = s
End Function

ну разве что еще -1  :D
Код
Function DigitsToChars(ByVal s As String)
  Dim n As Long, a As Integer
  a = Asc("A")
  For n = 1 To Len(s)
    If Mid(s, n, 1) Like "#" Then
        a = a + 1
        s = Replace(s, Mid(s, n, 1), Chr(a))
    End If
 Next
 DigitsToChars = s
End Function
Изменено: БМВ - 07.02.2020 13:02:28
По вопросам из тем форума, личку не читаю.
 
PQ:
Скрытый текст
или даже так (мало ли номера в итоге станут десятизначными):
Скрытый текст
Изменено: buchlotnik - 07.02.2020 15:32:56
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
Не слишком ли сурово? А если формат входа
Не спорю, но без примера пытаться угадать формат "семизначных "чисел"" лениво.
Было сказано про число. А тема про приведение номера к единому формату на форуме уже есть)

Последнее решение Вами и было предложено
Изменено: Polkilo - 07.02.2020 08:29:48
Страницы: 1
Наверх