Excel宏:如果B列包含12位数,则C列等于3?

时间:2013-10-27 23:33:59

标签: excel vba excel-vba

所以,我正在试图找出如何编写一个Excel宏来填充C列中的3或4,具体取决于B列中包含的数字量。

我已经搜索到了正确的措辞,但我一直在做空。

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

有没有人有任何想法?非常感谢提前!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

in in cell equation看起来像这样:

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

根据评论中的建议,您可能希望根据数据测试空格:

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