【问题标题】:Excel Formatting with VBA使用 VBA 格式化 Excel
【发布时间】:2013-10-30 20:58:42
【问题描述】:

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

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

感谢你们给我的任何帮助

【问题讨论】:

    标签: vba excel formatting


    【解决方案1】:

    您可以使用 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
    

    【讨论】:

    • 就是这样,我不希望它被保存在单独的列中,我宁愿它只是更改当前单元格中的数据。我可以通过 Sub 在单元格范围内调用此函数吗?
    • 当然:For Each rng in Range("A1:A100").Cells: rng.Value = ConvertIt(rng): Next
    • 现在我收到了一些奇怪的错误“编译错误 ByRef 参数类型不匹配”,然后它突出显示了我的 Sub 例程的声明。我讨厌 VBScript。
    • 我刚刚测试过,效果很好。看看我上面的编辑 - 你有什么不同的声明吗?
    • 太棒了!为了在多个列上执行此操作,我只需重复该过程,重命名范围? (我知道这看起来很愚蠢,但我已经为此工作了 8 个小时,无法对正在发生的事情做出正面或反面)
    【解决方案2】:

    轻度测试:

    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
    

    【讨论】:

      【解决方案3】:

      回答您未提出的问题:

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

      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
      

      【讨论】:

      • 奇怪的引号是因为我在发布之前在 Word 中输入了它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 2014-04-29
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      相关资源
      最近更新 更多