• 締切済み

VBAでの日付の置換方法を教えてください

Excel2007のVBAにて日付の置換ができなく困っております。 対象の複数列に入力されている下記の様なデータの内、日付の"yyyy/m/d"を "yyyy年m月d日"に置換しなくてはなりません。 ※書式設定ではなく、文字列として変換 入力例 1)2011/12/13 2)2011/12/1~2011/12/13 3)2011年12月13日 4)2011/12/1~2011/12/13の毎火曜 ヒントでも構いませんので、宜しくお願い致します。

みんなの回答

  • foomufoomu
  • ベストアンサー率36% (1018/2761)
回答No.11

No.2です。 >残念ながら今回はformatの問題ではなく、文字列に変換しなくてはならないのです。 言っている意味が分かりません。 No.2にかいた方法は、変数sに文字列として結果が得られるのですが。 月や年をまたがって、「毎週」などの計算をするとなると、Dateとして計算したほうが、格段にプログラムが簡単になります。 No.10にも書いてありますが、Formatの意味が分かってないのではありませんか。

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

置換という言葉を出すところを見ると、エクセルの日付の日付シリアル値と日付書式のことが判ってないのでは。 今見えているのは、日付シリアル値+日付書式(A)でそう見えている(+は設定とか適用するということ) それをyyyy年m月d日の日付シリアル値+表示形式(B)にすれば仕舞い。 文字列に出したいならFormat関数で第2引数をyyyy年m月d日にすればよい。 もしセルの値が文字列なら、まず日付シリアル値に変換することを目指すべきだ。日付シリアル値に出来ればFormat関数で、それに前記の表示形式の文字列yyyy年m月d日を指定すればしまい。 VBAならIsDate関数で日付かどうか判別(だめならVarType関数での判別(日付は7)もやってみて) ・日付シリアル値ー>Format関数 ・文字列の分は、DateSerial関数の利用で日付シリアル値化ー>Format関数 で出来なしかやってみてください。 ~があるものは~で2つに分離し、2つの部分それぞれで考えてFormat関数を使い、2つを X & "~" & Yで結合する。 ーー 場合分けが多数になるかも知れないが、やむをえない。 ーー 自分のコードで日付をいじくらないほうが良い。MSエクセルに任せるべき。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.9

面白そうなので私も…… 全部文字列で入っていると仮定して、とっても強引な力技で置換をかけてます。 Sub Sample()   Dim sBefore, sAfter   Dim i As Date   Cells.Select   '12/31~1/1へと遡る(うるう年も考慮)   For i = DateValue("2012/12/31") To DateValue("2012/1/1") Step -1     'mm/ddのパターンを置換     sBefore = Format(i, "/mm/dd")     sAfter = Format(i, "年m月d日")     Selection.Replace What:=sBefore, Replacement:=sAfter        'm/dのパターンを置換     sBefore = Format(i, "/m/d")     sAfter = Format(i, "年m月d日")     Selection.Replace What:=sBefore, Replacement:=sAfter   Next i End Sub

  • matyu1003
  • ベストアンサー率42% (257/598)
回答No.8

1と3だけですが、表に =TEXT(データの入っているセル,"yyyy年mm月dd日") の式で、文字列型に変換できます。この結果をVBAで拾えばよいでしょう。

回答No.7

Dim I As Integer Dim strBefore(3) As String Dim strAfter As String strBefore(0)= "2011/12/13" strBefore(1)= "2011/12/13~2011/12/14" strBefore(2)= "2011年12月13日" strBefore(3)= "2011/12/13~2011/12/14の毎火曜" For I = 0 To 3   strAfter = XferFormat(strBefore(I))   Debug.print strAfter Next I ------------------------------ イミディエイト ------------------------------ 2011年12月13日 2011年12月13日~2011年12月14 2011年12月13日 2011年12月13日~2011年12月14日 XferFormat()の手続きは6ステップ 1、変換前文字列の"日"を""に変換し変換後文字列変数に代入。 2、変換後文字列の年に相当する数字の後に"年"を挿入する。 3、挿入に続く文字が"/"なら消去して変換後文字列変数に代入。 4、変換後文字列の月に相当する数字の後に"月"を挿入する。 5、挿入に続く文字が"/"なら消去して変換後文字列変数に代入。 6、変換後文字列の日に相当する数字の後に"日"を挿入する。 変換後文字列の年に相当する数字=>先頭から1文字づつ調べてフラッグを立てる。 このフラッグの値を手がかりの月や日に相当する数字を判定する。 これなら、如何なる形式のデータにも対応すると思います。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.6

一案です。 入力日付は文字列である事が前提です。 (1)配列を定義する ArrayかSplitで配列定義("年", "月", "日","年", "月", "日") (2)対象範囲をFindで最初のレンジをセーブ、FindNextでこのレンジと同一まで    検索を繰り返す (3)検出したセルをInsterで「/」を検索、見つかれば、配列(カウンタ)で    順次置換、Instrの結果が0以上の間、置換処理を繰り返す    因みにカウンタは0相対で「/」の置換毎に+1

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

まぁ難しく考えずに簡単なチカラワザで。 Sub macro1()  Dim h As Range  Dim s As Long  Dim e As Long  Dim res As String  Set h = Cells.Find(what:="/", LookIn:=xlValues, lookat:=xlPart)  Do Until h Is Nothing   res = " " & h.Text & " "   s = InStr(res, "/")   e = s   Do   s = s - 1   Loop Until s = 0 Or Mid(res, s, 1) Like "[!/0-9]"   Do   e = e + 1   Loop Until e = Len(res) Or Mid(res, e, 1) Like "[!/0-9]"   res = Application.Replace(res, s + 1, e - s - 1, Format(Mid(res, s + 1, e - s - 1), "yyyy年m月d日"))   h = Mid(res, 2, Len(res) - 2)   Set h = Cells.FindNext  Loop End Sub

noname#217196
noname#217196
回答No.4

Excel VBAでも正規表現が使えるはず(標準で備わっているか別途組み込みかは忘れました)なので検索用マッチパターンを書いてパターンマッチ変数の値参照して置換で、できると思います。 検索用マッチパターンにXBNF記法を使えます。元データが十の位を0埋めしているほうがマッチパターンを書くのは楽ですが、それほど難しくはないでしょう。 前提としては、元データに/区切りのパターンに年月日以外のまぎらわしいものが混じらないこと、西暦年の範囲がはっきりしていること、ワークシートセル以外の置換は対象外が担保されれば十分だと思います。 なお単純にただひとつの日付データが入力されているセルに関しては、日数計算用データやファイル名データとして別のセルやマクロで使われている可能性があるので、置換してしまってからトラブルが起きないよう、念入りに仕様を検討するほうが好ましいでしょう。

noname#158634
noname#158634
回答No.3
  • foomufoomu
  • ベストアンサー率36% (1018/2761)
回答No.2

一度、DATE型変数に入れてから変換する方法は、うまくできないのですか? Dim d as date Dim s as string d="2011/12/13" s=Format(d, "yyyy年m月d日") で、sに結果が得られます。

anuragi
質問者

補足

回答有難うございます。 残念ながら今回はformatの問題ではなく、文字列に変換しなくてはならないのです。 すみません。

関連するQ&A

  • 日付でデータを抽出したい

    A列には2007/10/1~2007/10/31と入力されていて B列にはランダムに数字が入っています。 yyyy/m/d~yyyy/m/dまでのB列の平均を求めたいです。 「yyyy/m/d」(検索する日付)は常に変えられるようにしたいです。 オートフィルタのオプションでも出来るのですが 値を求めて別セルに入力したいため それ以外の方法が知りたいです。 A列yyyy/m/dに隣接するB列の値だけなら VLOOKUP関数で求めたい日付をC1に入れて =VLOOKUP(C1,A:B,2)で求められるのですが 「yyyy/m/d~yyyy/m/d」の求め方がわかりません。 よろしくお願いします。

  • SUMIFSに日付を使いたいのですが…

    どなたか助けて下さい。 現在のデータとして複数のシートがあり、年月で纏める為にSUMIFSを使おうと考えております。 1枚目のシートには日付が打ち込んであり、年月日まで入っています。(yyyy/m/d) Sheet1 A                 B 2008/11/29(yyyy/m/d)  30 2008/12/29(yyyy/m/d)  50 2008/12/31(yyyy/m/d)  100 2枚目のシートには年月が入力されてあり、「200812」と数字が入っております。 A       B 200812   ? 最終的には2枚目のBに12月の合計を纏めたいので、1枚目の日付を変更したいのですが 書式設定の表示形式のユーザー定義で「yyyymm」にすると表示は「200812」 ですが、当り前の事ながら、データとしてはそのように反応してくれません。 (合計値として150となるようにしたい) そこで、これをどのように結び付けるのか、また別の方法があればと思い どなたか教えて頂ければ幸甚です。

  • ショートカットキーで日付入力時の書式設定法 excel

    EXCELでは""Ctrl""+"";"" で現在の日付が [yyyy/m/d]形式にて簡単に入力可能です。 この際の書式を変更したいです。現状、西暦が4桁も場所をとり、文字列としてもっと短くしたいのです。 当サイト内で”日付 ショートカット、EXCEL、 書式”などの単語で検索してみましたが、なかったです。またエクセルのツール>オプションのダイアログも見ましたが、不明でした。なるべくマクロを使わない方法で探しています。宜しくお願いします。

  • Excel日付 0M/0D/YYYY

    Excel2003です。 SAPからデータを持ってくるとSAPの設定上、1~9月、1日~9日が0M/0D/YYYYで入ってきて、これをYYYY/MM/DDまたはYYYY/M/Dの書式に変更することが出来ません。 これはどうにかならないのでしょうか? 関数で何とかなりますか?

  • excelのvbaを使って日付を置換したいのです

    こんにちは。いつも質問ばかりですみません。 今、excell の VBAの勉強をしているのですが、たとえば、B列に2004/5/3 とか、2004/5/5とか、5月の日付ばかりはいっていたとして、その2004/5の部分を2004/6に置換したいとします。 それを、マクロでやらせてみて、VBAを見ると Sub Macro9() Cells.Replace What:="2004/5", Replacement:="2004/6", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End Sub のようになるのですが、このプロシージャーを実行しても、うまく置換できません。 どのように記述したら、できるのか、教えていただけるとうれしいです。 よろしくお願いいたします。

  • アクセスで日付の書式が書き直されます。

    Access97での書式で日付についてお尋ねします。 テキストボックスの書式で、 yyyy\年mm\月d\週 と入力すると、強制的に yyyy"年"mm"月"d"週" となってしまい、表示も本来 2007年08月1週 となるところ、 2007mm月d週 と成ってしまいます。 このファイルをAccess2002で開くと、 yyyy\年mm\月d\週 のままです。 Access97の設定に寄るもではないかと思うのですが、分かりません。 どなたか、ご存じの方がいらっしゃれば、ご教授の程、お願いいたします。

  • EXCEL 日付表示について

    EXCELのセルに「2009/3/1 16:15」と表示されています。 (実際には「2009/3/1 16:15:00」と入力し、セルの書式設定のユーザー定義で「yyyy/m/d h:mm」と設定しています。) このセルの「2009/3/1」だけ抜き出したいと思っていますが関数など、いい方法はないでしょうか。 実は、このセルの列には他に「2009/3/1 11:51:03」のようなセルがありまして、ピボットテーブルで日付別件数を出したいと考えています。 よろしくお願いいたします。

  • VBA:日付をシリアル値にできるの関数教えてください。

    VBAにより、あるセルに"yyyy / mm / dd hh:mm:ss"のフォーマットで日付を記入しました。それを手動で書式を標準にすると例えばシリアル値38148.4768981481になります。これをVBA上でできる関数を知りたいです。つまり、日付をシリアル値にできるVBAの関数を教えて頂きたいです。宜しくお願いいたします。

  • Excel VBAでの日付検索について

    Excel VBAでの日付検索について Excelに下記のように1時間おきの日時(A列)と値(B列)が数か月分入力されています。 UserFormで入力された月の、日別の合計した値を別ブックに出力したいと思っています。 A列の日時は、セルの書式設定でユーザ定義の「yyyy/m/d hh:mm」となっています。 例)UserFormで8月と入力されたら、8/1の0:00~23:00の値(B列)を合計し、別ブックへ出力し、それを月末(8/31)分まで繰り返し計算し出力したい。 A            B 2010/8/1 0:00       345.5 2010/8/1 1:00       309.4 2010/8/1 2:00       364.2 :       : :       : :       : 2010/8/1 23:00       359.0 2010/8/2 0:00       339.9 2010/8/2 1:00       357.3 現在、下記のようなVBAにして、UserFormで入力された月の1日のデータが入力されている行番号を取得 しようとしているのですが、うまく検索されません。 どなたかご教授下さい。 Dim Obj As Object Dim HitRow As Long Dim Cerday As Long Dim myDay As Date myDay=txt_年.Value & "/" & txt_月.Value & "/1" Cerday=DateValue(myDate) Set Obj=Worksheets("sheet1").Cells.Find(Cerday,LookAt:=xlwhole) If Obj Is Nothing Then MsgBox "見つかりません。" Else HitRow=Worksheets("sheet1").Cells.Find(Cerday,LookAt:=xlwhole).Row End If

  • エクセル 日付、数字の入力方法

    エクセル2002を使用 ○日付の入力方法 2009/09/04と入力したい。0が消える。 セルの書式設定、ユーザー定義でYYYY”年”m”月”d”日”でも0が消える。’で文字化はしたくない。 ○数字の入力 数字の前に0がある 例:000012340 これも当然数字の前の0が消える。’で文字化はしたくない。 どのようにセルの書式設定をすればよろしいでしょうか?

専門家に質問してみよう