- ベストアンサー
EXCEL VBAでWORKDAY関数を使用したい
こんにちは。 タイトルの通りなのですが シート関数でのWORKDAY関数はうまく使用できるのですが VBAで同じような処理をするにはどうすればいいでしょうか? 例えば、開始日→A1、日数→A2、休日→F1:F10の場合 A3にその値を表示させたい場合 Range("A3")=workday(A1,A2,F1:F10) ではうまく行きません。 [ツール]-[アドイン]の分析ツールと分析ツール-VBAの チェックは付いています。 宜しくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
始めまして。回答いたします。 今回の関数(WorkDay)は、アドインの関数であるため以下のような方法で呼び出します。 Range("A3").Value = Application.Run("ATPVBAEN.XLA!WorkDay" , Range("A1").Value , Range("A2").Value , Range("F10").Value) この方法は、VBAを実行するブック以外のブックに定義してあるマクロ(VBA)を呼び出すのと同じ方法です。 例: FileA.xls 内に Public Function Test(byref strValue as String) As String という定義の関数があったとします。 それを FileB.xls内で使用したいときには strGet = Application.Run("FileA.xls!Test","strValue に与える値") として実行すると「strGet」に関数「Test」の結果が戻ってきます。 ※注意としては、FileA.xlsが同一のExcel内に開かれている必要があります。 つまり「WorkDay関数はアドインの『分析ツール-VBA』=『ATPVBAEN.XLA』内で定義してある関数」という捕らえ方で実行してやれば問題ありません。
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 理由は良く分りませんが、"分析ツール - VBA" (ATPVBAEN.XLA) というのは、古いタイプのXll(Excel Ver 4.0)で作られたようで、やってみましたが、生きていませんね。 通常、VBE側で、参照設定すれば、その関数のメンバが出てくるはずですが、出てきません。ただし、オブジェクトブラウザでは表示されます。私の知る範囲ですが、これは、一旦、グローバル化させるために、Auto_Open が必要だという話を以前聞いたことがあります。これについては、定かではありません。私の持っているマニュアルでは、多少、ATPVBAEN.XLA の辺りが触れられていますが、今、十分に調べていないので、あやふやです。 とりあえず、難しい話は置いておいて、funcres(FUNCRES.XLA) 側からアクセスしてみました。つまり、ワークシート側で「分析ツール」にアドインしてあれば、これは、戻り値を返しますので、VBE側の "分析ツール - VBA"の参照設定は必要ありません。 Sub AddinTest1() Dim StartDate As String '開始日 Dim DateCount As String '日数 Dim Ret As Variant '戻り値 StartDate = """" & Format$(Range("A1").Value2, "yyyy/mm/dd") & """" DateCount = Range("A2").Value 'FUNCRES.XLA 側 Ret = Evaluate("WORKDAY(" & StartDate & "," & DateCount & ")") If Not IsError(Ret) Then Range("A3").Value = Format$(Ret, Range("A1").NumberFormatLocal) Else Range("A3").Value = CVErr(xlErrNA) End If End Sub もう少し、この件は、調べてみたいと思います。
お礼
Wendy02さん、ご回答ありがとうございます! 色々と調べて下さり、本当に感謝の言葉の言いようもありません。 私の説明が悪かったのか、休日を除外した日付の計算をしたかったので その指定をどこにどう入れればいいか悩んでいるところに No.5のtakkunnetさんが教えて下さいましたので、そちらを応用して使用させて頂くことにしました。 funcres(FUNCRES.XLA) 側って何? アドインって??? などと言うレベルの私が、こんな質問をさせて頂くのは百年早いかもしれませんね。(汗) それなのにご親切に本当にありがとうございました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1補>教えて頂いた方法で実行すると、下記のエラーになってしまいます。 WorksheetFunctionのメンバの中にWorkday関数は無いです。 #1の回答は、実際に動作するかを調べないで書いているものと思います。
お礼
そうだったんですかー。 教えて頂いてありがとうございます。 そのまま、延々と悩み続けるところでした!
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
適当なセルをワークとして使ったらどうでしょう
お礼
BLUEPIXYさん、ご回答ありがとうございます。 すみません、おっしゃって頂いた内容が高度すぎて 私には理解できませんでした。 もう少し勉強してみます。
- Batistuta
- ベストアンサー率28% (24/84)
VBAでエクセルの関数を使いたい場合は、エクセルオブジェクトのWorksheetFunction関数を使います。 Range("A3") = Application.WorksheetFunction.Workday(A1,A2,F1:F10)
補足
Batistutaさん、早速ご回答ありがとうございます! 教えて頂いた方法で実行すると、下記のエラーになってしまいます。 実行時エラー'438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。 参照設定等、どこかにチェックが必要だったりするのでしょうか?
お礼
takkunnetさん、ご回答ありがとうございました。 色んな方々が教えて下さいましたが、初心者の私のレベルでは 教えて頂いた意味さえ理解できないことであったりで、応用するにも、戸惑ってしまったりしてしまう有様でした。 takkunnetさんが教えて下さったご回答が、一番簡潔で しかも、私が求めていた通りの答えを得ることができました。 本当にありがとうございました。