Substract / Deduct 1 из строки VBA Excel - PullRequest
0 голосов
/ 23 марта 2020

У меня есть набор кодов (C01.0001, S009.1002, A0056.0102), единственный параметр, который должен быть истинным всегда, - это то, что после точки стоят четыре числа. Моя цель - вычесть 1 (C01.0101-1 = C01.0100, S009.0002-1 = S009.0001 и др. c.). Я пробовал разные способы решить эту проблему, но я застрял. Помоги пожалуйста!! Вот что у меня получилось:

Sub Subsctruct_1()
    Dim myCode As String, myResult As String
'    Range("A1").Value = "C01.0002"

    myCode = Range("A1").Value
    myResult = Mid(myCode, Len(myCode) - 4, 5) - 1

    Debug.Print myResult '-0.9999
End Sub

Это решение, благодаря помощи Брайана М. Стаффорда:

Sub Get_Code()
    Dim Arr1 As Variant, ResNewCode As Variant
    Dim i As Long, LastRow As Long
    Dim EnvNm As String

    LastRow = ShStart.Range("A" & Rows.Count).End(xlUp).Row
    Arr1 = ShStart.Range("A2:A" & LastRow).Value
    ResNewCode = ShStart.Range("F2:F" & LastRow).Value

    For i = 1 To UBound(Arr1)
        If Arr1(i, 1) <> "" Then
            EnvNm = Subtract1(Arr1(i, 1))
            ResNewCode(i, 1) = EnvNm
        End If
    Next i

ShStart.Range("F2").Resize(UBound(ResNewCode, 1), 1).Value = ResNewCode
End Sub

Public Function Subtract1(ByVal Code As String) As String
'Brian M Stafford's Solution ===> Thanks!

   Dim v As Variant

   v = Split(Code, ".")
   Subtract1 = v(0) & "." & Format(Val(v(1)) - 1, "0000")
End Function

Ответы [ 4 ]

1 голос
/ 23 марта 2020

Вот еще одно решение. У него всегда четыре цифры после точки:

Option Explicit

Private Sub Command1_Click()
   MsgBox Subtract1("C01.0101")
   MsgBox Subtract1("S009.0002")
   MsgBox Subtract1("C01.0001")
   MsgBox Subtract1("C01.0100")
   MsgBox Subtract1("C01.0010")
End Sub

Private Function Subtract1(ByVal Code As String) As String
   Dim v As Variant

   v = Split(Code, ".")
   Subtract1 = v(0) & "." & Format(Val(v(1)) - 1, "0000")
End Function
1 голос
/ 23 марта 2020

Может потребоваться больше примеров, чтобы полностью понять, что вам нужно, но это сработает для ваших двух примеров

Sub x()

Dim s1 As String, s2 As String

s1 = "C01.0101"
s2 = "S009.0002"

s1 = Left(s1, Len(s1) - 1) & Val(Right(s1, 1)) - 1: MsgBox s1
s2 = Left(s2, Len(s2) - 1) & Val(Right(s2, 1)) - 1: MsgBox s2

End Sub
0 голосов
/ 23 марта 2020

Другое решение с немного большей гибкостью, если вам нужно вычесть больше чем на 1, или вам нужен другой формат чисел, например, неожиданно появятся 3 или 5-значные числа.

Option Explicit

Sub Tests()
    'Given Cases
    Debug.Print SubtractFromString("C01.1001")
    Debug.Print SubtractFromString("S009.1002")
    Debug.Print SubtractFromString("A0056.0102")
    Debug.Print SubtractFromString("I.0010")

    'Other situations which might pop up, subtract by 2
    Debug.Print SubtractFromString("S009.1002", 2)

    'Subtract by 2, with 5 digits instead of 4
    Debug.Print SubtractFromString("S009.1002", 2, "00000")
End Sub

Public Function SubtractFromString(InputValue As String, _
                                   Optional SubtractAmount As Long = 1, _
                                   Optional NumberFormat As String = "0000") As String
    Dim StringArray As Variant: StringArray = Split(InputValue, ".")
    SubtractFromString = StringArray(0) & "." & _
                         Format(CLng(StringArray(1)) - SubtractAmount, NumberFormat)
End Function
0 голосов
/ 23 марта 2020

Что-то вроде этого, называется как PopAndSubtract("00.0202.0002.0100",False), давая результат 99 или как PopAndSubtract("00.0202.0002.0100"), чтобы вернуть 00.0202.0002.99

Function PopAndSubtract(strInput As String, _
        Optional blnRebuildOuput As Boolean = True) As Variant

Dim a() As String
Dim l As Long
Dim i As Integer

a = Split(strInput, ".")

i = Len(a(UBound(a)))
l = CLng(a(UBound(a)))
l = l - 1
a(UBound(a)) = Format(l, String(i, "0"))


If Not blnRebuildOuput Then
    PopAndSubtract = l
Else
    PopAndSubtract = Join(a, ".")
End If

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