1369560924 EXCEL2007のVBAについての質問です。

"SCHEDULE SHEET" A列に記載された年・日・時間のデータを使ってB列に"10FY1Q"等Quater毎のterm情報を記載したいと思っています。
WORKSHEET関数では、"TERM SHEET"を追加し、A列に年・日データ、B列にTerm情報を付記した上で
下記の関数で記載する事が出来ました。
=VLOOKUP(DATE(LEFT(A2,4),MID(A2,6,2),MID(A2,9,2)),term!$A:$B,2)
当該Worksheet関数をVBA化するに当たり、首っ引きで下記のように記載してみましたが、うまく行きません。
Dim eddateA As Date
For i = 2 To 10
eddateA = Cells(i, 1)
Worksheets("schedule").Cells(i, 1).Value = Application.VLookup(DateSerial(Year(eddateA), Month(eddateA), Day(eddateA)), Worksheets("term").Range("$A:$B"), 2)
Next
詳しい方、アドバイス頂けませんでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/05/27 10:54:08
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Silvanus No.3

回答回数180ベストアンサー獲得回数71

ポイント100pt

TERM SHEETの内容等の情報が明らかにされていないので
どの様な点でお困りなのかが判然としないのですが、
敢えてユーザー定義関数にされなくとも、下記の様な式の記述で
事足りるのではないかと思いますが、いかがでしょうか。
もっと簡潔に書けるかも知れませんが…。
※A2に格納された日付情報を元に年度四半期を表示させる場合

=CONCATENATE(RIGHT(TEXT(IF(MONTH(A2)<4,YEAR(A2)-1,YEAR(A2)),"0"),2),"FY",INT(MOD(MONTH(A2)+8,12)/3)+1,"Q")

どうしてもユーザー定義関数とされるのであれば、これでいかがでしょうか。

Function FYandQ(dateVal As Date) As String
FYandQ = Right(Str(Year(dateVal) + (Month(dateVal) < 4)), 2) & "FY" & Format(Int(((Month(dateVal) + 8) Mod 12) / 3) + 1, "0") & "Q"
End Function
id:Silvanus

書き忘れましたが、後者の方は「=FYandQ(A2)」という様な感じで使用して下さい。

2013/05/27 01:15:49
id:bamboodragon

表示出来ました!
確かに別シートからデータを持ってくる意味合いがないですね。
勉強になりました。

有難う御座いました!

2013/05/27 10:53:42

その他の回答2件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ぱっと見、eddateBというのをセットしていないようですが
これは 何をセットしているのでしょうか?

うまくいかないのは この初期化されていない変数を使ってるのが
原因ではないでしょうか?

id:bamboodragon

書きこみ有難う御座います。eddateBはeddateAの誤りです。。失礼しました。

2013/05/26 19:32:21
id:bamboodragon

本文修正致しました。

2013/05/26 19:37:17
id:bamboodragon

質問文を編集しました。詳細はこちら

id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

何が うまくいかないのかは よくわからないのですが

Worksheets("schedule").Cells(i, 1).Value =

Worksheets("schedule").Cells(i, 2).Value =
なのでは なかろうかと思います。

id:bamboodragon

たびたびすみません。
修正しました。

2013/05/26 23:06:22
id:taknt

うまくいかない原因を指摘しているのに 評価されないのは不本意ですね。

2013/05/27 11:14:38
id:bamboodragon

VBAを下記に修正します。

Dim eddateA As Date

For i = 2 To 10

eddateA = Cells(i, 1)

Worksheets("schedule").Cells(i, 2).Value = Application.VLookup(DateSerial(Year(eddateA), Month(eddateA), Day(eddateA)), Worksheets("term").Range("$A:$B"), 2)

Next

id:Silvanus No.3

回答回数180ベストアンサー獲得回数71ここでベストアンサー

ポイント100pt

TERM SHEETの内容等の情報が明らかにされていないので
どの様な点でお困りなのかが判然としないのですが、
敢えてユーザー定義関数にされなくとも、下記の様な式の記述で
事足りるのではないかと思いますが、いかがでしょうか。
もっと簡潔に書けるかも知れませんが…。
※A2に格納された日付情報を元に年度四半期を表示させる場合

=CONCATENATE(RIGHT(TEXT(IF(MONTH(A2)<4,YEAR(A2)-1,YEAR(A2)),"0"),2),"FY",INT(MOD(MONTH(A2)+8,12)/3)+1,"Q")

どうしてもユーザー定義関数とされるのであれば、これでいかがでしょうか。

Function FYandQ(dateVal As Date) As String
FYandQ = Right(Str(Year(dateVal) + (Month(dateVal) < 4)), 2) & "FY" & Format(Int(((Month(dateVal) + 8) Mod 12) / 3) + 1, "0") & "Q"
End Function
id:Silvanus

書き忘れましたが、後者の方は「=FYandQ(A2)」という様な感じで使用して下さい。

2013/05/27 01:15:49
id:bamboodragon

表示出来ました!
確かに別シートからデータを持ってくる意味合いがないですね。
勉強になりました。

有難う御座いました!

2013/05/27 10:53:42

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません