• ベストアンサー

VBAでセルの中のタイトル文から日付部分だけ抽出

エクセルのVBAで、セルの中のタイトル文から日付部分だけを抜き出そうと考えているのですが、 うまくいきません。 正規表現でうまくできないか悪戦苦闘してますが、お手上げです(汗) やりたいとことは 「こちらの文章は4/5に作成しました。」 「こちらの文章は4/5に作成しました。」 「こちらの文章は04/05に作成しました。」 「こちらの文章は4月5日に作成しました。」 「こちらの文章は4月5日に作成しました。」 の日付(4月5日)だけ抽出して全て04/05に変換となります。 分かる方、お手数ですが、ご教授お願いします><

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

>お手上げです 正規表現のパターンですか? 使い方ですか? 以下を参考にしてください。 Function 抽出(ByVal 文字列 As String) As String Dim 正規表現 As Object Dim 一致集合 As Object Dim パターン As String パターン = "([\d0-9]+[//][\d0-9]+|" _       & "[\d0-9]+[月][\d0-9]+日)" Set 正規表現 = CreateObject("VBScript.RegExp") 正規表現.Pattern = パターン Set 一致集合 = 正規表現.Execute(文字列) If 一致集合.Count > 0 Then   一致部分 = 一致集合.Item(0).Value   '★日付として正しいかチェック   If IsDate(一致部分) Then     抽出 = 一致部分   End If End If End Function パターンは「nn/nn」または「nn月nn日」という もので、nnは半角または全角の数字1個以上を 示します。

その他の回答 (1)

  • plus_x
  • ベストアンサー率62% (10/16)
回答No.1

全然きれいじゃないですが、動けば良しの精神で。 A1セルに入力してある文字から、日付を抽出してB1セルに入れます。 変換もVBAですると更に長くなるので、書式で対応しました。 Sub TEST() Dim テスト, 結果, パターン As String, レンジ As Range Set テスト = CreateObject("VBScript.RegExp") With テスト パターン = "\d?\d/\d?\d" .Pattern = パターン .IgnoreCase = True .Global = True Set 結果 = .Execute(StrConv(Cells(1, 1), vbNarrow)) If 結果.Count > 0 Then Cells(1, 2).Value = 結果(0).Value Cells(1, 2).NumberFormatLocal = "mm/dd" Else パターン = "\d?\d月\d?\d日" .Pattern = パターン Set 結果 = .Execute(StrConv(Cells(1, 1), vbNarrow)) If 結果.Count > 0 Then Cells(1, 2).Value = 結果(0).Value Cells(1, 2).NumberFormatLocal = "mm/dd" Else MsgBox "日付がみつかりません" End If End If End With End Sub

malonchan256
質問者

お礼

plus_x様 ご回答ありがとうございました! 一つ一つ内容を確認していき、理解することができました^^

関連するQ&A

  • 日付の抽出

    表計算ソフト(CalcとかExcel)を使って セルに、〇何年/△月/曜日 を入力すると 該当する日付を抽出したいのです。 (月と、曜日は複数) 1/1から12/31まで、日付を並べて、weekday関数を使うと 見えるのですが、必要な日だけ、画面内に収めたく 抽出する方法がわかると、助かります。

  • VBAで期間でデータを抽出するには?(Excel2003)

    いつも助けていただきありがとうございます。 Excel2003でデータベースを作成しました。 「日付」のところには、2008/11/18という形式で入力していますが、 VBAでフォームから「○○○○年○月~○○○○年○月までを抽出」として、 該当レコードを抽出するにはどうしたらよいでしょうか? いろいろ試してはみたのですが、よい方法・アイディアができませんでした。 VBA初心者です。よろしくお願いします。

  • vbaの正規表現で、マッチした一部分を抽出したい

    accessの正規表現で、マッチした部分の一部を取り出したいと思っています。 秀丸で言えば、 ------------------------ 文字列 あいうえお ↓↓↓ 正規表現 あ(.*)お 置き換え文字 \1 ↓↓↓ 抽出 いうえ ------------------------ って感じの「¥1」みたいなのがほしいと考えています。 現在、下記のような感じで、対象文字を抽出しています。 ここから、また正規表現でほしい部分を抽出しなければいけないのでしょうか? 【上の例で言えば、「あいうえお」を抽出する関数】 ------------------------ Function 抜き出し(ByVal 指定文字列 As String) As String Dim 正規表現, 一致集団, 一致要素 Set 正規表現 = CreateObject("VBScript.RegExp") 正規表現.Pattern = "購入日時[0-9]{4}年[0-9]{1,2}月[0-9]{1,2}日 [0-9]{1,2}時[0-9]{1,2}分" 正規表現.MultiLine = True Set 一致集団 = 正規表現.Execute(指定文字列) For Each 一致要素 In 一致集団 抜き出し = 一致要素.Value Exit For Next End Function ------------------------ これだと、 購入日時2012年1月25日 17時53分 がマッチします。 でもほしいのは、 2012年1月25日 17時53分 の部分だけ。 何かいい方法は無いでしょうか? よろしくお願いします。

  • Excel VBAで日付を曜日に変換したい。

    Excel VBAで日付を曜日に変換したい。 A1セル:2010/6/2 を B1セル:水 とするには、Excel VBA ではどうすればいいのでしょうか?

  • VBAで日付についての質問

    お世話になります。 下記についてのVBA記述方法をご教示頂きたく 宜しくお願い致します。       記 1)20080924と言う日付が表示されているセルから   09の月だけを違うセルに表示する(取得)方法 2)20080924と言う日付が表示されているセルから   一月減らして(200808)違うセルに表示する(取得)方法 3)20080924と言う日付が表示されているセルから   一月増やして(200808)違うセルに表示する(取得)方法

  • VBA フォームを使って、期間でレコードを抽出するには?(Excel2003)

    いつも助けていただきありがとうございます。 再質問です。(内容をまとめました。) Excel2003でデータベースを作成しました。 「日付」(B列)のところには、2008/11/18という形式で入力しています。 VBAで抽出用フォームから「○○○○年○月○日~○○○○年○月○日までを抽出」として、 該当レコードを抽出するにはどうしたらよいでしょうか? いろいろ試してはみたのですが、よい方法・アイディアができませんでした。 VBA初心者です。よろしくお願いします。 ちなみに試してみたのは、 期間抽出用フォームで、期間の始めと終わりの西暦・月・日をそれぞれ入力すると、いったんそれぞれのセルに入力され、 v5(開始月日用のセル)=T4&"/"&U4&"/"&V4(西暦・月・日がいったん入るセル) t5(終了月日用のセル)=W4&"/"&X4&"/"&Y4 としました。(表示では2008/11/19となりました。) そして、 Selection.AutoFilter Selection.AutoFilter Field:=2, Criteria1:=">=range("v5")", Operator:=xlAnd _ , Criteria2:="<=range("y5")" としたところ、エラーになりました。 どのように修正すればよいでしょうか?

  • エクセルVBA 日付で抽出、並び替え

    こういう場で初めて質問させていただきます。 どうぞよろしくお願いします。 エクセルVBAで日付(月毎)でデータを抽出し、並び替えを行いたいのですが, B列に日付が入りC~F列には帳簿の仕訳が入ります。 ここで B2 に日付が入って、C2~F2とC3~D3にデータが入った場合に オートフィルタをかけたら、3行目は日付の欄が空白なので うまく抽出できません。 なお、2行目と3行目は1つの仕訳なのでばらばらになるのも困ります。   仕訳は最低1行から最大で6行になります。 このように日付欄は1行だけど、その日付に対応する内容が数行に渡って入るような場合に日付から月毎にデータ抽出するには どのようなコードを書けばいいのでしょうか? A B    C      D     E    F  日付 借方科目 金額 貸方科目 金額  10/10 消耗品  300    現金   500        雑費   200   10/9   交際費  500    現金   500   10/8    雑費   200     現金   200 汚い表ですが、上記のような場合です。 10/10の分は2行で1つになりますので、このような場合です。 どうかよろしくご指導お願いします。 

  • クエリを使わずに日付の抽出をしたい

    accessを始めて数週間の初心者です。VBAについては見よう見まねで参考書の丸写し程度の段階です。 日付ごとの売上表になっている一覧表フォームに、テキストボックス(日付を入力する)を作成して、日付抽出のコマンドボタンをクリックすると指定した日付のレコードのみを表示させたいのですが、その場合のイベントプロシージャはどう記述すればいいでしょうか? よろしくお願いします。

  • エクセルVBAでフィルタ抽出部分のみのコピー

    エクセルVBAで売上帳を作成していますが、オートフィルタでデータ抽出した後、表示されている行のみをコピーして別シートに貼りつけるにはどうすればよいのでしょう? 別シートは指定したセルに値のみの貼り付けをしたいと思っています。 宜しくお願いします。

  • エクセルVBA 日付の評価、大小を比べるには

    エクセルのセルに日付データーが入っています。 その値を取得して、他のセルに入っている日付と比べたいのですが、 日付データをどの形に変換して比べればいいか分かりません。 ___|_____A_________|_____B___________|______C_____ 1_|_2007/6/1__|__2007/7/1__|____________ 2_|_2007/7/1__|__2007/7/23_|____________ 例えば上の表があったとして、A列とB列にある日付を比べて、大きい 方をC列に記入するということをVBAでしようとするとき、セルに入って いるデーター形式をどの形に変換して評価すればいいでしょうか? 日付データーをシリアル値に変換する方法とかあるのでしょうか? どなたか教えていただけないでしょうか?

専門家に質問してみよう