1

在我工作的地方,我们会保留一份我们发现有损坏的车辆的清单。这些损坏代码有几种变化,我想在 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

我试图制作一个无论我如何调用它都无法正常工作的函数。如果我可以对这些数字进行基本格式化,我很可能会从那里弄清楚。

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

4

3 回答 3

2

您可以使用 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
于 2013-10-30T21:18:54.193 回答
1

要回答您未提出的问题:

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

  1. Range("A:A")并且Range("B:B")都选择整行,但 test变量一次只能保存一个单元格值的内容。如果您将代码限制在一个单元格中, Range("A1").value例如,使用您编写的代码将起作用。
  2. 您似乎使用了与标准不同的引号,这使编译器误以为"Sheet1", "A:A". 等是变量。

将范围定义为一个单元格并替换引号后,您的代码将 Sheet1 上的单元格 A1 的值移动到 Sheet2 上的单元格 B1:

Sub testThis()

Dim Test
Test = Worksheets("Sheet1").Range("A1").value
Worksheets("Sheet2").Range("B1").value = Test

End Sub

如果您想处理 Sheet1 上的整个 A 列并将这些值放入 Sheet2 上的 B 列,您可以使用循环,它只是在一系列值上重复一个操作。为此,我定义了两个范围。一个跟踪 Sheet1 A 列上的单元格,另一个跟踪 Sheet2 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
于 2013-10-30T21:53:53.333 回答
1

轻度测试:

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
于 2013-10-30T21:20:45.633 回答