Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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

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实现Excel格式_Vba_Excel_Formatting - Fatal编程技术网

用VBA实现Excel格式

用VBA实现Excel格式,vba,excel,formatting,Vba,Excel,Formatting,在我工作的地方,我们保存着一份我们发现有损坏的车辆的清单。这些损坏代码有几个变体,我想在excel中设置一个VBA脚本,以自动更改单元格内容的正确格式,但我并不真正使用VBA脚本,excel数据对象让我感到困惑 下面是我想要的几个例子 06071 – VBA Function – 06.07.1 031211 – VBA Function- 03.12.1(1) 0409237-VBA Function – 04.09.2(3,7) 040912 030713 –VBA Function – 0

在我工作的地方,我们保存着一份我们发现有损坏的车辆的清单。这些损坏代码有几个变体,我想在excel中设置一个VBA脚本,以自动更改单元格内容的正确格式,但我并不真正使用VBA脚本,excel数据对象让我感到困惑

下面是我想要的几个例子

06071 – VBA Function – 06.07.1
031211 – VBA Function- 03.12.1(1)
0409237-VBA Function – 04.09.2(3,7)
040912 030713 –VBA Function – 04.09.1(2) 03.07.1(3) (some vehicles have multiple damages)
基本上,长度超过5的任何数字都会将第6位之后的任何数字放入括号中,用逗号分隔

我可以用任何其他语言来做这件事,只是用我遇到的一个又一个问题的所有随机Excel资料

我尝试什么似乎无关紧要,我的代码在我过去取得任何进展之前就出现了漏洞

Dim test
test = Worksheets(“Sheet1”).Range(“A:A”).Value
Worksheets(“Sheet2”).Range(“B:B”).Value=test
我试图创建一个函数,但不管我如何调用它,它最终都无法工作。如果我能对这些数字进行基本的格式化,我很可能会从中找到答案


感谢你们能给我的任何帮助

你们可以用UDF(用户定义函数)实现这一点:在VBA的新模块中放置以下代码:

Function ConvertIt(rng As Range) As String
    Dim varStr As Variant
    Dim strSource As String, strResult As String
    Dim i As Integer

    For Each varStr In Split(Trim(rng.Value), " ")
        strSource = CStr(varStr)
        strResult = strResult & _
            Mid(strSource, 1, 2) & "." & _
            Mid(strSource, 3, 2) & "." & _
            Mid(strSource, 5, 1)
        If Len(strSource) > 5 Then
            strResult = strResult & "("
            For i = 6 To Len(strSource)
                strResult = strResult & Mid(strSource, i, 1) & ","
            Next i
            strResult = Left(strResult, Len(strResult) - 1) & ")"
        End If
        strResult = strResult & " "
    Next
    ConvertIt = Left(strResult, Len(strResult) - 1)
End Function
假设您的数据在工作表的A列中,将此公式放在B2:
=ConvertIt(A2)
中,然后将其复制下来。完成了

如果要一次性转换单元格并替换源,请使用以下代码:

Sub ConvertAll()
    Dim rng As Range
    For Each rng In Range("A1:A100")
        rng.Value = ConvertIt(rng)
    Next
End Sub

可以使用UDF(用户定义函数)执行此操作:将以下代码放置在VBA中的新模块中:

Function ConvertIt(rng As Range) As String
    Dim varStr As Variant
    Dim strSource As String, strResult As String
    Dim i As Integer

    For Each varStr In Split(Trim(rng.Value), " ")
        strSource = CStr(varStr)
        strResult = strResult & _
            Mid(strSource, 1, 2) & "." & _
            Mid(strSource, 3, 2) & "." & _
            Mid(strSource, 5, 1)
        If Len(strSource) > 5 Then
            strResult = strResult & "("
            For i = 6 To Len(strSource)
                strResult = strResult & Mid(strSource, i, 1) & ","
            Next i
            strResult = Left(strResult, Len(strResult) - 1) & ")"
        End If
        strResult = strResult & " "
    Next
    ConvertIt = Left(strResult, Len(strResult) - 1)
End Function
假设您的数据在工作表的A列中,将此公式放在B2:
=ConvertIt(A2)
中,然后将其复制下来。完成了

如果要一次性转换单元格并替换源,请使用以下代码:

Sub ConvertAll()
    Dim rng As Range
    For Each rng In Range("A1:A100")
        rng.Value = ConvertIt(rng)
    Next
End Sub
轻度测试:

Function FormatStuff(v)
Dim i As Long, c As String, v2 As String, num As String
Dim num2 As String, x As Long

    v2 = v
    v = v & " "
            For i = 1 To Len(v)
        c = Mid(v, i, 1)
        If c Like "#" Then
            num = num & c
        Else
            If num <> "" And Len(num) >= 5 Then
                num2 = Left(num, 2) & "." & Mid(num, 3, 2) & _
                       "." & Mid(num, 5,1)

                If Len(num) > 5 Then
                    num2 = num2 & "("
                    For x = 6 To Len(num)
                        num2 = num2 & IIf(x > 6, ",", "") & Mid(num, x, 1)
                    Next x
                    num2 = num2 & ")"
                End If

                v2 = Replace(v2, num, num2)
            End If
            num = ""
        End If
    Next i
    FormatStuff = v2
End Function
函数格式(v)
Dim i为长,c为字符串,v2为字符串,num为字符串
尺寸num2为字符串,x为长度
v2=v
v=v&“
对于i=1到Len(v)
c=中间(v,i,1)
如果c喜欢“#”,那么
num=num&c
其他的
如果num“”和Len(num)>=5,则
num2=左(num,2)&“&Mid(num,3,2)&_
“&中间(数字,5,1)
如果Len(num)>5,则
num2=num2&“
对于x=6到Len(num)
num2=num2&IIf(x>6,“,”)&Mid(num,x,1)
下一个x
num2=num2&“.”
如果结束
v2=替换(v2,num,num2)
如果结束
num=“”
如果结束
接下来我
FormatStuff=v2
端函数
轻度测试:

Function FormatStuff(v)
Dim i As Long, c As String, v2 As String, num As String
Dim num2 As String, x As Long

    v2 = v
    v = v & " "
            For i = 1 To Len(v)
        c = Mid(v, i, 1)
        If c Like "#" Then
            num = num & c
        Else
            If num <> "" And Len(num) >= 5 Then
                num2 = Left(num, 2) & "." & Mid(num, 3, 2) & _
                       "." & Mid(num, 5,1)

                If Len(num) > 5 Then
                    num2 = num2 & "("
                    For x = 6 To Len(num)
                        num2 = num2 & IIf(x > 6, ",", "") & Mid(num, x, 1)
                    Next x
                    num2 = num2 & ")"
                End If

                v2 = Replace(v2, num, num2)
            End If
            num = ""
        End If
    Next i
    FormatStuff = v2
End Function
函数格式(v)
Dim i为长,c为字符串,v2为字符串,num为字符串
尺寸num2为字符串,x为长度
v2=v
v=v&“
对于i=1到Len(v)
c=中间(v,i,1)
如果c喜欢“#”,那么
num=num&c
其他的
如果num“”和Len(num)>=5,则
num2=左(num,2)&“&Mid(num,3,2)&_
“&中间(数字,5,1)
如果Len(num)>5,则
num2=num2&“
对于x=6到Len(num)
num2=num2&IIf(x>6,“,”)&Mid(num,x,1)
下一个x
num2=num2&“.”
如果结束
v2=替换(v2,num,num2)
如果结束
num=“”
如果结束
接下来我
FormatStuff=v2
端函数

要回答您未询问的问题:

您提供的代码不起作用有两个原因

  • Range(“A:A”)
    Range(“B:B”)
    都选择整行,但是
    test
    变量一次只能保存一个单元格值的内容。 如果将代码限制为一个单元格,请使用
    范围(“A1”).value
    ,例如,您编写的代码将 工作
  • 似乎您使用的引号与 标准,这会使编译器误认为
    “Sheet1”
    “A:A”
    。等等都是变量
  • 将范围定义为一个单元格,并替换引号后,代码会将表1上单元格A1的值移动到表2上的单元格B1:

    Sub testThis()
    
    Dim Test
    Test = Worksheets("Sheet1").Range("A1").value
    Worksheets("Sheet2").Range("B1").value = Test
    
    End Sub
    
    如果您想在Sheet1上计算整个A列,并将这些值放入Sheet2上的B列,您可以使用循环,它只是在一系列值上重复一个操作。为此,我定义了两个范围。一个用于跟踪表1 A列上的单元格,另一个用于跟踪表2 B列上的单元格。我假设A列中的数据没有中断:

    Sub testThat()
    
    Dim CellinColumnA As Range
        Set CellinColumnA = Worksheets("Sheet1").Range("A1")
    
    Dim CellinColumnB As Range
        Set CellinColumnB = Worksheets("Sheet2").Range("B1")
    
    Do While CellinColumnA.value <> ""
        CellinColumnB.value = CellinColumnA.value
        Set CellinColumnA = CellinColumnA.Offset(1, 0)
        Set CellinColumnB = CellinColumnB.Offset(1, 0)
    Loop
    
    End Sub
    
    subtestthat()
    暗淡的CellinColumnA As系列
    设置CellinColumnA=工作表(“表1”)。范围(“A1”)
    Dim CellinColumnB As范围
    设置CellinColumnB=工作表(“表2”)。范围(“B1”)
    当CellinColumnA.value“”时执行此操作
    CellinColumnB.value=CellinColumnA.value
    设置CellinColumnA=CellinColumnA.Offset(1,0)
    设置CellinColumnB=CellinColumnB.Offset(1,0)
    环
    端接头
    
    要回答您未询问的问题:

    您提供的代码不起作用有两个原因

  • Range(“A:A”)
    Range(“B:B”)
    都选择整行,但是
    test
    变量一次只能保存一个单元格值的内容。 如果将代码限制为一个单元格,请使用
    范围(“A1”).value
    ,例如,您编写的代码将 工作
  • 似乎您使用的引号与 标准,这会使编译器误认为
    “Sheet1”
    “A:A”
    。等等都是变量
  • 将范围定义为一个单元格,并替换引号后,代码会将表1上单元格A1的值移动到表2上的单元格B1:

    Sub testThis()
    
    Dim Test
    Test = Worksheets("Sheet1").Range("A1").value
    Worksheets("Sheet2").Range("B1").value = Test
    
    End Sub
    
    如果您想在Sheet1上计算整个A列,并将这些值放入Sheet2上的B列,您可以使用循环,它只是在一系列值上重复一个操作。为此,我定义了两个范围。一个用来跟踪表1列A上的单元格,另一个用来跟踪表2列B上的单元格。我假设我