【问题标题】:Excel Macro: If Column B contains 12 digits then column C equals 3?Excel 宏:如果 B 列包含 12 位数字,则 C 列等于 3?
【发布时间】:2013-10-27 23:33:58
【问题描述】:

所以,我想弄清楚如何编写一个 Excel 宏,根据 B 列中包含的数字数量,用 3 或 4 填充 C 列。

我已经上下搜索了正确的措辞,但我一直没有找到合适的措辞。

基本上,我需要宏来查看 B 列中的位数。如果有 12 位,则该数字是 UPC,如果有 13 位,则该数字是 EAN。然后,我需要使用宏来填充 C 列,其中 3 表示 UPC,4 表示 EAN。这需要针对电子表格中的整个行范围。

有人有什么想法吗?提前非常感谢!

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    你不需要使用肮脏的旧循环,试试这个(如果你有很多行会更快):

    Sub HTH()
    
        With Sheet1.Range("B1", Cells(Rows.Count, "B").End(xlUp)).Offset(, 1)
            .Formula = "=IF(LEN(TRIM(B1))=12,3,IF(LEN(TRIM(B1))=13,4,""""))"
            .Value = .Value
        End With
    
    End Sub
    

    或者使用用户定义的函数,它的优点是B列中的数据更新时会发生变化。

    最好只使用一个公式,你真的不需要 VBA。

    替代 VBA 方法(循环快速方式):

    Sub HTH()
        Dim vArray As Variant
        Dim lCnt As Long
    
        With Range("B1", Cells(Rows.Count, "B").End(xlUp))
            vArray = .Value
    
            For lCnt = 1 To UBound(vArray, 1)
                Select Case Len(Trim(vArray(lCnt, 1)))
                Case 12: vArray(lCnt, 1) = 3
                Case 13: vArray(lCnt, 1) = 4
                Case Else:
                End Select
            Next lCnt
    
            .Offset(, 1).Value = vArray
        End With
    
    End Sub
    

    【讨论】:

    • 我觉得这很有趣。我明白你想说的话。单元格公式代码本身有点“干净”,但我想我是老派,喜欢循环。不管怎样,不管你的船是什么!我们在大约 2300 行上运行它,所以没什么大不了的。感谢您的意见!
    • 欢迎您,而且您不是第一个这么说的人,很多 vba 开发人员在遇到问题时会直奔循环。它是一个快速修复,它首先想到的。但是,当代码变得更加复杂并且数据库增长时,它们可能会成为一场噩梦,利用内置功能的 excel 会发现你是对的。尽管我必须承认,这不是一个容易改掉的习惯。 :)
    • 你意识到你还在循环,但它只是在 excel 的幕后?此外,OP 要求提供宏观解决方案,这通常意味着他们希望进行其他增强或修改以满足他们的额外需求。您的解决方案虽然是一个宏,但实际上是一个公式解决方案。我的回答也被否决了,没有发表评论。猜猜那天有人不开心。
    • @Portland 当然可以。但是有快速的循环方式和慢速的方式。抱歉,但在 excel 中 - 你的是最慢的之一。如果您想查看一种更快的方法,我已经更新了我的答案。关于您建议的公式答案,我没有水晶球,很多时候人们要求宏,因为他们没有意识到他们实际上并不需要一个。我很简单地尝试使用给定的信息提供最干净和最有效的代码。
    • @波特兰仅供参考:Dont get caught in the loop
    【解决方案2】:

    您可以使用Len() 获取单元格值的长度,例如Len(Range("A1"))

    现在您只需遍历您的列并查看每个值。如果您查找最后使用的单元格并仅在该范围内循环,您的循环会更快。

    我会这样做:

    sub TestUPC()
      With ActiveSheet
        LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
      End With
    
      Dim rRng As Range
      Set rRng = Range("B1:B" & LastRow)
    
      For Each cell In rRng.Cells
        If Len(Trim(cell))=12 then
          cell.Offset(0, 1).Value = 3
        ElseIf Len(Trim(cell))=13 then
          cell.Offset(0, 1).Value = 4
        End If
      Next
    End Sub
    

    单元内方程可能如下所示:

    =IF(LEN(B1)=12,3,IF(LEN(B1)=13,4," "))
    

    根据 cmets 的建议,您可能需要根据数据测试空格:

    =IF(LEN(TRIM(A1))=12,3,IF(LEN(TRIM(A1))=13,4," "))
    

    【讨论】:

    • 我建议添加“trim”以删除数字之前/之后的任何空格。否则,空格字符可能会诱使您认为它是 EAN,而实际上它是 UPC:=IF(LEN(TRIM(A1))=12,3,IF(LEN(TRIM(A1))=13,4," "))(VBA 中提供了类似的功能。)
    • 谢谢!这就像一个魅力!我没有使用修剪功能,因为我们的库存程序会导出数据。我找不到任何空格。以防万一,VBA 代码会测试空格吗?我倾向于使用 VBA 宏而不是 in 单元格,因为我们每天会下载几次这个文件的新版本。使用宏,我可以将它们保存在单独的电子表格中,并与此库存文件一起打开。再次感谢您!我非常感谢 Stumptown 的帮助! =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多