【问题标题】:Adding numbers into an alphanumeric value (Ex: "ABC" +1 = "ABD")将数字添加到字母数字值中(例如:“ABC”+1 = “ABD”)
【发布时间】:2018-12-14 11:42:26
【问题描述】:

如果我在标题中提出的问题是不可能的,我会解释我需要什么,也许还有其他方法可以解决它。

我有一个列表,其中包含以“ - ”分隔的值或值范围,见下文:

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 添加到前一个值。

有什么想法吗?

在此先感谢您对我的英语错误深表歉意。

【问题讨论】:

  • 顺便说一句,如果有其他没有 VBA 的解决方案我愿意接受,请记住我在工作中需要这个,我没有很多系统管理员权限,所以我不能实例安装外部应用程序。
  • 我们可以假设所有字符都是大写的吗?
  • 我们可以假设所有的值都是 4 个字符吗?
  • 我不会将其添加为答案,因为您可能拥有的最高字母是 XFC+1 并且它根本不处理数字 - 它只是基于关闭标题中的“ABC+1 = ABD”。使用A1 中的字母和B1 中的数字,此公式将计算 Excel 列并将所需的列数添加到其中:=LEFT(ADDRESS(1,COLUMN(INDIRECT($A$1 & 1))+$B$1,2),FIND("$",ADDRESS(1,COLUMN(INDIRECT($A$1 & 1))+$B$1,2))-1)
  • @DarrenBartrup-Cook 或=SUBSTITUTE(MID(CELL("address", OFFSET(INDIRECT(A1 & "1"), 0, 1)), 2, 99), "$1", "")

标签: excel vba loops range


【解决方案1】:

你会在某个时候需要这个 - 它按顺序返回下一个文本字符,在 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

【讨论】:

  • 将其扩展到Case 65 To 89, 48 To 56 'A to Y, 0-8Case 90, 57 'wrap at Z and 9,它甚至会接受A1 › A2A9 › BA等数字
【解决方案2】:

我花了一整天的时间,但我真的做到了!

感谢@Harassed 爸爸!我已经修改了您的代码,结果如下所示:

功能:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    相关资源
    最近更新 更多