0

そのため、列 B に含まれる数値の量に応じて、列 C に 3 または 4 を入力する Excel マクロを作成する方法を見つけようとしています。

私はこれに対する適切な言い回しをあちこち探しましたが、不足し続けています。

基本的に、列 B の桁数を調べるマクロが必要です。12 桁の場合は UPC であり、13 桁の場合は EAN です。次に、列 C に UPC の場合は 3、EAN の場合は 4 を入力するマクロが必要です。これは、スプレッドシート内の行の範囲全体を対象とする必要があります。

誰にもアイデアはありますか?よろしくお願いします!

4

2 に答える 2

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
于 2013-10-28T02:51:37.150 に答える
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

セル内の方程式は次のようになります。

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

コメントで示唆されているように、データに応じてスペースをテストすることをお勧めします。

=IF(LEN(TRIM(A1))=12,3,IF(LEN(TRIM(A1))=13,4," "))
于 2013-10-27T23:45:50.593 に答える