• ベストアンサー

VBAでの実現方法を教えて下さい

Wendy02の回答

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

こんにちは。 >引数「200701(string), 200712(string), 3(integer)」 現実的に、パーツとしてユーザー定義関数で、そのような2次元配列による出力をしても、全体のプロシージャが伴わないと、うまく行かないような気もします。 #1さんの内容とは重複する部分もあるのですが、私は、私なりに考えてみました。引数が違う場合は、明示的に配列出力をしないのは、On Error Resume Next でしか、エラーを取れないような気がしましたので、エラー値を出すようにしました。だから、Variant 型で戻り値を受けてあげれば、IsError で取れます。いまどきは、そんなことはどうでもよい言われそうですが。 なお、区間が割り切れない場合は、区間の最終月を終了側に入れます。 '----------------------------------------------- Sub TestA() Dim a As Variant a = DatesAcc("200701", "200712", 3) End Sub Function DatesAcc(ByVal sStart As String, ByVal sEnd As String, ByVal period As Variant) '引数:sStart--始まり, sEnd--終わり,period--期間   Dim i As Date, j As Date, t As Date   Dim n As Integer   Dim x As Integer   Dim k As Integer   Dim dif As Integer   Dim Ar() As String      If Len(sStart) = 6 And Len(sEnd) = 6 And IsNumeric(period) Then     i = CDate(Format(sStart & "01", "@@@@/@@/@@"))     j = CDate(Format(sEnd & "01", "@@@@/@@/@@"))   Else     'エラー値出力     DatesAcc = CVErr(xlErrValue)     Exit Function   End If   If i > j Then t = i: i = j: j = t   dif = DateDiff("m", i, j)   n = Int(dif / period) + 1   ReDim Ar(n - 1, 1)      x = 0   For k = 0 To n - 1     Ar(k, 0) = Format$(DateAdd("m", x, i), "yyyymm")     If j >= DateAdd("m", x + (period - 1), i) Then       Ar(k, 1) = Format$(DateAdd("m", x + (period - 1), i), "yyyymm")     Else       Ar(k, 1) = Format$(j, "yyyymm")     End If     x = x + period   Next k   DatesAcc = Ar() End Function

tosshi_1978
質問者

お礼

回答ありがとうございます。 お陰で問題無く実装できました。

関連するQ&A

  • VBAでの戻り値と引数について

    最近VBAでプログラムを勉強しています。 引数と戻り値について教えてください。 定義としては、 引数:プロシージャに渡される定数、変数、および式。 戻り値:呼び出し元に処理の結果を戻す値。 となっているのですがいまいちピンときません。 SubプロシージャとFunctionプロシージャでその違いがあると思うのですが、具体的にどれが引数でどれが戻り値なのかわかりません。 他のプログラミングも全く経験がない初心者で初歩的な質問ですみませんがご教授お願いします。

  • VBAのマクロをシート内の式で使いたい

    VBAで、マクロの関数をエクセルの式で使うことは可能でしょうか? 引数や戻り値の制約も知りたいです。 引数はExcel側ではセル値B1とかになりますが、VBA側では何か対策でもあるのでしょうか? 'VBA public function test(byval a as integer, byval b as integer) as integer test = a + b end function 'エクセル側 C1セルに以下の式 =test(A1, B1)

  • VBAでの年齢計算がうまくいきません。

    失礼いたします。  VBAで年齢の計算を行いたいのですがなかなかうまくいきません。 =sub Dim 開始日付 As String Dim 終了日付 As String Dim 年齢 As String 開始日付 = "S54/4/1" 終了日付 = "H22/4/1" 年齢 = "=DATEDIF(開始日付,終了日付,""Y"")" =endsub としても、DATEDIF関数は引数をうまく処理してくれないのです。 エクセル関数を使わずに、年齢を算出するか。 エクセル関数内に引数を代入する方法があれば教えていただけないでしょうか?

  • 【エクセルVBA】Functionの引数として、配列は使えるのでしょうか?

    VBA初心者です。 Function で関数を定義するとき、その引数に配列を使う方法はあるのでしょうか? たとえば Function Test (C as double,n as integer) というFunctionの C に3×3の行列を入れたいのですが…。

  • Functionでの戻り値のとり方

    こんばんわ。 以下のように、Functionで引数に配列を指定して、戻り値も配列で取得したいのですが、方法としては以下のようにしかできないのでしょうか? ------------------------- '配列を宣言 dim Ary() as string dim AryRet() as string '戻り値の配列 Call Get_Ary(Ary(),AryRet()) ------------------------- Function Get_Ary(Ary() as string , AryRet() as string) 'Ary()を参照して、AryRet()を取得する End Function という風に書いているのですが、Functionのところを以下のように 書くのは無理でしょうか? うまく取れないというのはやっぱ無理なのかな・・ ------------------------- '配列を宣言 dim Ary() as string dim AryRet() as string '戻り値の配列 AryRet() = Get_Ary(Ary()) Function Get_Ary(Ary() as string) As string 'Ary()を参照して、AryRet()を取得する 'それを関数の戻り値とする Get_Ary = AryRet(index) End Function このように書くと、配列の最後のインデックスの値だけ取れてしまう ようなんですが、、やっぱ配列で返すというのは上記のやり方でないと 無理なのでしょうか? 詳しい方ご教示願います。

  • INPUT関数でのCSV読込がおかしい件

    VisualBasic6.0で開発しております。 string型にて宣言した配列にシーケンシャルモードで 開いたCSVファイルを、 INPUT関数にて読み込んでいるのですが、" あああ" といったデータが、 配列に入ると"あああ "となってしまいます。つまり空白文字列が頭からお尻に移動してしまいます。 どなたか原因がわかる方、また回避方法がわかるかた は教えて頂ければ幸いです。なお、LINEINPUTではそのような現象はおこりません。しかしLINEINPUTは速度の観点から使いたくありません。 <参考ソース>   Type hairetu    a As String    b As String     ・     ・   End Type   Global 配列() As hairetu   dim intfile as integer   dim lngcnt as integer   intFile = FreeFile   Open "パス" For Input As #intFile   lngCnt = 0   Do While Not EOF(intFile)    redim preserve 配列(lngCnt)    Input #intFile, 配列(lngCnt).a,配列(lngCnt).b,・・・    lngCnt=lngCnt+1   LOOP

  • VBA-DLLの引数受け渡しについて

    皆様こんにちは VCでDLLを作成し、VBAからString配列を表データでわたし、DLLにて抽出後 VBAに戻す処理を作成しています。 VCよりデバッグ実行すると発生しないのですが VBAから実行するとたまにですが落ちてしまいます。 又、偶然かもしれませんがDLLをリリースモードにしたときしか落ちません。 以下の様なコードを作成し実行しているのですが、 問題があれば御指摘いただければありがたいです。 VCはVer6です。 void WINAPI foo (LPSAFEARRAY FAR* inData, //VBAよりわたされるString配列 LPSAFEARRAY FAR* outData) //VBAへ返すString配列 { BSTR inElment; BSTR outElment; long inIdx[2]; long outIdx[2]; char data[256]; for(行数分ループ) { for(列数分ループ) { //データ獲得処理   //inIdx[0],inIdx[1]にはinData配列へのインデックスが入ります。 SafeArrayGetElement(inData, inIdx, &inElement); lstrcpy(data,(LPCTSTR)inElement); SysFreeString (inElement);   ; //データを返す処理   //outIdx[0],outIdx[1]にはoutData配列へのインデックスが入ります。 element2 = SysAllocString((BSTR)data); SafeArrayPutElement(*outData, outIdx, outElement); SysFreeString (outElement); } } } 尚VBA側は 宣言を Public declare ・・・・ foo(ByRef indata() as string, ByRef outData() as string) としています。 各引数はRedimにて確保しています。 LPSAFEARRAY型変数や それに関係する関数 SysAllocStaring,SafeArrayGetElement,SafeArrayPutElement,SysFreeString の使い方に間違いがあるのでしょうか? よろしくお願い致します。

  • VBAでmdbファイルを新規作成する方法。

    すみませんが、教えてください。 EXCEL VBA + ACCESS でプログラミングしています。 プログラム実行時、mdbファイルを新規に作成し、 そこに、既存のmdbファイルより、テーブルをエクスポートさせたいのですが、 いろいろと、方法があるようで、どうすれば良いのか、判断しかねています。 SQL+ADO でACCESSを操作することを基本方針で、プログラムしています。 このような場合、上記のようなことを実現するためには、どのようなアプローチをとるのが、スマートな方法なのでしょうか? 周りに、詳しい人がおらず困っています。 すみませんが、よろしくお願いいたします。

  • テキストファイルを直接置換する方法

    VBAに関する質問です。 複数のテキストファイルを読み込んで 指定した文字列を別の文字列に検索・置換してくれるプログラムを作りたいと考えています。 これをするためには一度 Set MyTxt = FSO.OpenTextFile(StrPath, 1) Do While MyTxt.AtEndOfStream = False hairetu(xxx) = MyTxt.ReadLine loop のようにしてテキストデータを全て配列に読み込み、 Replace関数で一つずつ検索・置換した後に Open StrPath For Output As #1 Print #1, hairetu(xxx) のようにしてファイルを出力し直すしかないですか? 配列に読み込まずに 既存のファイルを直接編集する方法を教えてください。

  • VBA(EXCEL2000) 配列に文字列を格納する方法

    VBA(EXCEL2000) 配列に文字列を格納する方法 VBAを使用している初心者です。 文字列の配列宣言と同時にデータを格納する方法を教えて下さい。 '/----現在のコード-----------------------------/ Dim member(47) As String member(1) = "北海道" member(2) = "青森県" member(3) = "岩手県" '(途中略) member(46) = "鹿児島県" member(47) = "沖縄県" '/--------------------------------------------/ 下記のようなコードは実現可能でしょうか? Dim member() As String = {"北海道", "青森県", "岩手県",(途中略), "鹿児島県", "沖縄県"}