- ベストアンサー
Exccel2000VBAにて年号を下2桁で表示する。
表題のとおりなのですが、どうにかして「2005」を「05」のように表示したいのですが、良い方法はありませんでしょうか? year(date)にしてしまうと、どうしても4桁になってしまうし整数型なので「05」という表記にできません。 できれば文字列としてstring型の変数に収納できればと考えています。 最終的に日付から「05/06 JUN-JUN」のように表示したいです。(月は当月-1の数値)月については12個しかないのでElseIF文で今月が7月だったら「"/06/ JUN-JUN"」と表記されるようにしました。この表記の前に2桁の年を入れたいです。 無理なようならVBAを05年で固定し、来年はまた来年用に書き換えるとか考えてますが、自動で年毎に対応できたら良いと考えてます。 よろしくお願いいたします。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。ちょっと見直してみました。 私の式は、ちょっと複雑かもしれませんね。自分も後から見直したら、読み直せないかもしません。ただ、私が以前作った「Mod」を使ったパターンの使いまわしをしているだけですので、それ自体は、私自身も考えているのではなくて、単に当てはめているだけです。 ElseIf d = 11 Then a.Value = g & "/10 OCT-OCT" b.Value = g & "/09 APR-JUL" ↑ ここの部分はあっていますか? /09 APR-SEP ではありませんか? それから、Workbooks(2) というIndex を付けるのは、論理的な割り振りなので、ワークシートとは違って、実際のワークブックに当てはめるのは、あまり関心しません。きちんとした、ブック名を入れたほうがよいです。 '------------------------------------------------------------- Sub testSample4() Dim strDate1 As String, strDate2 As String Dim d As Integer, m1 As String, m2 As String, m3 As String Dim g As Integer g = Format(Date - 31, "yy") '年の変わり目の処理 d = Month(Date) m1 = ChangeMonth(d - 1) strDate1 = Format$(g, "00/") & _ Format$((d + 10) Mod 12 + 1, "00 ") & m1 & "-" & m1 If d = 5 Or d = 11 Then m2 = ChangeMonth(d - 2, 5) m3 = ChangeMonth(d - 2) strDate2 = Format$(g, "00/") & _ Format$(d - 2, "00 ") & m2 & "-" & m3 Else m2 = ChangeMonth(d, (d + 2) Mod 6 - CByte((d + 2) Mod 6 = 0) * 6) strDate2 = Format$(g, "00/") & _ Format$((d + 10) Mod 12 + 1, "00 ") & m2 & "-" & _ m1 End If With Workbooks(2).Sheets(1) 'ここは危ない! .Range("C3,I3,Q3").Value = strDate1 .Range("F3,M3,T3").Value = strDate2 End With End Sub Private Function ChangeMonth(ByVal arg1 As Integer, Optional arg2 As Integer) As String Dim myMonths As Variant myMonths = Array("JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC") ChangeMonth = myMonths((CInt(arg1) + 11 - arg2) Mod 12) End Function
その他の回答 (9)
- hana-hana3
- ベストアンサー率31% (4940/15541)
>”05/03 O2005/03/26T-MAR”みたいな感じです。 テストしていなくて申し訳ありません。 下記のように変更してください。 b.Value = StrConv(Format(fDate, "yy/mm ") & start & Format(fDate, "-mmm"), vbUpperCase) お返事の >ElseIf d = 11 Then b.Value = g & "/09 APR-JUL" は、仕様と異なるようですが?
お礼
ご回答ありがとうございました。 うまくいきました。すごいです12月分書いてたよりとっても短いので大満足です。 「Start &」の後ろにも「Format(fDate・・・」が必要だったのですね。奥が深い。(というかなぜああいうバグが起きるか未だにわかってませんが) とりあえず、ひとつひとつの構文を確認し、自分で管理できるようにしようと思います。(見たことない構文もあるので) あと ElseIf d = 11 Then b.Value = g & "/09 APR-JUL" は書き間違いでした。SEPです。コピー&ペーストで作ったので書き直し忘れてしまいました。もう少し手を加えようと思ってたのでテスト動作してませんでした。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
皆さん真剣な回答が多いですが、 A1セルに2005/7/25といれ、書式ーセルーユーザー定義でyyと入れると「05」になりました。 これをVBAでNumberFormatで設定できます。 質問では、はじめは「「05」のように表示!したいのですが」とありますが、後半では値を「02」という値にしたいとなっています。 値を変えるのか、表示だけでいいのか、あいまいな質問が多い。 後半をふまえ Sub test01() a = #1/25/2005# x = Array("", "JAN-JAN", "FEB-FRB", ・・・) b = DateSerial(Year(a), Month(a) - 1, 1) MsgBox b s = Format(Year(a), "yy") & Format(Month(b), "00") & x(Month(b)) MsgBox s End Sub ではダメかな。 1月でも前月12月を返してくれるDateSerialを使うことで 短くなり、月英字をテーブル化することで自由度が増します。 短くすることを考え、取り急ぎ、十分テストできてないので誤り(ボロ)あればすみません。
お礼
ご回答ありがとうございます。 すいません、回答とお礼を繰り返すうちにいろいろ深い話になってしまってます。 当初の年号2桁(「2005」→「05」)はすでに解決していますが、単月のセルに今月ならば「05/06 JUN-JUN」、累月のセルに「05/06 APR-JUN」と当日の日付から自動で入力し(累月は半期ごと,表記上5~9月はAPRから、11月~3月はOCTから)、そのうえ、期の変更が有る月(表記上の4月と10月)の累計は前の期の累計(4月はOCT-MAY、10月はAPR-SEP)が入ります。 今はこの後半部分の累月が自動でどうにかならないかなと話が進んでいる状態です。(一応自分で書いてみたのですが長くてどうにかなるのなら短くしたいと考えています) >質問では、はじめは「「05」のように表示!したいのですが」とありますが、後半では値を「02」という値にしたいとなっています。 値を変えるのか、表示だけでいいのか、あいまいな質問が多い。 とのことですが、後半の「02」とはどこのことでしょうか?なにか勘違いさせてしまったのなら申し訳ありません。 あとご教授いただいたVBAを試してみたのですが、 s = Format(Year(a), "yy") & Format(Month(b), "00") & x(Month(b)) のところでデバックがおきてしまいました。 ありがとうございました。
補足
s = Format(Year(a), "yy") & Format(Month(b), "00") & x(Month(b)) のデバックですが、 x = Array("", "JAN-JAN", "FEB-FRB", ・・・) を全部書かなかったため、有効値がなくて起こったみたいです。a=を2月にしたらちゃんとでました。 今回はhana-hana3さんの構文を使わせていただきました。 ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。Wendy02 です。 ちょっとややこしいですね。Format でとっても、この場合は、あまり意味がないような気がしました。うまく取れているのか、ちょっと分かりませんので、 d = Month(Date) ここに数字を入れて試してみてください。 Sub testsample3() Dim strDate1 As String, strDate2 As String Dim d As Integer, m1 As String, m2 As String, m3 As String d = Month(Date) m1 = ChangeMonth(d - 1) strDate1 = Format$(Date, "yy/") & Format$(d - 1, "00 ") & m1 & "-" & m1 If d = 5 Or d = 11 Then '5月と11月の特例 m2 = ChangeMonth(d - 2, 5) m3 = ChangeMonth(d - 2) strDate2 = Format$(Date, "yy/") & Format$(d - 2, "00 ") & m2 & "-" & m3 Else '通常の月 m2 = ChangeMonth(d - (d + 2) Mod 6) strDate2 = Format$(Date, "yy/") & Format$(d - 1, "00 ") & m2 & "-" & _ m1 End If With Workbooks(2).Sheets(1) .Range("A25,C25").Value = strDate1 .Range("A26,D26").Value = strDate2 End With End Sub Private Function ChangeMonth(ByVal arg1 As Integer, Optional arg2 As Integer) As String Dim myMonths As Variant myMonths = Array("JAN", "FEB ", "MAR", "APR", "MAY", _ "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC") ChangeMonth = myMonths((CInt(arg1) + 11 - arg2) Mod 12) End Function
お礼
早速試してみたのですが、10月のときに累月が「05/09 OCT-SEP」になってしましたました。後、同様に3月に「05/03 APR-MAR」になりました。どちらとも4月、11月分でやるとうまくいきます。 また、1月に前年の12月になるはずが、「05/00」になってしましたました。式が複雑すぎて原因が皆目わかりません。 今のところ#6の回答のように作成しております。 長いのが気になります。 ご回答ありがとうございました。
- hana-hana3
- ベストアンサー率31% (4940/15541)
#5の訂正です。 '(ちなみに期の変更時(4月データと10月データ。データを扱うのは5月と11月)は '前の期の累計が入るため4月データの累月はOCT-MAYと表記しなければなりません。) 対応してみました。(怪しいかも・・・・) Dim start, fDate d = Month(Date) If d > 5 And d <= 11 Then start = "APR" Else start = "OCT" End If fDate = DateAdd("m", -1, Date) '1ヶ月前の日付 a.Value = StrConv(Format(fDate, "yy/mm mmm-mmm"), vbUpperCase) If d = 5 Or d = 11 Then fDate = DateAdd("m", -2, Date) '2ヶ月前の日付 b.Value = StrConv(Format(fDate, "yy/mm " & start & "-mmm"), vbUpperCase)
お礼
早速試してみたいのですが、5月~11月まではうまくいくのですが、12月~4月は累月のOCTのCに年月が代入されてました。 ”05/03 O2005/03/26T-MAR”みたいな感じです。 d=Month("2005/04/26")にしたらこうなりました。 原因がいまいちわからないのですが、使えないみたいです。 これだけ短かったら良いなと思ったのですがうまくいかないものです。 とりあえず、下のように12月分を記入することで落ち着かせてますが、長いのが気になります。 ご回答ありがとうございました。 Dim a As Range Dim b As Range Dim d As Long Dim g As String g = CStr(Format(Year(Date), "yy")) If Len(g) = 1 Then g = "0" & g End If g = "'" & g d = Month(Date) Set a = Workbooks(2).Sheets(1).Range("C3,I3,Q3") Set b = Workbooks(2).Sheets(1).Range("F3,M3,T3,") If d = 5 Then a.Value = g & "/04 APR-APR" b.Value = g & "/03 OCT-MAR" ElseIf d = 6 Then a.Value = g & "/05 MAY-MAY" b.Value = g & "/05 APR-MAY" ElseIf d = 7 Then a.Value = g & "/06 JUN-JUN" b.Value = g & "/06 APR-JUN" ElseIf d = 8 Then a.Value = g & "/07 JUL-JUL" b.Value = g & "/07 APR-JUL" ElseIf d = 9 Then a.Value = g & "/08 AUG-AUG" b.Value = g & "/08 APR-AUG" ElseIf d = 10 Then a.Value = g & "/09 SEP-SEP" b.Value = g & "/09 APR-SEP" ElseIf d = 11 Then a.Value = g & "/10 OCT-OCT" b.Value = g & "/09 APR-JUL" ElseIf d = 12 Then a.Value = g & "/11 NOV-NOV" b.Value = g & "/11 OCT-NOV" ElseIf d = 1 Then g = CStr(Format(Year(Date) - 1, "yy")) a.Value = g & "/12 DEC-DEC" b.Value = g & "/12 OCT-DEC" ElseIf d = 2 Then a.Value = g & "/01 JAN-JAN" b.Value = g & "/01 OCT-JAN" ElseIf d = 3 Then a.Value = g & "/02 FEB-FEB" b.Value = g & "/11 OCT-FEB" ElseIf d = 4 Then a.Value = g & "/03 MAR-MAR" b.Value = g & "/03 OCT-MAR" Else End If End Sub
- hana-hana3
- ベストアンサー率31% (4940/15541)
>If d = 5 Then a.Value = "/04 APR-APR" b.Value = "/03 OCT-MAR" の処理はタイプミスですか? その処理をしていませんが、下記ではいかがですか? Dim start, fDate d = Month(Date) If d >= 4 And d < 10 Then start = "APR" Else start = "OCT" End If fDate = DateAdd("m", -1, Date) '1ヶ月前の日付 a.Value = StrConv(Format(fDate, "yy/mm mmm-mmm"), vbUpperCase) b.Value = StrConv(Format(fDate, "yy/mm " & start & "-mmm"), vbUpperCase)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >year(date)にしてしまうと、どうしても4桁になってしまうし整数型なので「05」という表記にできません。 もちろん、Formt 関数でしょうし、Format関数は、標準的には、文字型ですから、"yy" にすれば、「05」が返されますので、それを格納するときの変数を文字型にすればよいだけです。 >(月は当月-1の数値)月については12個しかないのでElseIF文で今月が7月だったら「"/06/ JUN-JUN"」と表記されるようにしました。 お話が今ひとつ見えてこないのですが、このような話をされているのでしょうか? Sub testsample() Dim myDate As Date myDate = DateSerial(Year(Date), Month(Date) - 1, 1) MsgBox Format$(myDate, "yy/mm mmm-mmm") End Sub
お礼
月が-1で出せました。すごいです。 あとは下のお礼でも書いたのでですが、付きの英語が大文字にならないでしょうか? あと、データは単月と累月があり、単月はこれでよいのですが、累月は「05/06 APR-JUN」のように半期ごとの月を入れなくてはいけません。(10月からOCT-になる) (「年/先月 始めの月の大文字3文字 -先月の大文字3文字」の表記になります) それを考えて、 d = Month(Date) Set a = Workbooks(2).Sheets(1).Range("A25,C25") Set b = Workbooks(2).Sheets(1).Range("A26,D26") If d = 5 Then a.Value = "/04 APR-APR" b.Value = "/03 OCT-MAR" ElseIf d = 6 Then a.Value = "/05 MAY-MAY" b.Value = "/05 APR-MAY" ElseIf d = 7 Then a.Value = "/06 JUN-JUN" b.Value = "/06 APR-JUN" ElseIf d = 8 Then a.Value = "/07 JUL-JUL" b.Value = "/07 APR-JUL" Else End If のようき12月分書こうかと思っていたのですが、(これのまえに年を入れようと思った) もっといい方法がありそうなのでもうちょっと考えてみます。 (ちなみに期の変更時(4月データと10月データ。データを扱うのは5月と11月)は前の期の累計が入るため4月データの累月はOCT-MAYと表記しなければなりません。) わかりにくくてすいません。 ご回答ありがとうございました。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>最終的に日付から「05/06 JUN-JUN」のように表示したいです。 MsgBox Format(Now(), "yy/mm mmm-mmm") Format関数で任意の日付書式が使えます。
お礼
月は先月分を表示したいと思います。 あと、英語の月は大文字で表記するよう決まっているのでどうにか「Jun」を「JUN」に変更する手立てはないでしょうか? ご回答ありがとうございました。
- nicnicnic
- ベストアンサー率47% (8/17)
はじめまして、こんな感じでいかがでしょうか。 パラメータにセルを指定すれば、使いまわせると思いますよ。 ~ここから~ Public Sub getYY() Dim strVal As String strVal = CStr(Format(Year(Date), "yy")) If Len(strVal) = 1 Then strVal = "0" & strVal End If Sheets("Sheet1").Range("A1").Value = "'" & strVal End Sub ~ここまで~
お礼
無事”05”で出せました。 ありがとうございます。 上記の回答でどうも月まで一気にだせそうな気配なので、出せなかったら使わせていただきます。 ご回答ありがとうございました。
- fly_moon
- ベストアンサー率20% (213/1046)
=Format(Date, "yy/mm") で"05/07"まで表示されます。 =Format(Date, "yy") なら"05"だけです。
お礼
これだと整数型なので5で出ちゃいました。 あと月は先月分のデータなので-1で出したいです。 ご回答ありがとうございました。
お礼
ご回答ありがとうございます。 試してみたのですが、2005年度には対応しますが、2006年度になっても「05」のままになっていました。 「Private Function」を使う構文はまだ勉強していないため、勉強不足ですみませんでした。ここまでくると応用の本を買わないとだめでしょうね(多少書いてありましたが、値を返すプログラムですか?) 結局、今回はhana-hana3さんの構文を使わせていただきますが、勉強のため参考にさせていただきます。一個一個見つめて理解してみます。 あと、ElseIf d = 11 Thenの部分は書き間違いでした申し訳ありません。 Workbooks()の件ですが、やはりインデックス番号で指定するのは、あまりよくないですよね。 しかし、扱ってるデータが37ファイルも(&マクロファイル1個)あるため一つのマクロを数ファイルに使用しています。そのため危ないと思いながらもインデックス番号でやってしまってます。(開いてはマクロを使用し閉じてます) でも、固定できる限りやはりちゃんと指定しようと思います。(マクロ用のファイルだけでも) ありがとうございました。
補足
お礼の補足です。 2006年度に対応しないと書いたのですが、 構文を確認したところ g = Format(Date - 31, "yy") の「Date」にテスト年月日を入れてないせいでした。 この構文は先月の年を出すってものだったのですね。