2

私は次のコードを持っています。2つの数値を加算しようとすると、ゼロになります。

Public Function getCategory(Value As String, Optional col As Long = 1) As String
   Sheets("Product Master").Select
   Range("A2").Select
   Dim I As Long
   Do Until Selection.Value = Value
   ActiveCell.Offset(1, 0).Select
   Loop
   getCategory = Selection.Value
End Function


Sub Calculate()
Dim furnitureTotal As Double
Dim furQuantity As Integer
furnitureTotal = 0
furQuantity = 0

Dim applianceTotal As Double
Dim appQuantity As Integer
applianceTotal = 0
appQuantity = 0

Dim whiteGoodsTotal As Double
Dim whiteGoodQuantity As Integer
whiteGoodQuantity = 0
whiteGoodsTotal = 0

Dim softFurTotal As Double
Dim softFurQuantity As Integer
softFurTotal = 0
softFurQuantity = 0

Dim description As String
Dim total As Double
Dim quantity As Integer

Sheets("Invoice").Select
Range("F64").Select
Do Until (ActiveCell.Value = "Finish" Or ActiveCell.Value = "")
    description = ActiveCell.Value
    ActiveCell.Offset(0, 1).Select
    quantity = Selection.Value
    ActiveCell.Offset(0, 6).Select
    total = Selection.Value
    If (getCategory(description) = "Furniture") Then
        furnitureTotal = furnitureTotal + Val(total)  <---------- this line
        furQuantity = furQuantity + quantity
        End If

    If getCategory(description) = "Electronics" Then
        applianceTotal = applianceTotal + total
        appQuantity = appQuantity + quantity
        End If

    If getCategory(description) = "White Goods" Then
        whiteGoodsTotal = whiteGoodsTotal + total
        whiteGoodQuantity = whiteGoodQuantity + quantity
        End If

    If getCategory(description) = "Soft Furnishings" Then
        softFurTotal = softFurTotal + total
        softFurQuantity = softFurQuantity + quantity
        End If

    Sheets("Invoice").Select
    ActiveCell.Offset(1, -7).Select
Loop

Sheets("Invoice").Select <---------------------- breakpoint was placed here
Range("L24").Select
Selection.Value = furQuantity
ActiveCell.Offset(0, 1).Select
Selection.Value = furnitureTotal
Range("L25").Select
Selection.Value = appQuantity
ActiveCell.Offset(0, 1).Select
Selection.Value = applianceTotal
Range("L26").Select
Selection.Value = whiteGoodQuantity
ActiveCell.Offset(0, 1).Select
Selection.Value = whiteGoodsTotal
Range("L27").Select
Selection.Value = softFurQuantity
ActiveCell.Offset(0, 1).Select
Selection.Value = softFurTotal


End Sub

各説明が家具カテゴリに属しているときにこのコードを実行しました。実行すると、すべての変数の値は0のままです。デバッガーを開いて変数の値を表示すると、変数の値が次の行に表示されました。

Line:    `furnitureTotal = furnitureTotal + Val(total)`
Values:         0                  0            1750

2つのdouble値が追加されない理由がわかりません。これは変数の寿命に関連していますか?

4

2 に答える 2

1

私が見る2つのこと-あなたは使用totalしますが、これはlistcolumnオブジェクトで使用されるキーワードであり、vlookupがコードを置き換えることができる場合、getcategoryを繰り返し呼び出します。

少し書き直されたコードは次のとおりです。

Sub Calculate()
Dim furnitureTot As Double
Dim furQuantity As Integer
Dim applianceTot As Double
Dim appQuantity As Integer
Dim whiteGoodsTot As Double
Dim whiteGoodQuantity As Integer
Dim softFurTot As Double
Dim softFurQuantity As Integer
Dim description As String
Dim Tot As Double
Dim quantity As Integer

furnitureTot = 0
furQuantity = 0
applianceTot = 0
appQuantity = 0
whiteGoodQuantity = 0
whiteGoodsTot = 0
softFurTot = 0
softFurQuantity = 0

Sheets("Invoice").Select
Range("F64").Select
Do Until (ActiveCell.Value = "Finish" Or ActiveCell.Value = "")
    description = Application.WorksheetFunction.VLookup(ActiveCell.Value, Range("'Product Master'!A2:B9999"), 2, False) ' lookup value, rather than do it repeatedly, and use built in function
    ActiveCell.Offset(0, 1).Select
    quantity = Val(Selection.Value) ' try to get number, even if it's input as text
    ActiveCell.Offset(0, 6).Select
    Tot = Val(Selection.Value)

    Select Case description ' only 1 test needed
        Case "Furniture"
            furnitureTot = furnitureTot + Tot
            furQuantity = furQuantity + quantity
        Case "Electronics"
            applianceTot = applianceTot + Tot
            appQuantity = appQuantity + quantity
        Case "White Goods"
            whiteGoodsTot = whiteGoodsTot + Tot
            whiteGoodQuantity = whiteGoodQuantity + quantity
        Case "Soft Furnishings"
            softFurTot = softFurTot + Tot
            softFurQuantity = softFurQuantity + quantity
    End Select
    Sheets("Invoice").Select
    ActiveCell.Offset(1, -7).Select
Loop

Sheets("Invoice").Select
Range("L24").Select
Selection.Value = furQuantity
ActiveCell.Offset(0, 1).Select
Selection.Value = furnitureTot
Range("L25").Select
Selection.Value = appQuantity
ActiveCell.Offset(0, 1).Select
Selection.Value = applianceTot
Range("L26").Select
Selection.Value = whiteGoodQuantity
ActiveCell.Offset(0, 1).Select
Selection.Value = whiteGoodsTot
Range("L27").Select
Selection.Value = softFurQuantity
ActiveCell.Offset(0, 1).Select
Selection.Value = softFurTot

End Sub
于 2012-07-03T21:06:28.110 に答える
1

これは実際には答えではありませんが、他にこれを投稿する方法がわかりません。

SUMIF関数を使用すると、VBAをまとめて回避できます。

たとえば、Furnitureでない場合は、Furnitureに使用される実際のコードをL24で次のように使用します。

=SUMIF(F:F,"Furniture",G:G)

これを使用すると、数式で処理されるため、そのセルを再度計算する必要はありません。他のすべての計算セルを同様の数式で更新でき、マクロを実行する必要がなくなります。

この特定の数式は、対応する値を持つ、含まれるべきではない列Fに正確に「家具」がある行がない限り、正しい結果を提供します。その場合は、適切な範囲を手動で入力するだけです。

余談ですが、関数getCategoryは何も役に立ちません。記述されているように、指定された値を返すか(選択されたセルが指定された値と同じ場合は、選択されたセルの値を返します)、最終的に実行時エラーが発生するまでループします。存在しない。

于 2012-07-03T20:53:17.543 に答える