始终打印出特定字符串后的6位数字

时间:2015-06-30 16:49:29

标签: vba excel-vba string-length excel

我有许多字符串,其名称为" TL - "后跟6位数字(即TL-000456,TL-000598)。有时它会打印出少于6位的数字(即TL-09872,TL-345,TL-02)。

我希望我的代码在" TL之后添加零 - "直到它包含6位数字。

Start:           Output:
TL-000456   ->   TL-000456
TL-000598   ->   TL-000598
TL-09872    ->   TL-009872
TL-345      ->   TL-000345
TL-02       ->   TL-000002

如果可能的话,我希望它能做到这一点,即使字符串中包含空格(即" TL - "," TL - "),6总是会抓住数字。

TL - 987    ->   TL-000987
TL- 839     ->   TL-000839

我的代码中有一个功能可以修剪" TL"在分号或逗号之前得到所有内容的值,所以理想情况下代码会进入那里。想法?

当前的尝试给予评论:

代码从标题下获取值" CUTTING TOOL"在ws(工作表)中将其打印到StartSht(带代码的工作簿)

(1)在有效过程或参数

中的Trim行返回错误
With WB
  For Each ws In .Worksheets

Dim sIn, sOut As String
    'find CUTTING TOOL on the source sheet
    If Not ws.Range("A1:M15").Find(What:="CUTTING TOOL", LookAt:=xlWhole, LookIn:=xlValues) Is Nothing Then
    Set hc = ws.Range("A1:M15").Find(What:="CUTTING TOOL", LookAt:=xlWhole, LookIn:=xlValues)
        Set dict = GetValues(hc.Offset(1, 0), "SplitMe")
        If dict.count > 0 Then
        'add the values to the workbook, column 3
            Set d = StartSht.Cells(Rows.count, hc2.Column).End(xlUp).Offset(1, 0)
            d.Resize(dict.count, 1).Value = Application.Transpose(dict.items)


            'trim values **implement new code here**
            With StartSht
                Trim (Left(sIn, InStr(1, sIn, "-", vbTextCompare) - 1)) & "-" & Right("000000" & Trim(Right(sIn, Len(sIn) - InStr(1, sIn, "-", vbTextCompare))), 6)
            End With

(2)完全运行但不更改值

With WB
  For Each ws In .Worksheets
        'find CUTTING TOOL on the source sheet
        If Not ws.Range("A1:M15").Find(What:="CUTTING TOOL", LookAt:=xlWhole, LookIn:=xlValues) Is Nothing Then
        Set hc = ws.Range("A1:M15").Find(What:="CUTTING TOOL", LookAt:=xlWhole, LookIn:=xlValues)
            Set dict = GetValues(hc.Offset(1, 0), "SplitMe")
            If dict.count > 0 Then
            'add the values to the master list, column 3
                Set d = StartSht.Cells(Rows.count, hc2.Column).End(xlUp).Offset(1, 0)
                d.Resize(dict.count, 1).Value = Application.Transpose(dict.items)

                Dim str As String, ret As String, tmp As String, j As Integer
                With StartSht
                For j = 1 To Len(str)
                    tmp = Mid(str, j, 1)
                    If IsNumeric(tmp) Then ret = ret + tmp
                Next j

                For j = Len(ret) + 1 To 6
                    ret = "0" & ret
                Next

                Debug.Print ret


                End With

StartSht Excel文档如下所示

      A            B                C                  D
1    TDS        HOLDER        CUTTING TOOL        File Name
2   TDS-1         H1            TL-000289          TDS-1.xlsx
3   TDS-2         H2            TL-000274          TDS-2.xlsx
4   TDS-3         H3            TL-0002            TDS-3.xlsx
5   TDS-4         H4            TL-0343            TDS-4.xlsx
在"切割工具&#34>之后我下面的代码,它看起来像代码下面的输出,因为这是我抓取

信息的第一部分

CODE:

            With WB
                For Each ws In .Worksheets
                'find CUTTING TOOL on the source sheet
                If Not ws.Range("A1:M15").Find(What:="CUTTING TOOL", LookAt:=xlWhole, LookIn:=xlValues) Is Nothing Then
                Set hc = ws.Range("A1:M15").Find(What:="CUTTING TOOL", LookAt:=xlWhole, LookIn:=xlValues)
                    Set dict = GetValues(hc.Offset(1, 0), "SplitMe")
                    If dict.count > 0 Then
                    'add the values to the master list, column 3
                        Set d = StartSht.Cells(Rows.count, hc2.Column).End(xlUp).Offset(1, 0)
                        d.Resize(dict.count, 1).Value = Application.Transpose(dict.items)

StartSht的输出:

      A            B                C                  D
1    TDS        HOLDER        CUTTING TOOL        File Name
2                              TL-000289          
3                              TL-000274          
4                              TL-0002            
5                              TL-0343     

我想添加一行str = StartSht.Range(''在这里设置正确的范围'')然后编码以使StartSht看起来像这样

      A            B                C                  D
1    TDS        HOLDER        CUTTING TOOL        File Name
2                              TL-000289          
3                              TL-000274          
4                              TL-000002            
5                              TL-000343     

6 个答案:

答案 0 :(得分:3)

有一种方法可以使用excel公式:

="TL-" & TEXT(TRIM(RIGHT(A1,LEN(A1)-FIND("-",A1,1))),"000000")

答案 1 :(得分:2)

扩展Orphid's anwswer以包括6位数字:

Sub Test()
    Dim str as string, ret as string, tmp as string, i as integer, j as integer

    for j = 2 to StartSht.Range("C2").End(xlDown).Row            
        ret = ""
        str = StartSht.Range("C" & j).Value
            for i = 1 to len(str)
                  tmp = mid(str, i, 1)
                  if IsNumeric(tmp) then ret = ret + tmp
            next i

            For i = Len(ret) + 1 To 6
                ret = "0" & ret
            Next
            ret = "TL-" & ret
            StartSht.Range("C" & j).Value = ret
    next j
End Sub

这将在原稿旁边的B列写“ret”。您正在处理的工作表在运行时需要处于活动状态,因为您可以看到我没有指定要使用哪个工作表。如果有必要,你可以自己做。我假设它只需要在1个工作簿的1个工作表上完成。如果我错了,请告诉我。

答案 2 :(得分:2)

到目前为止你尝试了什么?你有任何代码可以告诉我们吗?

这应该是一个起点,当然,你需要去除空格并遍历整个文件。

Public Sub PaddingTest()
Dim PaddingArray() As String
Dim PaddingVar As String
PaddingArray() = Split(Range("A1").Value, "-", 2, vbTextCompare)
PaddingVar = PaddingArray(1)
While Len(PaddingVar) < 6
    PaddingVar = "0" & PaddingVar
Wend
Range("A2").Value = PaddingArray(0) & "-" & PaddingVar
End Sub

msdn.microsoft.com使用Split命令

答案 3 :(得分:1)

为了提取数字,听起来你想要的是一个类似于\ d {1,6}的正则表达式。但是,我从来没有真正喜欢在VBA中使用正则表达式,所以另一种提取数字的方法是:

Sub Test()
    Dim str as string, ret as string, tmp as string, i as integer
    str = "T- 087652" 
    for i = 1 to len(str) 'vba strings are 1-indexed
        tmp = mid(str, i, 1) 'get the character at position i
        if IsNumeric(tmp) then ret = ret + temp 'if numeric, add to the return value
    next i
    debug.print ret 'print the resulting number to the console. To convert to a number, simply assign to a variable typed as "long"
End Sub

这样做是通过字符串的简单前向循环,提取IsNumeric的每个字符。它应该忽略字符串中出现的空格,但每个字符串不应超过一个整数。

要格式化数字,您可能只想pad the string

答案 4 :(得分:1)

将它放在一个新模块中:

Option Explicit

Public Function getDigits(strInput As String) As String

    Dim strOutput As String
    Dim strCharacter As String
    Dim i As Integer

    strOutput = ""

    For i = 1 To Len(strInput)
        strCharacter = Mid(strInput, i, 1)
        If strCharacter >= "0" And strCharacter <= "9" Then
            strOutput = strOutput & strCharacter
        End If
    Next

    getDigits = strOutput

End Function

Public Function addZeros(strInput As String) As String

    Dim intCurrentLength As Integer
    Dim strNumber As String
    Dim i As Integer

    strNumber = getDigits(strInput)
    intCurrentLength = Len(strNumber)

    If intCurrentLength < 6 Then

        For i = 1 To 6 - intCurrentLength
            strNumber = "0" & strNumber
        Next i

    End If

    addZeros = "TL-" & strNumber

End Function

然后只需运行addZeros([此处为您的字符串])即可转换为所需的格式。

(对于此问题的评论中的user4888;如何检查'TL'是否在字符串中的示例。这将检查单元格A1到A10,并在B列的相应单元格中填充1或0关于单元格中是否存在“TL”)

Private Sub TLcheck()

    Set wb = ThisWorkbook
    Set ws = wb.ActiveSheet

    For i = 1 To 10
        ws.Cells(i, 2) = InStr(1, ws.Cells(i, 1), "TL")
    Next i

End Sub

答案 5 :(得分:1)

这是一个班轮。我在抢夺之前和之后抓取数据,修剪它们以删除空格,并添加连字符和额外的0。

Sub splitAddZeros()
    Dim sIn, sOut As String

    sIn = "TL - 987"

    out = Trim(Left(sIn, InStr(1, sIn, "-", vbTextCompare) - 1)) & "-" & Right("000000" & Trim(Right(sIn, Len(sIn) - InStr(1, sIn, "-", vbTextCompare))), 6)

    Debug.Print out
End Sub