Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 始终在特定字符串后打印出6位数字_Vba_Excel_String Length - Fatal编程技术网

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

Vba 始终在特定字符串后打印出6位数字,vba,excel,string-length,Vba,Excel,String Length,我有许多名为“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 -> T

我有许多名为“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”值,使所有内容都在分号或逗号之前,因此理想情况下代码会放在那里。想法

当前尝试给出评论:

代码从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
      A            B                C                  D
1    TDS        HOLDER        CUTTING TOOL        File Name
2                              TL-000289          
3                              TL-000274          
4                              TL-000002            
5                              TL-000343     
在我下面的“切割工具”代码之后,它看起来就像代码下面的输出,因为这是我获取信息的第一部分

代码:

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   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
      A            B                C                  D
1    TDS        HOLDER        CUTTING TOOL        File Name
2                              TL-000289          
3                              TL-000274          
4                              TL-000002            
5                              TL-000343     

对于提取数字,听起来您需要的是一个类似于\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
这样做的目的是通过字符串进行简单的正向循环,提取
为数字的每个字符。它应该忽略字符串中出现的任何空格,但每个字符串中的空格不应超过一个整数


要格式化数字,您可能只想。

将其放入新模块:

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

扩展Orphid的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份工作簿)上完成。如果我错了,请告诉我。

这是一条单行线。我正在抓取催眠前后的数据,修剪它们以删除空格,并添加连字符和额外的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

到目前为止你试过什么?你有代码给我们看吗

这应该是一个起点,当然,您需要去掉空格并循环遍历整个文件

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
公共子填充测试()
Dim PaddingArray()作为字符串
Dim PaddingVar作为字符串
PaddingArray()=拆分(范围(“A1”)。值“-”,2,vbTextCompare)
PaddingVar=PaddingArray(1)
而Len(PaddingVar)<6
PaddingVar=“0”&PaddingVar
温德
范围(“A2”)。值=填充阵列(0)&“-”和填充变量
端接头

对于Split命令的使用,有一种使用excel公式的方法:

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


这是不必要的长,但嘿。如果成功了,就成功了!是的,我在这里肯定没有考虑优化,这更多的是意识流的努力。可能有一个优点,就是VBA新手很容易理解@马克巴特勒绝对容易理解!谢谢你的回答。你介意看一看我在问题中发布的代码,并帮助我找出代码中的addZeros函数在哪里/如何实现吗?当然,我现在会设置一个电子表格,然后更新答案,检查字符串中是否有“TL”,我们可以使用InStr(1,[syour string],“TL”)有关示例,请参阅我对此答案的更新。添加到您的答案中。好办法!是的,忘了提那件事了。我已经编辑了一行代码,指出了如何填充字符串,但是考虑到问题-),您的解决方案同样符合逻辑。我已经添加了我试图在其中实现此想法的代码部分。你能看看它,告诉我我可能做错了什么,或者如何用我的代码实现你的代码吗?我不知道如何将这两者结合在一起@OrphidNice。这是堆栈溢出时的第一个+1;)我正在尝试为成千上万的“TL”字符串执行此操作。在那种情况下,我会为罪恶投入什么@Wyattshipman你不会的。这就是一个例子。实际上,你会在输入值上做一个循环,例如,对范围内的每个单元格(“A1:A100000”)…cell.offset(0,1)=Trim…next cell
我已经在我的原始问题中添加了代码,这样我就更容易理解了。我正在将代码添加到for循环中,不确定如何正确输入它。有什么建议吗@AlexPI已经在原始问题中添加了代码,尝试将您的代码与我的代码进行网格划分,但这会返回一个错误。。。知道我哪里出错了吗@wyattshipmanIf如果我尝试对成千上万的“TL”字符串执行此操作,在这种情况下,我会为
str
添加什么@DavidGM我已经编辑了上面的代码,以显示一个函数,其中它修剪值以获取分号或逗号之前的所有内容。理想情况下,我希望在该函数中设置此代码限制。这行得通吗?我已经添加了一段代码,试图在其中实现这个想法。你能看看它,告诉我我可能做错了什么,或者如何用我的代码实现你的代码吗?我用你的代码运行了它,没有错误回击,但值不会更改为六位数@DavidGMIf,如果它们不更改,会发生什么?它成功地提取了数字吗?如果你注释掉第二个循环,它不会改变什么?请发布debug.print写入的内容。哦,问题是您没有为我们使用的值分配任何内容。例如,当我们说str时,你应该给它赋值。str应该是一个类似于“T-2314”的字符串,可以从工作表中获取,也可以从现有变量中获取。在您的代码中,您可以调暗str,然后立即使用它。它还没有包含任何内容。如果要分配