0

次の 1、3、6 か月間 (など) のマシンのコストを合計するレポートを本質的にループする (私の最初の) カスタム関数を作成しようとしています。

関数は値を返しますが、これらの値は正しくありません。さらに問題なのは、カスタム関数を含むセルで double を使用すると、カスタム関数を使用する周囲のセルの値が変更されることです。

私が扱っているコードは次のとおりです。

Option Explicit

Dim months As Integer 'a month is considered as 30 days
Dim cost As Long
Dim FleetData As Range
Dim rowCounter As Long
Dim lastRow As Long
Dim firstRow As Long
Dim component As Range
Dim dateOfAction As Range
Dim totalApprox As Range
Dim dateHorizon As Date 'Date to which the user wants to total the maintenance cost for

Private Function totalCosts(xMonths As Range)
'Dim totalCosts As Long
Application.Volatile

dateHorizon = Date + (30 * months)

firstRow = [A10].Row
rowCounter = firstRow
lastRow = Range("A65000").End(xlUp).Row
Set FleetData = [A10:S14]

If IsNumeric(xMonths.Value) Then months = xMonths.Value Else
If IsDate(xMonths.Value) Then months = (xMonths.Value - Date) / 30
cost = 0
    Do While rowCounter < lastRow
        Set component = Range(Cells(rowCounter, 1), Cells(rowCounter, 19))
        Set dateOfAction = Cells(rowCounter, 7)
        Set totalApprox = Cells(rowCounter, 12)
        If dateOfAction <= dateHorizon Then
            cost = cost + totalApprox
        End If
        totalCosts = cost
        rowCounter = rowCounter + 1
    Loop

End Function

そして、使用しているデータは次のとおりです。

DateOfAction totalApprox 
5/07/2014    $30,068.62 
24/05/2005   $6,300.00 
5/07/2012    $29,742.00
5/07/2012    $4,360.28
27/12/2012   $5,555.89

セルをクリックすると、値が移動するように見えますが、識別可能な順序ではありません。

グーグルしてここを見ましたが、これまでのところ問題を解決しているようには見えません。

どんな助けでも大歓迎です!

4

1 に答える 1

1

いくつかのヒントと確認事項:

  1. モジュール スコープの変数を使用しないでください (これらの変数を他のモジュールと共有する必要がある場合を除きます。通常はより良い方法があります)。
  2. 本当に必要でない限り、Volatile を使用しないでください (この場合は使用しないと思います)。
  3. すべての範囲をパラメーターとして関数に渡します
  4. Range(...直接範囲参照を使用する必要がある場合は、やなどの非修飾参照はアクティブ シートCell(...の範囲を参照することに注意してください。データ シートがアクティブでない場合、この UDF は予期しない結果を返します。代わりに次のようなものを使用してください。しかし、繰り返しますが、範囲参照をパラメーターとして関数に渡す方がはるかに優れています。Worksheets("Sheet1").Range(...
  5. コードは、months設定する前に変数を参照します。
  6. セルから数式でUDF を呼び出している場合、(のようにtotalCosts = cost)セル値を設定しようとしても機能しません。これは、提供したリンクに明確に記載されています(直接VBA UDFを作成することはできません:リストの最初のポイント)。一方、a から UDF を呼び出して、Subその Sub をマクロとして実行すると、動作します

データ レイアウトの完全な詳細と UDF の使用方法を提供していただければ、より具体的なアドバイスを提供できます。

于 2012-05-24T08:44:53.857 に答える