Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2198 / 13645 ツリー ←次へ | 前へ→

【69424】Application.Volatileを使用した際の再計算について indojin 11/7/8(金) 15:49 質問[未読]
【69426】Re:Application.Volatileを使用した際の再... neptune 11/7/8(金) 22:18 発言[未読]
【69433】Re:Application.Volatileを使用した際の再... indojin 11/7/11(月) 8:45 お礼[未読]

【69424】Application.Volatileを使用した際の再計...
質問  indojin  - 11/7/8(金) 15:49 -

引用なし
パスワード
   また質問させて頂きます。

Functionプロシージャを用いて、売上の合計額や、粗利等を調べる関数を作っています。

挙動としては完成したのですが、Application.Volatileを用いた際の再計算が行われず、#value!になってしまう問題があります。

数式で使用されるデータの形式が正しくありません、と表示されるのですが、
入力時や、F9での再計算では正しく表示されます。

あくまで他のセルの内容が変わった際の自動計算でそのエラーが表示されてしまいます。


どこの形式に問題があるかお恥ずかしいですが全く分からず、質問させて下さい。

解決法がお分かりの方、知恵を頂けませんでしょうか?
※計算結果自体は、問題無く表示されております。

ここからは作成した関数を貼り付けます。
長くなり本当に御迷惑をおかけ致します。


●集計

Function 集計(month As Double) As Variant

   Application.Volatile


  'そのセルの属する行のB列をシート取得の為にC_nameに入れる
  Dim C_name As String
  C_name = Cells(Application.Caller.Row, 2).Value
  
  
  '関数が用いられている列がどこかを判別し、機能別番号に格納
  '4で割った数字で判断する
    '3=合計売上額
    '0=合計仕入額
    '1=合計粗利額
    '2=粗利率
  Dim F_num As Integer
  F_num = Application.Caller.Column Mod 4


  '変数monthに整数で1~12が入っているかの検査
  If Int(month) <> month Then
  
      集計 = "error_1:少数点"
      Exit Function
  
  ElseIf month < 1 Then
  
      集計 = "error_2:0以下"
      Exit Function
    
  ElseIf month > 12 Then
  
      集計 = "error_3:13以上"
      Exit Function
      
  Else
      
      
  End If
  
  
  'F_numによって出力するデータを変える。及びに1~4以外の数値に対してエラー処理も行う。
  Select Case F_num
  
  
  '●合計売上額
    Case "3"
      Dim sum_uriage As Long
            
      
      '4~250行目までに制限中
      For i = 4 To 250
     
        '注文番号が入っている物を調べる
        If Worksheets(C_name).Cells(i, 1).Value <> ("") Then
       
          '日付フォーマットになっている物の、月を取得してmonthと比較
          '合っていたら、合計売上額に加算
          If Format(Worksheets(C_name).Cells(i, 16).Value, "m") = month Then
          
            sum_uriage = sum_uriage + Worksheets(C_name).Cells(i, 8).Value
            
          Else
          
          End If

        '注文番号が無い箇所で打ち切り、セルに合計売上額を表示
        Else
       
          集計 = sum_uriage
          Application.Volatile

          Exit For
          
        End If
       
      Next i

      
  '●合計仕入額
    Case "0"
      Dim sum_siire As Long
            
      '4~250行目までに制限中
      For i = 4 To 250
     
        '注文番号が入っている物を調べる
        If Worksheets(C_name).Cells(i, 1).Value <> ("") Then
       
          '日付フォーマットになっている物の、月を取得してmonthと比較
          '合っていたら、合計仕入額に加算
          'ただし、仕入れ額が記載されていないとその分少なくなってしまうので注意
          If Format(Worksheets(C_name).Cells(i, 16).Value, "m") = month Then
          
            sum_siire = sum_siire + (Worksheets(C_name).Cells(i, 5).Value * Worksheets(C_name).Cells(i, 6).Value)
            
          Else
          
          End If

        '注文番号が無い箇所で打ち切り、セルに合計仕入額を表示
        Else
       
          集計 = sum_siire
          Exit For
          
        End If
       
      Next i


  '●合計粗利額
    Case "1"
      Dim sum_arari As Long
            
      sum_arari = Application.Caller.Offset(0, -2).Value - Application.Caller.Offset(0, -1).Value
      集計 = sum_arari
      
   '●粗利率
    Case "2"
      Dim arari_ritu As Double
      
      
      If Application.Caller.Offset(0, -3).Value = 0 Then
        集計 = "--.--%"
      
      Exit Function
      
      Else
        arari_ritu = Application.Caller.Offset(0, -1).Value / Application.Caller.Offset(0, -3).Value
        集計 = arari_ritu
      
      End If
      
   '●その他のセルに入って居た場合
    Case Else
      集計 = "F_numが整数の1~4以外"

    End Select

End Function

【69426】Re:Application.Volatileを使用した際の...
発言  neptune  - 11/7/8(金) 22:18 -

引用なし
パスワード
   ▼indojin さん:
関係あるかどうかわかりませんけど気になる点

・先ず、関数の引数名monthは同名のMonth関数というのがあるので
使用してはいけない。

・お金の計算をする時にDouble型を使ってはいけない。
ふつう通貨(Currency)型を使います。
誤差が1つの計算では銭未満単位の誤差程度ですけど、積算すると恐ろしいことになる可能性がある。(1円間違っても困るでしょ?。)

> C_name = Cells(Application.Caller.Row, 2).Value
はcellsの上位オブジェクトを指定しなくてもよいのか?

・if 文で、else節の何も書いてないけど不要なら書かないで良い。

これを確認してまだ解消しないようなら再現方法を書いて下さい。

【69433】Re:Application.Volatileを使用した際の...
お礼  indojin  - 11/7/11(月) 8:45 -

引用なし
パスワード
   To neptune 様

御回答ありがとうございます。

一つ一つ確認した所、

>> C_name = Cells(Application.Caller.Row, 2).Value
>はcellsの上位オブジェクトを指定しなくてもよいのか?

この問題点のワークシート名も記述した状態にて再計算が上手く表示されました。


他に指摘して頂いた所も直接的には関係無かったかもしれませんが、
とても勉強になりました。


neptune様の御蔭で無事解決致しました。


細かく見て指摘して頂き、ありがとうございました。


>関係あるかどうかわかりませんけど気になる点
>
>・先ず、関数の引数名monthは同名のMonth関数というのがあるので
>使用してはいけない。
>
>・お金の計算をする時にDouble型を使ってはいけない。
>ふつう通貨(Currency)型を使います。
>誤差が1つの計算では銭未満単位の誤差程度ですけど、積算すると恐ろしいことになる可能性がある。(1円間違っても困るでしょ?。)
>
>> C_name = Cells(Application.Caller.Row, 2).Value
>はcellsの上位オブジェクトを指定しなくてもよいのか?
>
>・if 文で、else節の何も書いてないけど不要なら書かないで良い。
>
>これを確認してまだ解消しないようなら再現方法を書いて下さい。

2198 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free