任何数字加+2(VBA)

时间:2018-08-28 15:47:30

标签: vba excel-vba

我正在编写一个VBA代码,以将+2添加到该函数中放置的任何数字字符串中。

它工作正常,直到达到6和7,然后它破裂。我真的不知道为什么会这样。

如果您想知道为什么要这样做,这是加密算法的一部分,它专门用于加密字符串中的数字。

我的代码是:

Sub AddNumbers()

Dim Nos As String
Dim AddNo As String
Dim Found As Boolean
Dim Split()

Nos = "0-1-2-3-4-5-6-7-8-9-10"
Sheets("Sheet1").Range("U2").Value = Nos

Length = Len(Nos)
ReDim Split(Length)

For i = 1 To Length
    Found = False
    Split(i) = Mid(Nos, i, 1)
    For O = 48 To 55
        If Split(i) = Chr(O) Then
            Split(i) = Chr(O + 2)
            Found = True
            Exit For
        End If
    Next O
    If Split(i) = Chr(56) Then
        Split(i) = Chr(48)
    ElseIf Split(i) = Chr(57) Then
        Split(i) = Chr(49)
    End If
Next i

AddNo = Join(Split, "")

Sheets("Sheet1").Range("U3").Value = AddNo

End Sub

我真的很想知道为什么它会在6和7时突破。

4 个答案:

答案 0 :(得分:3)

使用实际功能Split

Sub AddNumbers()

Dim Nos As String
Dim AddNo As String
Dim Found As Boolean
Dim SplitStr() As String

Nos = "0-1-2-3-4-5-6-7-8-9-10"
Sheets("Sheet1").Range("U2").Value = Nos

SplitStr = Split(Nos, "-")

Dim i As Long
For i = LBound(SplitStr) To UBound(SplitStr)
    Dim vlue As String
    vlue = StrConv(SplitStr(i), vbUnicode)
    Dim substr() As String
    substr = Split(Left(vlue, Len(vlue) - 1), vbNullChar)
    Dim j As Long
    For j = LBound(substr) To UBound(substr)
        Select Case substr(j)
            Case 8
                substr(j) = 0
            Case 9
                substr(j) = 1
            Case Else
                substr(j) = substr(j) + 2
        End Select
    Next j
    SplitStr(i) = Join(substr, "")
Next i


AddNo = Join(SplitStr, "-")

Sheets("Sheet1").Range("U3").Value = AddNo


End Sub

enter image description here

答案 1 :(得分:3)

花点时间,但您正在加倍。

看看你的循环。当您遇到6(Char(54))时,将2加8(Char(56))。

但是,循环之后,您将再次测试相同的Split(i)。 6和7的字符数现在分别为56和57-因此您要向其添加另外2个字符。

If Split(i) = Chr(56) And Found = False Then
    Split(i) = Chr(48)
ElseIf Split(i) = Chr(57) And Found = False Then
    Split(i) = Chr(49)
End If

答案 2 :(得分:0)

总体问题是您将Chr码用于数字而非实际数字。此方法仅返回1位数字,因为Chr()引用单个字符的列表。

您将需要使用Split(mySplit = Split(Nos,“-”))返回每个数字并使用它们。

    If Split(i) = Chr(56) Then
        Split(i) = Chr(48)
    ElseIf Split(i) = Chr(57) Then
        Split(i) = Chr(49)
    End If

让我感到困惑。您是说值是“ 8”更改为“ 0”,如果值是“ 9”更改为“ 1”

答案 3 :(得分:0)

这是另一种方法:

Sub AddNumbers()

    Dim Nos As String, Nos2 As String
    Dim NumSplit As Variant
    Dim Num As Variant
    Dim tmp As String
    Dim i As Long


    Nos = "0-1-2-3-4-5-6-7-8-9-10"
    Sheets("Sheet1").Range("U2").Value = Nos

    NumSplit = Split(Nos, "-")

    For Each Num In NumSplit
        For i = 1 To Len(Num)
            tmp = tmp & Mid(Num, i, 1) + 2
        Next i
        Nos2 = Nos2 & tmp & "-"
        tmp = ""
    Next Num
    Nos2 = Left(Nos2, Len(Nos2) - 1)

    Sheets("Sheet1").Range("U3").Value = Nos2

End Sub  

有点混乱,但是显示了将原始数组拆分为单独数字的基本思想。
For....Next循环内的For...Each循环可处理超过一位(给出32)的任何数字。