• ベストアンサー

EXCEL VBAでWORKDAY関数を使用したい

こんにちは。 タイトルの通りなのですが シート関数でのWORKDAY関数はうまく使用できるのですが VBAで同じような処理をするにはどうすればいいでしょうか? 例えば、開始日→A1、日数→A2、休日→F1:F10の場合 A3にその値を表示させたい場合 Range("A3")=workday(A1,A2,F1:F10) ではうまく行きません。 [ツール]-[アドイン]の分析ツールと分析ツール-VBAの チェックは付いています。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • takkunnet
  • ベストアンサー率74% (32/43)
回答No.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』内で定義してある関数」という捕らえ方で実行してやれば問題ありません。

esk0105
質問者

お礼

takkunnetさん、ご回答ありがとうございました。 色んな方々が教えて下さいましたが、初心者の私のレベルでは 教えて頂いた意味さえ理解できないことであったりで、応用するにも、戸惑ってしまったりしてしまう有様でした。 takkunnetさんが教えて下さったご回答が、一番簡潔で しかも、私が求めていた通りの答えを得ることができました。 本当にありがとうございました。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 理由は良く分りませんが、"分析ツール - 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 もう少し、この件は、調べてみたいと思います。

esk0105
質問者

お礼

Wendy02さん、ご回答ありがとうございます! 色々と調べて下さり、本当に感謝の言葉の言いようもありません。 私の説明が悪かったのか、休日を除外した日付の計算をしたかったので その指定をどこにどう入れればいいか悩んでいるところに No.5のtakkunnetさんが教えて下さいましたので、そちらを応用して使用させて頂くことにしました。 funcres(FUNCRES.XLA) 側って何? アドインって??? などと言うレベルの私が、こんな質問をさせて頂くのは百年早いかもしれませんね。(汗) それなのにご親切に本当にありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#1補>教えて頂いた方法で実行すると、下記のエラーになってしまいます。 WorksheetFunctionのメンバの中にWorkday関数は無いです。 #1の回答は、実際に動作するかを調べないで書いているものと思います。

esk0105
質問者

お礼

そうだったんですかー。 教えて頂いてありがとうございます。 そのまま、延々と悩み続けるところでした!

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

適当なセルをワークとして使ったらどうでしょう

esk0105
質問者

お礼

BLUEPIXYさん、ご回答ありがとうございます。 すみません、おっしゃって頂いた内容が高度すぎて 私には理解できませんでした。 もう少し勉強してみます。

  • Batistuta
  • ベストアンサー率28% (24/84)
回答No.1

VBAでエクセルの関数を使いたい場合は、エクセルオブジェクトのWorksheetFunction関数を使います。 Range("A3") = Application.WorksheetFunction.Workday(A1,A2,F1:F10)

参考URL:
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_050_030.html
esk0105
質問者

補足

Batistutaさん、早速ご回答ありがとうございます! 教えて頂いた方法で実行すると、下記のエラーになってしまいます。 実行時エラー'438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。 参照設定等、どこかにチェックが必要だったりするのでしょうか?

関連するQ&A

  • workday関数のみが消える。

    エクセル2003で作成した、あるブックをエクセル2007のある別なPCにコピーし保存した後(これら二つのPCは、リンクしていませんのでUSBメモ リーでコピーを行っております)、エクセル2007のPCから当該ブックを呼び出してみると、「ファイルエラー:ファイルが失われた可能性があります」との表示が出て、必ずworkday関数のあったセルのみその数式が失われています(当該セルには値が表示されておりますが数式は「=#N/A」と表示されています。不思議なことに他の関数は無事です。 該当するシートの保護・アドインの設定(分析ツールおよび同VBA)さらにマクロの設定の有効も行っておりますが、同じ症状です。対策はあるのでしょうか。初心者なので舌足らずの部分があると思いますが、ご教授ください。 不具合を起こすPCの環境は以下の通りです。 1.OS/WinXP 2.IE/7.0 3.Office2007 (因みにIEのセキュリティ設定状況はローカルPCのため「低」にしてあります)

  • Workday関数のような感じで・・・

    先日、VBAでのWorkday関数の使い方について教えて頂いたのですが これだと土日は自動的に省かれてしまう(省いてくれる?)ということに 今になって気がつきました。 土日が稼働日の場合もあるため Workday関数で祭日を指定する時のような感じでリストを作成し リストに書いてある日付はすべて、曜日に関わらず休日とみなす というような処理の方法はありますでしょうか? よろしくお願いします。

  • エクセル関数について

    エクセルの関数についてなのですが、例えば「セルA3」に「セルB2」の値を表示させるには「=(B2)」と「セルA3」に表示させてます。別のSheetの値も表示できるのでしょうか?例えば「Sheet1.Range("A3")」の値をSheet2のA1に表示させたい場合Sheet2のA1にはどのような関数を入力していけばよいのでしょうか?VBAは使わずに表示したいのですが。関数はまだほとんど使ったことがないので分かる人いたら教えてください。よろしくお願いします。

  • エクセルVBAでEdate関数は使えますか?

    エクセル2002使用です。 VBAでワークシート関数のEdate関数は、使用可能でしょうか?また、もし使用可能であった場合、それは「分析ツール」のアドインを入れてなくても大丈夫でしょうか? sub 一月後() Dim no as date no = WorksheetFunction.edate(Cells(1,1), 1) End sub が実行時エラー438となってしまいます。 (変数noは、Cells(1,1)の一月後) 原因がよくわからず困ってます。 よろしくお願いします。

  • エクセルVBA ワークシート関数の使用について

    エクセル2003VBA ワークシート関数の使用についての質問です よろしくお願いします。 4桁の数字を、千の位・百の位・十の位・一の位に分解する関数ですが 例えば A1に4桁の数字があり、B1に千の位を表示する場合ですが ワークシート関数の場合 B1=MOD(INT($A$1/1000),10) となりますが VBAにてそのまま使用し Range("B1").value=Application.WorksheetFunction.MOD(INT(Range("A1")/1000),10)とするとエラーになります。 エラーになる原因は、いろいろ調べたら分かったのですが この様に、一発でB1に計算結果を入れたいのですが、どうしたらよろしいでしょうか 現在は、 Range("C1").Formula = "=MOD(INT(A1/1000),10)" Range("B1").value=Range("C1").value 一旦、C1に置き換えてから行っています。 よろしくお願いします

  • エクセルVBAで関数が入った空白セルの取得

    エクセルVBAで下記のようなセルの参照をしたいのですが、よろしくお願いします。(エクセル2002です)   A  B  C  D  E  F 1 78 80 セル(A1)(B1)には値も関数も入れられています。 セル(C1)(D1)(E1)には値は入っていませんが、ワークシート関数が組み込まれており空白となっています。(関数の""にて空白) セル(F1)には何も入力されていません。 今回はセル(B1)の80の値を取得できるようにVBAで下記のようにコードを組みました。 Range("F1").End(elToLeft).Activate そうすると、セル(E1)に関数があるために(?)(E1)がアクティブな状態となります。 関数が入力されていても空白として(B1)をアクティブな状態にするために良い方法はありますでしょうか? 誠に申し訳ございませんが、よろしくお願いします。

  • 関数をVBAで簡素化する

    よろしくお願いします シート枚数22枚 各シート セルG11からG71まで 各シートの各行にこの関数を入力するのは労を要します。 また、VBAに下のように1ツづつ入力するのも同じです。 Range("G11").Value="=IF(E11+F11=0,0,G10+E11-F11)"          ↓ Range("G71").Value="=IF(E71+F71=0,0,G70+E71-F71)" VBAで簡素化ができないでしょうか

  • EXCEL VBAの日付関数について

    EXCEL VBAの日付関数のことでお聞きしたいことがあります。 エクセルの関数でワークデイ関数がありますが、例えば C1セル: =WORKDAY(A1,10,B1:B10) これをVBAのコードで書くと、どういうコードになるのでしょうか。 VBAの関数については詳細に書かれたテキストを持っておらず、WorksheetFunctionを使ってチャレンジしてみましたが どうも上手くいきませんでした。 初歩的な質問かも知れませんが、どうぞよろしくお願いいたします。

  • Excel VBAの SUM関数について質問です。

    Excel VBAの SUM関数について質問です。 SUM関数で合計の値を出す場合、 SUM(A1:A5)という関数で合計を出しますが SUM(sheet2.cells(1,1),sheet2.cells(5,1)) と言ったようにCellsで指定はできないのでしょうか? 複数の列にVBAのプログラムで合計の値を出したいのです。 WorksheetFunction.SumではSUM(A1:A5)のように 自動計算にならないと思うので・・・

  • エクセル上のVBA

    当方、VBAまるっきり初心者です(触りはじめて3日くらい)。 エクセルはある程度理解しているつもりですが… バージョンはエクセル2000です。 他シートのセルのひとつに入力すれば、 別シートのセルがそれを参照したうえで 値として表示出来るようにならないでしょうか。  今のところ、以下のような状況です。 step01 sheet1のセルA1に任意の数値(整数限定です)を入力。 step02 sheet2のセルA1に、sheet1のセルA1の数値を用いて     MOD関数で余りを出す。 step03 sheet2のセルB2に以下のVBAによって     step02の余りを値として表示。      Private Sub Worksheet_Change(ByVal Target As Range)        Range("b2").Value = Range("a1")      End Sub  これだとsheet1の数字を変えても、 sheetの切替後sheet2のセルB2に 表示される値が変わってくれません。  最初の入力(step01の入力)をおこなえば sheet2のセルB2まで値が変わってくれるような方法を 教えていただけないでしょうか。  拙い説明で申し訳ありませんが、よろしくお願いします。

専門家に質問してみよう