VBAで年月日の型変換するプログラム

このQ&Aのポイント
  • VBAを使用して、年月日の型変換をするプログラムを作成しています。
  • 入力された形式の年月日を指定した形式に変換し、別のシートに出力するためのプログラムです。
  • 具体的には、入力された形式が『平成18年 4月 1日( 土 曜日) 午前9時00分頃から  平成18年 4月 2日( 日 曜日) 午後3時00分の間』の場合、 『18. 4. 1. 9:00』と『18. 4. 2. 15:00』の形式に変換して出力します。午前・午後は24時表記に変換され、全角文字は半角に変換されます。
回答を見る
  • ベストアンサー

VBAで年月日の型変換するプログラム

現在VBAで年月日の型変換するプログラムを作成しています。 やりたい内容はシート1の『A1』セルに例えば 『平成18年 4月 1日( 土 曜日) 午前9時00分頃から  平成18年 4月 2日( 日 曜日) 午後3時00分の間』 と入力されているのでそれをシート2では 『18. 4. 1. 9:00(改行) ~(改行) 18. 4. 2.15:00』 という風に型変換して入力したいです。ボタンを押すとコピーするようになっているのですが、現在、 Sheet2.Cells(rng.Row, 1).Value = Sheet1.Range("A1").Value という風にプログラムを組んでいます。(A1を 判別した行の1列目に挿入といった内容) これだとそのままの状態をコピーなので、なんとか型返還させたいです。助けてください。 ちなみに午前・午後というものがあるのでそれは24時表記にしたいです。 それと型変換では半角にしたいです。 例外で 『平成18年 4月 1日( 土 曜日) 午前9時00分』のみの時もあるのでそのときは 『18. 4. 1. 9:00』だけ入力できればいいのですが・・・ なんとか力を貸していただけないでしょうか? 本当にお願いします。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>スペースが多すぎたり スペースとかは、パターンに吸収させることができるかもしれません。 または、前処理としてスペースをReplace 等を使って取り除いておくといいかもしれません。 >型があわなかったり Set matches = regEx.Execute(dateTxt) の後で If Matches.Count = 0 Then MsgBox "パターンに合致しません" Else ' マッチした時の処理 End If のように Matches.Count の値が 0 の時にはパターンに合致しなかったことが判別できます。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1>右側をどのように変更したらよいのでしょうか? そのまま使うなら、 Sheet2.Cells(rng.Row, 1).Value = convertDate(Sheet1.Range("A1")) のようにすればいいです。 なんだったら、 r As Range を dateStr As String に変えて r.value を dateStr に変更すれば Sheet2.Cells(rng.Row, 1).Value = convertDate(Sheet1.Range("A1").Value) のようにできます。 お好みでどうぞ。

isa_isa
質問者

補足

返事が遅れてしまいすいません。本当に助かりました。!!すごくうれしいです。 一つ質問してもよろしいでしょうか? ちゃんと型変換もでき、私のやりたかったことができました。! それでエラー処理として、まったく違う文字をうってしまったり スペースが多すぎたり、型があわなかったりすると、エラーになってしまいます。 このときにエラーメッセージとして 『スペースが多いか、型が違います』みたいなエラーメッセージを出してやり直しを促すような処理をほどこしたいのですが、 どのプログラムの部分をどう追加すればよいのかわからず 悪戦苦闘しております。どうかお力をかしていただけないでしょうか。 お願いします。困っていまして・・

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

ユーザー定義関数として作成してみました。 標準モジュールに置いて下さい 適当なセルで =convertDate(Sheet1!A1) のように使います。 セルの書式設定の配置で折り返して全体を表示するにチェックを付けて置いて下さい。(分までが入るセル幅にしておきます) ---------------------------------------------------------------- Public Function convertDate(r As Range) As String Dim dateTxt As String Dim regEx, matches, match Dim startDate As String, endDate As String dateTxt = StrConv(r.Value, vbNarrow) '数値を半角に Set regEx = CreateObject("VBScript.RegExp") regEx.Global = True regEx.Pattern = "(\d+).+?(\d+).+?(\d+).+?(午前|午後)(\d+).+?(\d+)" Set matches = regEx.Execute(dateTxt) Set match = matches(0) With match startDate = .SubMatches(0) & ". " & .SubMatches(1) & ". " & .SubMatches(2) & ". " & _ .SubMatches(4) + IIf(.SubMatches(3) = "午後", 12, 0) & ":" & .SubMatches(5) End With If matches.Count > 1 Then Set match = matches(1) With match endDate = .SubMatches(0) & ". " & .SubMatches(1) & ". " & .SubMatches(2) & ". " & _ .SubMatches(4) + IIf(.SubMatches(3) = "午後", 12, 0) & ":" & .SubMatches(5) End With Else endDate = "" End If If endDate = "" Then dateTxt = startDate Else dateTxt = startDate & vbLf & "~" & vbLf & endDate End If convertDate = dateTxt End Function

isa_isa
質問者

補足

私の作成した Sheet2.Cells(rng.Row, 1).Value = Sheet1.Range("A1").Value の右側を変えるのと、他にBLUEPIXYさんが考えてくださったプログラムをまるまる今のプログラムに当てはめることでやってみたいと思いますが、セルにいれるのではなく=の右側をどのように変更したらよいのでしょうか? Sheet2.Cells(rng.Row, 1).Value =convertDate(Sheet1!A1) という使い方でいいのでしょうか? 教えてください。 本当に困っていてBLUEさんのお力をかりたいです。

関連するQ&A

  • 和暦、西暦の変換について(VBA)

    こんにちは、VBAで西暦年から和暦年への変換でエラーが出て原因がよく分かりません。 下のようにして、変換してやろうとしてもyear1,month1,day1の型が違いますとかのエラーが出て、変数の型をInteger、String、 Variantでとろうとしてもエラーばかりです、宜しくお願いします。 もっと簡単に出来る方法があると思うのですが、よく分かりません。 曜日まで「平成○年○月○日(木)」というような表示形式にしたいのです。 year1 = Year(Format(Calendar1_F.Value, "yyyy/m/d/(aaaa)")) month1 = Month(Format(Calendar1_F.Value, "yyyy/m/d/(aaaa)")) day1 = Day(Format(Calendar1_F.Value, "yyyy/m/d/(aaaa)")) youbi1 = Right(Format(Calendar1_F.Value, "yyyy/m/d/(aaaa)"), 4) - Right(Format(Calendar1_F.Value, "yyyy/m/d/(aaaa)"), 3) TextBox3.Value = "平成" + (year1 - 1988) + "年" + month1 + "月" + day1 + "日" + "(" + youbi1 + ")"

  • VBA(エクセル)で『17.10.11』を『平成17年10月11日』の変換出力

    エクセルのVBAでプログラムをつくりました。 その内容はシート1でいくつかセルに値を入力した後、 マクロを実行すると指定したセルのそのままの内容が、シート2へコピーされるというものです。 そこで『日付』を入力する欄があるのですが、 そこには『17.10.11』と入力する欄があるのです。 これをシート2へコピー出力するときに 『平成17年10月11日』という風に方変換して 出力したいのです。どうすればいいでしょうか? どうか教えていただけたらうれしいです。 ちなみにコピープログラムはこんな感じにしています s.Cells(r, 1).Copy Sheets("Sheet2").Range("A1") A1セルに日付を入れる欄があるのでここを型変換して出力したいのです。助けてください。

  • EXCELのVBAで連続コピーの方法をお願いします

    1月    1日  2日   3日  4日   加藤   午前  午後  午前  午後  (A2セル B2 C2 D2 E2セルに書込み) 鈴木   午後  午前  午後  午前  (A3セル B3 C3 D3 E3セルに書込み) SHEET1にエクセルの表を作成した後にSHEET2のA1からコピーをしSHEET1のデータは消し、次に SHEET1に2月の表を作成した後にSHEET2の1月の最後の次にコピー(すなわちA4) 以後3・4・5月と連続してコピーしたいのです。ひとことで言いますと1月から作成したリストを連続で残して置きたいのです。 宜しくお願いいたします。 エクセルは2007 と2003両方でお願いします 表現が悪くてすいません

  • <出来ない?> 別々のセルに年月日を入力し、曜日の自動計算

    A1に年(平成)、B1に月、C1に日を入力し、D1に曜日を自動で表示できますか?自分なりに色々調べましたが、年月日を別々のセルに入力してしまうと、曜日の自動計算は出来ないようでしたので、教えてください。よろしくお願いいたします。

  • EXCEL2003 日付関数で曜日を入れたい

    宜しくお願いします。EXCEL2003です。 シート1   平成20年4月 シート2   平成20年5月 シート3   平成20年6月 …       … 平成21年3月までのシート1~シート12まであります。 日付関数を使って曜日を入れたい。そして、土曜日・日曜日・休日のところのA列(日)B列(曜日)C列(摘要)の3列を塗りつぶしたいのですが出来ますか。宜しくお願いします。 シート1の A1に4月と入っています。 A2~A32まで1~30まで日にちが入っています。 B2~B32のところに平成20年4月の曜日を入れたい どのようにしたらよいのでしょうか。 シート2以降はシート1の複写です。ですから同じ位置に曜日が入るようになっています。 宜しくお願いします。

  • エクセルVBAで、期間内にある指定した数字を自動入力

    下のように月日(A列)のみが書いてある表があります。 ここに定価を自動入力させたいと考えています。 ただ条件が複雑で・・・。 期間内にあるもので、曜日により値を振り分けする必要があります。 例えば、 ■月日(from) 3/1 ■月日(to) 3/3 ■値 土・日・・・500    月・・・・・450 このような条件で、下の[入力前]の表の「値」の列に [入力前] 月日  曜日   値 3/1    (土) 3/2    (日) 3/3    (月) 3/4    (火) 3/5    (水) 3/6    (木) 下のようにそれぞれ入力させたいのです。 [入力後] 月日  曜日    値 3/1    (土)    500 3/2   (日)    500 3/3    (月)    450 3/4    (火) 3/5   (水) 3/6    (木) どこかのスペースに ■月日(from) 3/1 ■月日(to) 3/3 ■値 土・日・・・500    月・・・・・450 このような条件入力をするところを設けて、マクロを実行すると入力するようにしたいのですが、こんな複雑な振り分け設定ってVBAでもできるでしょうか?

  • VBAプログラムを教えてください

    Sheet1のA1セルに○と入力した時にSheet2のB2~B10セルのデータをSheet1のA2~A10セルにコピーするプログラムを教えてください。

  • エクセルで各シートに日付・曜日一括表示するには

    (1)エクセルで7月31日分のシートをつくり、今年のカレンダーどおりの日付・曜日を(各シートのA1セルに、いちいち入力するのではなく)一括で各シートのA1セルに表示できる方法があれば、教えて下さい。 (2)エクセルで昨年7月の平日の数だけシートがあるファイルがあります。各シートのA1セルには、「平成19年7月○日(○曜日)」と入力されています。 このファイルを、今年の7月の平日カレンダーに一括置換するには、どうすればいいでしょうか? 昨年と今年は平日の日付はもちろん、同じ日でも曜日が違いますので、各シートを開き、いちいち日付・曜日を直さなければいけないのでしょうか。教えて下さい。宜しくお願いします。

  • VBAプログラムについて

    VBAプログラムを本を見ながら作成していますが、はっきりいって素人です。 本に載っていないこととなるとちんぷんかんぷんで、いくつかあるプロシージャのどのプロシージャ内に記入したら良いのか分からないし、新しいプロシージャをどこに記入して良いのか分かりません。 例えば、 ----------------------------------------------------------- Private Sub CommandButton1_Click() ActiveCell.Value = TextBox1.Value ActiveCell.Offset(0, 1).Value = TextBox2.Value ActiveCell.Offset(0, 2).Value = TextBox3.Value ActiveCell.Offset(0, 3).Value = TextBox4.Value ActiveCell.Offset(0, 4).Value = TextBox5.Value ActiveCell.Offset(0, 5).Value = TextBox6.Value ActiveCell.Offset(0, 6).Value = TextBox7.Value ActiveCell.Offset(0, 7).Value = TextBox8.Value ActiveCell.Offset(0, 8).Value = TextBox9.Value ActiveCell.Offset(1, 0).Activate End Sub Private Sub CommandButton2_Click() Unload Me End Sub Private Sub Label1_Click() End Sub Private Sub UserForm_Click() End Sub Private Sub UserForm_Initialize() Range("A2").Activate End Sub ---------------------------------------------------------- テキスト入力フォームをいくつか作っており、コマンドボタン1とコマンドボタン2で入力ボタンと閉じるボタンにしています。   このプログラムでは、入力ボタンをクリックすることでデータが入力されて、入力された列のすぐ次の列の最初のセルがアクティブな状態になります。 (1)データ入力済みのエクセルシートにおいて、アクティブな状態にしたセルや列を削除したい場合、どこにどのように書けば良いのでしょうか? (2)データ入力が一度に終わらない時、途中の任意の列から入力を始めたい場合はどこにどのように書けば良いのでしょうか? 本に書かれていることは丸写しできますが、ちょっとでも違うと壁にぶつかってしまいます。 独学で勉強する時に良いと思われる方法はどんな方法なのでしょうか? おこがましいですが素人も分かりやすい説明をして頂けると助かります。 宜しくお願いします。

  • VBA ! 教えて下さいっ

    事務で急きょ必要となり、本やNetで調べておりますが どうしても分からなくてこちらにたどり着きました。。。 下記分かりずらいかと思いますが,,,見積書作成の為の日付についてです。 どなたか、ご教示お願いします!!! ユーザーフォームに下記内容にて作成致しましたが(3)からのコードがうまく作成できません。 また、コードについておかしな所があればご指摘下さい。 ---------------------------------------------------------------------------- ≪見積書の日付≫ (1)契約日:             ⇒テキストボックス ⇒※(1)を入力したらSheet!A1へ転記 (2)締め日:10日、20日、30日  ⇒オプションボタン(フォームで囲んでます) ⇒※(2)を入力したらSheet!A2へ転記[オブジェクト名:Type10/Type20/Type30] (3)締められた日:      ⇒※ (1)(2)を選択した後にSheet!A4 へ転記  (4)経過した日数       ⇒※ (1)(2)を選択した後にSheet!A5 へ転記  (5)更新月           ⇒※ (3)より1か月後を(1)(2)を選択した後にSheet!A4 へ転記  ---------------------------------------------------------------------------- ((★(2)については10日を選択⇒契約日:2011/1/1の場合、締め日は当月の2011/1/10                     契約日:2011/1/11の場合は締め日は翌月の2011/2/10 のように、 契約日はお客様によって異なります。要は、締め日を過ぎた場合は翌月の締め日が転記される様にしたいのです。)) ====================== ≪コード≫ '契約日入力 Private Sub CommandButton1_Click() Range("A1").Value = TextBox1.Value If IsDate(TextBox1.Text) = False Then MsgBox "契約日を入力して下さい。 例 yyyy/dd/mm" Else End If If Type10.Value = True Then Range("A2").Value = "10" ElseIf Type20.Value = True Then Range("A2").Value = "20" ElseIf Type30.Value = True Then Range("A2").Value = "30" Else MsgBox "日を入力して下さい。 例 10.20.30 日" ' End If End Sub ====================== 宜しくお願いします。