- ベストアンサー
効率よく変換したい エクセル2002
件数が多いため、手動で行うことに限界を感じ、相談させていただきます・ 40000件ほどのデータがあります。 1つのセルごとに曜日と営業時間が入力されています。 例)火 11:00~13:00 水木 10:00~13:00 これを下記のように変換したいのですが 効率よく変換していく方法はないでしょうか。 火1100・火1200・水1000・水1100・水1200・木1000・木1100・木1200
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
マクロを使って対応するのがよいでしょう。 シート1のA2セルから下方にデータがA40000セルまで入力されているとしたら次のようにします。 シート見出しでSheet1を右クリックして「コードの表示」をクリックします。 表示の画面の右側に次のコードを入力します。 Sub 文字の変換() n = 0 m = 1 n0 = 0 p = 0 For i = 2 To 40000 Do n = n + 1 myStr = Cells(i, 1).Value nm = Mid(String:=myStr, Start:=n, Length:=1) If nm = "日" Or nm = "月" Or nm = "火" Or nm = "水" Or nm = "木" Or nm = "金" Or nm = "土" Then youbi = nm n0 = n Do n = n + 1 nm = Mid(String:=myStr, Start:=n, Length:=1) Loop Until IsNumeric(nm) = True n1 = n Do n = n + 1 nm = Mid(String:=myStr, Start:=n, Length:=1) Loop Until nm = "~" n2 = n Jikan1 = TimeValue(Mid(String:=myStr, Start:=n1, Length:=n2 - n1)) Do n = n + 1 nm = Mid(String:=myStr, Start:=n, Length:=1) Loop Until nm = ":" n3 = n + 2 Jikan2 = TimeValue(Mid(String:=myStr, Start:=n2 + 1, Length:=n3 - n2)) Do m = m + 1 p = p + 1 Jikan = Jikan1 + TimeValue("1:00") * (p - 1) Cells(i, m) = youbi & Hour(Jikan) & ":00" Loop Until Jikan1 + TimeValue("1:00") * (p - 1) > Jikan2 - TimeValue("1:00") n = n0 p = 0 End If Loop Until n > Len(myStr) Next End Sub マクロを実行するには「ツール」メニューから「マクロ」を選択し「マクロ」から「文字の変換」を選択して「実行」をクリックすればいでしょう。
その他の回答 (4)
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
No1です 月木 1:00~2:00 の結果は? セルにはどのように入力されている。縦に? 横に? 9:00までは、「月火 01:00~02:00」と入力されている? それとも「月火 1:00~2:00」 月火 23:00~2:00 というものもある? さらに、あった場合のその結果は? 月火 11:01~15:30 というものもある? さらに、あった場合のその結果は? 結果はどのように配置させる? 月火 11:00~12:00 月1100 月1200 ★★★★ 火1100 火1200 ★は空白セルとして横に最大7(曜日)×24(時間)セル使っても良いの? 手動では、どのような決まりがあるの? 先の回答での数式はどの程度理解できたの?
お礼
お手数おかけしてすみません。上記の方のマクロで解決できそうです。ありがとうございました。
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
No.2です。もしかして、「火 11:00~13:00」と「水木 10:00~13:00」も、同じセルの中に入力されているとか?だったら先にA列に対して、「区切り位置」の機能を使ってください。A列全体を選択し、リボンあるいはメニューバーの「データ」にある「区切り位置」をクリック。「スペースによって…」ではなく、「カンマやタブなどの…」を選んで「次へ」をクリック。「スペース」にチェックを入れて、「完了」をクリック。その後、No.2の各式を、列番号の変化に注意して適用。説明に手を抜かないで。
補足
申し訳ありません、そのように記載したつもりでしたが、伝わらないのは書き方が悪かったようです。失礼しました。
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
そもそもそういうまとめ方を目指すことはお勧めしないけれども、力づくで加工すれば、できなくも。A1セルに「水木 10:00~13:00」と入力されていると仮定。各セルに次のとおり数式を入力。計算結果のうち「水0」、「木0」は後で、置換で適当に削除。マクロ使わない場合。 C1 =left(a1,find(" ",a1)-1) D1 =replace(c1,2,1,) E1 =replace(c1,1,1,) F1 =left(a1,find("~",a1)-1) G1 =right(f1,len(f1)-find(" ",f1)) H1 =right(a1,len(a1)-find("~",a1)) I1 =0+substitute(h1,":",) J1 =0+substitute(g1,":",) K1 =J1+100 L1 K1セルをコピペ M1 〃 N1 〃 O1 〃 P1 =$D1&j1*(j1<$I1) Q1 P1セルをコピペ R1 〃 S1 〃 T1 〃 U1 〃 V1 =replace(p1,1,1,$E1) W1 V1セルをコピペ X1 〃 Y1 〃 Z1 〃 AA1 〃 >ただ申し訳ありません、下記は全てひとつのセルにおさまっていて、わけることができないんです。 どうして後出しなのか…回答者の苦労を軽減するためには、質問者さんもご努力を。よく分からない質問文でも長時間かけて一生懸命考えて回答してくださった方が、気の毒。
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
セル番地などよくわからない点があるので途中経過まで。 B2セル =MID($A2,COLUMN(A1),1) C2セル =MID($A2,COLUMN(B1),1) D2セル =LEN(A2) B3セル =LEFT(A3,FIND("~",A3)-1) C3セル =SUBSTITUTE(A3,B3&"~","") D3セル =(C3-B3)/"1:0" B2:D3セルを選択して下へオートフィル ↓が未処理 E3セル =INDEX($B2:$C2,1)&TEXT($B3+(COLUMN(A1)-1&":00"),"hhmm") E2:E3セルを選択して 右へ下へオートフィル 不明な点が多いのだたたき台まで
補足
回答ありがとうございます! なんだかいい感じにできそう・・・ ただ申し訳ありません、下記は全てひとつのセルに おさまっていて、わけることができないんです。 もっと長いものもあります。 例)火 11:00~13:00 水木 10:00~13:00
お礼
助かりました。なんとかいけそうです!