• ベストアンサー

Format(strフォルダ名, "0000年0

vbaです。 strフォルダ名 = Format(strフォルダ名, "0000年00月00日") と strフォルダ名 = Format(strフォルダ名, "yyyy年mm月dd日") の違いは何でしょうか? 日付型にしたい場合、どちらを使えばいいですか? 2015年11月13日 のような形にしたいです。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

「VBAです」というが、アプリは、エクセル、アクセス、ワードその他ぐらい質問に書いたら。 違いがある場合が考えられる。 ーー エクセルの「日付型」というのは特殊です(日付シリアル値)知らない初心者が多いようだ。VBAをやるならそれぐらい知っておくべきだ。。質問者が「日付型」というのは、見た目(文字列が常識的に日付だとわかるところの、年月日の文字を年、月、日数字の中に入れたいのだろうが)のことだろうが、データ型としての日付型ではありえないと思うので、用語が紛らわしいので注意すること。 エクセルの場合はFormatはNumberFormatといい、元データ(の第1引数のデータは、「エクセルの日付型」(制限のある範囲の、整数か、または小数点付き数)に対してのものと思う。第1数が文字列はあり得ないのでは。 ーー strフォルダ名が具体的にどういう文字列内容か質問に書いて質問すること。 Format関数は、 http://www.tipsfound.com/vba/05format など読むこと 第1引数は文字列はあり得ない(許されない)だろう。 文字列に対しての編集は、使えそうなものが少ない。 根本的に勉強のこと。 Format関数は、文字列ーー>望む形で文字列の整形(年月日の挿入など)ーー>望む文字列を返す ではない!よ。 望むならMID巻数など使ってやることになろう 参考 Sub test02() a = "20151203" MsgBox Mid(a, 1, 4) & "年" & Mid(a, 5, 2) & "月" & Mid(a, 7, 2) & "日" End Sub ーー また フォルダ名の変更は http://www.239-programing.com/excel-vba/func/func077.html のようなことをするのですが、こういうのは知ったうえでの質問か? ーー 参考 日付の指定例。 2番目はおかしな結果になる。(そうなる理由は明白だが) Sub test01() MsgBox Format("2015/12/3", "yyyy年mm月dd日") MsgBox Format("2015123", "yyyy年mm月dd日") End Sub

SPQXVSCFSPA
質問者

お礼

ご回答ありがとうございました。

その他の回答 (3)

回答No.3

解答No.1です。追記します。 お訊ねになりたいのは、 元データの種類に呼応した 変換方法の条件分岐の仕方、なのかな? と思い直して、再レスします。 Access?であれば、ある程度は、 field.Type プロパティ等でも判別 出来そうですけれど、 案外、Like演算子の方が汎用的なようにも思います。 日付データがどんな種類のものかUnknowm という意味で、 4種類の日付をランダムに変数に格納する為の記述が Select Case ... End Select の6行で これはテスト用のスクリプトです。 実際の処理では、   d = ??? 1行で書ける筈のものの代用です。 If...Then ... ElseIf...Then ... End If の5行が、4種類の日付を条件分岐する 今回解答の趣旨になります。 想定していない値を受けるとエラーになるでしょうけれど、 その場合は、想定を拡げて条件分岐を工夫することになります。 不足があれば補足欄にでも書いてみて下さい。 ' ' /// Sub ReW9116611_j() Dim d Dim strフォルダ名 As String   ' ' ランダムに4種類の日付を変数に格納   Select Case Int(Rnd() * 4)   Case 0:  d = 20110101 ' 8桁数値日付   Case 1:  d = "20120202" ' 8桁表記文字列日付   Case 2:  d = "2013/3/3" ' "yyyy/m/d"文字列日付   Case 3:  d = DateValue("2014/4/4") ' 日付値   End Select   ' ' データの種類に合わせてyyyy年mm月dd日書式の文字列に変換。   If d Like "########" Then ' 8桁表記の日付(数値|文字列)ならば     strフォルダ名 = Format(d, "0000年00月00日") ' 数字の間に指定文字列を挿入   ElseIf IsDate(d) Then ' "yyyy/m/d"文字列日付または日付値ならば、     strフォルダ名 = Format(d, "yyyy年mm月dd日") ' 日付値を整形   End If   MsgBox strフォルダ名 End Sub ' ' ///

SPQXVSCFSPA
質問者

お礼

ご回答ありがとうございました。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

>日付型にしたい場合、どちらを使えばいいですか? 何を日付型にしたいのですか。そもそも何がどーなってて一体何をシタイのか、ご質問の事例では全くイミフメイですが。 作成例:日付型を使うなら dim d as date dim s as string d = date s = format(d, "yyyy年mm月dd日") debug.print d, s 作成例:日付型を一つも使わない(あなたのマクロ) dim s0 as string dim s as string s0 = date  'VBA任せの暗黙の型変換 s = format(s0, "yyyy年mm月dd日") ’同上 debug.print s 作成例:あなたのマクロから勝手に推測 dim s1 as string dim s as string s1 = "20151113" '元データの形式がナイショなので答えようが無い例 s = format(s1, "0000年00月00日") debug.print s1, s

SPQXVSCFSPA
質問者

お礼

ご回答ありがとうございました。

回答No.1

こんにちは。 "str"と修飾子が付いていますので 文字列型を想定しているものと思われます。 日付が"20151113"ならば、 数字の間に指定文字列を挿入する意味の Format(strフォルダ名, "0000年00月00日") 日付が"2015/11/13"ならば、 日付値を整形する意味の Format(strフォルダ名, "yyyy年mm月dd日") です。 普通はこういう場合、Variant型を使う方が後々無難かも、です。 ' ' /// Sub ReW9116611() Dim strフォルダ名 'As String   strフォルダ名 = "20151113"   strフォルダ名 = Format(strフォルダ名, "0000年00月00日")   MsgBox strフォルダ名   strフォルダ名 = "2015/11/13"   strフォルダ名 = Format(strフォルダ名, "yyyy年mm月dd日")   MsgBox strフォルダ名 End Sub ' ' ///

SPQXVSCFSPA
質問者

お礼

ご回答ありがとうございました。

関連するQ&A