Как я могу добавить цифры в буквенно-цифровое значение?(Пример: "ABC" +1 = "ABD") - PullRequest
0 голосов
/ 14 декабря 2018

Если то, что я спросил в названии, невозможно, я объясню, что мне нужно, и, возможно, есть другие способы приблизиться к нему.

У меня есть список, содержащий либо значения, либо диапазон значений, разделенных "-", см. ниже:

9565
9570
9626 - 9627
A015 - A020
A040 - A042
A070 - A072
A078 - A082
A095 - A097
GGAA - GGZZ

Я хочу создать макрос, который циклически перебирает строки и" разбивает "диапазоны на отдельные значения.Используя первые 4 строки моего примера, получим результат:

9565
9570
9626
9627
A015
A016
A017
A018
A019
A020
...

К сожалению, они не всегда являются числами, поэтому я не могу просто поместить диапазон в цикл и добавить +1 до предыдущего значения до конца цикла.

Любые идеи?

Заранее большое спасибо и извините за мои ошибки в английском.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Это заняло у меня целый день, но мне действительно удалось это сделать!

Спасибо @Harassed Dad!Я адаптировал ваш код, и результат выглядит следующим образом:

Функция:

Function WF_NEXT_CHAR(s As String) As String

    Dim ASCII   As Byte
    Dim i       As Integer

    s = UCase(s)
    ASCII = Asc(Right(s, 1))

    If s = String(Len(s), "Z") Then
        WF_NEXT_CHAR = "#"
            Else
        Select Case ASCII
            Case 57                     'Wrap Number at 9
                ASCII = 65
            Case 48 To 56, 65 To 89     '0 to 8 and A to Y
                ASCII = ASCII + 1
            Case 90                     'Wrap Char at Z
                ASCII = 49
                For i = Len(s) To 1 Step -1
                    If Mid(s, i, 1) = "Z" Then
                        WF_NEXT_CHAR = Left(s, i - 1) & "0" & Right(WF_NEXT_CHAR, Len(s) - i)
                            Else
                        WF_NEXT_CHAR = Left(s, i - 1) & WF_NEXT_CHAR(Mid(s, i, 1)) & Right(WF_NEXT_CHAR, Len(s) - i)
                        Exit For
                    End If
                Next
        End Select
        If Len(s) = 1 Then WF_NEXT_CHAR = Chr(ASCII)
        If WF_NEXT_CHAR = "" Then WF_NEXT_CHAR = Left(s, Len(s) - 1) & Chr(ASCII)
    End If

End Function

Sub (предполагается, что диапазоны находятся в столбце "A "):

Sub UHUUUUL_xD()

Const Del   As String = " - "
Dim r       As Long
Dim Rng     As Variant
Dim i       As String

For r = 1 To Cells(Rows.Count, 1).End(xlUp).Row
    If InStr(1, Cells(r, 1), Del) > 0 Then
        Rng = Split(Cells(r, 1), Del)
        Cells(Cells(Rows.Count, 2).End(xlUp).Row + 1, 2) = IIf(IsNumeric(Rng(0)), "'", "") & Rng(0)
        While i <> "#" And i <> Rng(1)
            i = WF_NEXT_CHAR(Cells(Rows.Count, 2).End(xlUp))
            Cells(Cells(Rows.Count, 2).End(xlUp).Row + 1, 2) = i
        Wend
    End If
Next

End Sub
0 голосов
/ 14 декабря 2018

Вам понадобится это в какой-то момент - он возвращает следующий текстовый символ в последовательности, заключая в Z. Он принимает только верхний регистр, и я не потрудился обрабатывать крайние случаи

Public Function NextChar(s As String) As String
Dim x As Long
Dim answer As String
Dim flag As Boolean
x = Asc(Right(s, 1))
Select Case x
    Case 65 To 89 'A to Y
        x = x + 1
    Case 90 'wrap at Z
        x = 65
        flag = True
    Case Else '?

End Select
Select Case Len(s)
    Case 1
        If flag Then
            answer = "A" & Chr$(x)
        Else
            answer = Chr$(x)
        End If
    Case 2
        If flag Then
            answer = NextChar(Left(s, 1)) & Chr$(x)
        Else
            answer = Left(s, 1) & Chr$(x)
        End If
    Case Else
    '???
End Select
NextChar = answer

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...