• ベストアンサー

文字列に含まれる日付を分割

またも教えてください。 さきほどの質問と似ているのですが、、、申し訳ございません。 ひとつのセルに日付と文字が混在しています。 (他に数字データもあります) ~~~、5/1定休日、5/5定休日 ~~、5/1定休日 ~~~、10/10定休日 ~~には何が入るかわかりません。(数字だったり文字だったり) 「定休日」の文字列は固定です。 これを 5/1  5/5 5/1   10/10 とセルを分けたいのですが、、、。日付の桁数が揃っていないので どうしてもきれいに抽出できません。(涙) お知恵をください。よろしくお願いいたします。

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.7

元のデータがA1:A3にあるとき、同じシートの適当なセルに以下の式を貼り付けて、右方向、および下方向にコピーしてください =IF((LEN($A1)-LEN(SUBSTITUTE($A1,"定休日","")))/3>=COLUMN(A1),MID(LEFT($A1,FIND("@",SUBSTITUTE($A1,"定休日","@",COLUMN(A1)))-1),FIND("[",SUBSTITUTE($A1,"、","[",COLUMN(A1)))+1,LEN($A1)),"") ただし制限があります (1)文字列中に"@"と"["があるとうまく動きません   その場合は使っていない文字列に式中の"@"と"["を置き換えます (2)「、(全角読点)」に続く日付を抽出対象としますのでデータの先頭に「~~、」がないとエラーになります   式をもっと長くして良いならそれにも対応できる式は書けそうですが、   時間がないのでそこまでは考えませんでした。   必要ならご自身で工夫してみてください。

sunu0911
質問者

お礼

回答いただきありがとうございます。 貼り付けてみたのですが、うまくいきません。 たしかに「~、」が存在しない場合もあるのですが それは工夫してみますが・・・。 サンプルでは「定休日」としたのですが、実際の言葉が違い 文字数が全角2文字だからでしょうか。。。 (最初に/3しているのに関連?) もう少し読み解いてみます。すみません。

sunu0911
質問者

補足

お礼をしたあとの補足ですみません。 やはり3文字⇒2文字が悪さをしていました。 その部分と、データ先頭部分にいきなり日付が来るケースを 工夫をして解決しました。ありがとうございました!

その他の回答 (8)

noname#140971
noname#140971
回答No.9

>エクセルの関数を使うのであれば、SUBSTITUTEで生成した文字列から"、"から右を抜き出せばいいです。 =SUBSTITUTE(A1 & "、","定休日、"," ") ~~~、5/1定休日、5/5定休日--------------->~~~、5/1 5/5 ~~、5/1定休日---------------------------->~~、5/1 ~~~、10/10定休日------------------------>~~~、10/10 ~~~、5/1定休日、5/5定休日、5/10定休日--->~~~、5/1 5/5 5/10 と、SUBSTITUTE関数で対象文字列の形式を単純化。 =MID(B1,FIND( "、",B1,1)+1, 1000) で、MID関数とFIND関数で"、"の右を抜き出します。 ~~~、5/1 5/5---------------->5/1 5/5 ~~、5/1---------------------->5/1 ~~~、10/10------------------>10/10 ~~~、5/1 5/5 5/10 ---------->5/1 5/5 5/10 これにエラー対策を加えれば・・・。 ※昨日の中途半端な回答を一応補足しておきます。 ※エクセルは操作したことがないので、こんな初歩的な手法しか私には無理。

sunu0911
質問者

お礼

ありがとうございました。 Excel操作したことないとは思えないわかりやすい回答です。 エラー対策を考えて今まで回答いただいた方のものと 組み合わせてみます。

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.8

◆こんな方法もありますよ =IF(COLUMN(B1)>LEN($A1)-LEN(SUBSTITUTE($A1,"、",))+1,"",SUBSTITUTE(TRIM(MID(SUBSTITUTE($A1&"、","、",REPT(" ",40)),40*COLUMN(B1)-39,40)),"定休日",)) ★右と下にコピー

sunu0911
質問者

お礼

ありがとうございます! 質問のサンプルが正確でなかったことを後悔していますが ~、がないパターンがあったのと、もうひとつ、~、~、5/1定休日 というパターンがあり、その場合にふたつめの~、が読まれて しまいました。 ちょっと工夫して右から読むように考えて見ます。 みなさまのアイデアには本当に脱帽です。。。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.6

区切り文字が 、(全角読点)としています。 これで切り分けをしますので、他の区切り文字では動作しない。 ゆえに、区切り文字は実際に合わせて修正のこと。 '-------------------------------------------- Sub Test()  Dim myArray  Dim myValue  Dim K As Integer  Dim R As Long  Dim Clm As Integer  For R = 1 To Cells(Rows.Count, "A").End(xlUp).Row    Clm = 0    myValue = Replace(Cells(R, "A"), ",", "、")  '●●●    myArray = Split(myValue, "、")    For K = LBound(myArray) To UBound(myArray)      If InStr(myArray(K), "定休日") > 0 Then        Clm = Clm + 1        Cells(R, "A").Offset(, Clm).Value = Replace(myArray(K), "定休日", "")      End If    Next K  Next R End Sub '-------------------------------------------------- ●●●のmyValue = Replace(Cells(R, "A"), ",", "、") これで試しに ,(半角コンマ)は、全角読点に変えています。 これを利用して色々な区切り文字を統一して実行のこと。 以上。    

sunu0911
質問者

お礼

回答ありがとうございました。 確かに区切り文字が統一されていないので さまざまなパターンを想定して仕込む必要があるようです。 参考にさせていただきます!

  • heinell
  • ベストアンサー率35% (420/1172)
回答No.5

手動でやるなら(Excel2003の場合) 1.定休日を未入力(空欄)で置換 2.メニュー、データ(D)→区切り位置→カンマやタブなどの区切り文字に…→その他にチェック・後ろの入力欄に「、」の文字 次のメニューで最初の分を削除したり、日付型に指定するのもOK 3.表示書式を変更(セルの書式設定で日付かユーザー設定でmm/ddとか) こういう手もあります。 セル位置が固定なら、マクロ記録するのも手でしょう。

sunu0911
質問者

お礼

区切り文字は思いつきませんでした。 (/を探して桁数を抜こうとしていました) ただ、「、」が複数ある場合もあり、 行数も大量にあって対象セルを探すのが大変なので なかなか厳しいかもしれません。 ありがとうございました。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.4

置き換えの機能ではダメでしょうか? 取合えず、別のシートにでもコピィして 置き換え 検索する文字列 定休日 置き換え後の文字列  空白のまま  全てを置き換えで  定休日と言う文字が外れて日付になると思います。

sunu0911
質問者

お礼

回答ありがとうございます。 他にも数字やらなんやらがセルに入っており、 しかも行数が大量にあるために置換では対応できないのです。 がんばってみます。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

ANO.1です。 >NEXTのあとがよくわからないです。 vv = Split(ss, ",") 文字列ss(","で連結したもの)を","で区切って配列vvに放り込む。 If ss <> "" Then 文字列ssが""でない時、 c.Offset(, 1).Resize(, UBound(vv)) = vv A列の1つ右(B列の同行)から区切ったvvの数だけ、右方向のセルに 代入する。 End If と言った所でしょうか。

sunu0911
質問者

お礼

わざわざありがとうございます。 意味がわかりました。 関数では限界がありそうなので、挑戦してみます。

noname#140971
noname#140971
回答No.2

~~~、5/1定休日、5/5定休日___5/1 5/5 ~~、5/1定休日__________5/1 ~~~、10/10定休日________10/10 =CutStr(SUBSTITUTE(A1 & "、","定休日、"," "),"、",2) エクセルの関数を使うのであれば、SUBSTITUTEで生成した文字列から"、"から右を抜き出せばいいです。

sunu0911
質問者

お礼

関数で挑戦したのですが、数字列が入り込んでしまいました。 工夫してみます。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

セルA1からA10までの日付をB列より右に書き出すサンプル。 Sub Try()   Dim c As Range, ss As String   Dim v As Variant, vv   With CreateObject("VBScript.RegExp")     .Pattern = "(\d*\/\d*)|[0-9]*\/[0-9]*"     .Global = True     For Each c In Range("A1:A10")       ss = ""       For Each v In .Execute(c.Value)         ss = ss & v.Value & ","       Next       vv = Split(ss, ",")       If ss <> "" Then       c.Offset(, 1).Resize(, UBound(vv)) = vv       End If     Next   End With End Sub こうゆう事ですか?

sunu0911
質問者

お礼

n-junさん 早速ありがとうございます。 すみません。NEXTのあとがよくわからないです。 (きっとここが大事・・・) VB本とにらめっこしてみます。^^;

関連するQ&A

  • Excelで下記のようなセルから文字列を取り出す

    [文字列1(字数ランダム)][数字(桁数固定)][文字列2(字数ランダム)][文字列3(字数固定)] 1つのセルに上記のような文字列がはいっています。 それぞれの文字列や数字の境目にはスペースやカンマなどはありません。 このセルから文字列2だけを取り出す方法はあるでしょうか? ご教示お願いいたします。

  • Excelにて任意の位置の文字列を抽出したい

    Excelにて任意の位置の文字列を抽出したい セルA1に、あたい1(837,1077,132) セルA2に、あたい2(657,100,32) セルA3に、あたい3(20,10000,888) のような値が入っています。 ここから、132、32、888を取り出したいのですが、どのような式を入れたら良いでしょうか? Right関数だと上記のように桁数が2桁と3桁と混在している場合に抽出できませんでした。

  • 文字列として入力した日付を日付データに変換したい

    OS=Windowds7 エクセルバージョン MicroOffice Home and Buisiness 2010 の中のエクセル です A列に下記のように文字列としての日付が入力されています。 例) 2014年1月5日(日) (セルの属性も”文字列”です) ここから、日付データを取り出したいです。 なお、年は4ケタ固定 プラス 漢字の”年”ですが、 月、日は十の位はゼロ表示していないので、一桁表示、二桁表示、とばらつきがあります。 また曜日表示は全角のカッコの間に漢字一文字で曜日表記してあります。 ま、文字列の日付表示から日付データさえ取り出せれば、あとは曜日のデータ取出しは簡単にできますからこれは後回しにします。 とりあえず無い知恵を絞ってこんなことをやってみました。 =LEFT(A14,LEN(A14)-3) 結果はこうなります。 計算結果 2014年1月5日 これで文字列表記の日付データが何月何日であっても(つまり、月、日が一桁表示でも二桁表示でも、どっちでも)「YYYY年M月D日」の形式での年月日表示にすることはできました。 しかし、この状態ではまだ計算結果として表示している「2014年1月5日」は依然、文字列データのままです。これでは加工ができません。 私は 2014年1月5日(日) という文字列データを日付データに変換して、例えば H26.1.5 平成26年01月05日 1/5 (それを基にして別ののセルに)sunday、日曜日、日曜、日 などなどなどの多彩に曜日表記する など「日付データとしての表記の加工」を自由に行いたいのです。 どなたか、やり方を教えてください。 なお、データ加工の為の作業用セル、作業用列を作るのは構いませんがなるべく少ない領域で お願いします。 また私が無い知恵を絞って作成した計算式 =LEFT(A14,LEN(A14)-3) が無意味ならば(多分、無意味でしょう)、全く無視していただいて構いません。 よろしくお願いします

  • エクセル 日付文字列からの数字のみ抽出

    エクセルについてですが、 「1月1日分」と書かれた日付文字から 「0101」と言う数字を抽出するにはどのようにすれば良いでしょうか?…例えば、「12月12日分」であれば「1212」です 最終的には「241001」と言う文字に変更したと思うのですが、どうしても01日のような一桁の月日の時に0を入れる方法が思い浮かびません。 知恵を貸していただければ助かりますm(__)m

  • EXCELで日付を文字列として取り出すには

    EXCELで日付形式のセルの内容を、そのイメージのまま文字列にするにはどうすれば良いでしょうか。何かうまい方法があれば教えてください。 例えば、2006/01/05 と表示されている日付をそのまま文字列として 取り出したいのです。単にセルの書式設定で文字列に変えただけでは 38722とタイムスタンプの値らしきものに化けてしまうので困っています。

  • 文字列同士のセルを結合して日付表示【至急】

    仕事で抽出したデータを使用して、リストを作っていますが うまくいきません…。 詳しい方アドバイスをお願いいたします。 画像参照してください。 列1(画像F列)に文字列で元号、列2(画像G列)に文字列で ○○年○月○○日が入ってます。こちらを結合させ、列3(画像H列)に 2013/7/5といった形で日付表示にさせたいです。元号は明治~平成まで 混在しています。 &を使って結合させたりまではできるのですが、○○年○月○○日と 入っているセルに微妙な半角スペーズがあります。置換を使用したり、 DATEVALUEを使用して変換しようとしましたがうまく表示されません。 件数自体は2500件弱と少ないのですが、期限がせまっているので 正確迅速にできる手順をアドバイスいただけたらと思います。 よろしくお願いいたします。

  • 複数の数字が書かれた文字列をsplitで分割したい

    "230","60,000","12,800" 等の文字列があります。 これを 「230」と「60000」と「12800」に分けたいのですが Solit(文字列,",")とすると 「230」「"60」「000"」「"12」「800"」 となってしまいます。 数字の個数や桁数はバラバラです。 うまく分ける方法に関してどうかご助言をいただけないでしょうか? どうぞよろしくお願いいたします。

  • EXCELの文字列の冒頭に0を付けて桁数を合わせたい

    入力した数字「123」を「00123」にしたい時、文字列にすると「123」のまま文字列になってしまいます。 自動的に「00123」にできないのでしょうか?例えば、口座番号や顧客番号など桁数が決まっているもので、その桁数に満たない番号の場合、冒頭に0を付けて桁数を合わせたいのです。 ちなみに、「&」で結ぶことも考えたのですが、00123とか00012など冒頭にくる「0」の数が違うので、別セルに「000」をいれておいてもできないのです。 よろしくお願いします。

  • 文字列を日付へ

    エクセルで「04/03/2003」という文字列が入ったセルがあります。 これを日付形式に変更したいのですが、簡単な方法はありませんか? セルの表示形式のユーザー定義で「mm/dd/yyyy」としても変わりませんでした。。 何かやり方が間違えているのでしょうか??? よろしくお願いしますm(__)m

  • 文字列の分割

    エクセルであるセルに入力された文字列を分割したいのですがうまくいきません。 下記のような感じで、文字+数字の入力になっており、文字の数及び数字の数は決まっておりません。 あいうえお123456 かきく98765 さしすせ2222 これをなんとか別々のセルに下記のように分割したいです。 あいうえお 123456 かきく    987654 さしすせ  2222 ご存知の方がいらっしゃいましたらご教授下さい。 よろしくお願いします。

専門家に質問してみよう