- ベストアンサー
エクセル 表編集
エクセルの表編集で以下の作業を自動に行う方法はありますか? A B C D E 1 AMX 5/12 5/15 2 PAN 5/17 5/19 3 KBO 5/20 4 RUS 5/22 5/23 ↓↓↓↓↓↓ <編集後> A 1 AMX 5/12 2 AMX 5/15 3 PAN 5/17 4 PAN 5/19 5 KOB 5/20 6 ・ 7 ・ 今まで手打ちで表の編集をしていたようですが、 面倒なので自動でできる方法があれば教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
たとえば、日付が入っている列がSheet1のB~Eの4列の場合、 別のシートで… ------------------------------------------------------ ●甲案 [ジャンプ]機能を使って地味に…というか普通に 1.A列を4回ずつ繰り返す A1セル : =OFFSET(Sheet1!$A$1,INT(ROW()-1)/4,) として下方にフィル 2.B~E列を1列に直す B1セル : =--(OFFSET(Sheet1!$A$1,INT((ROW()-1)/4),MOD(ROW()-1,4)+1)&" ") として下方にフィル 3.値を確定する A:B列を選択 ⇒ コピー ⇒ [形式を選択して貼り付け] ⇒ [値] ⇒ [OK] 4.日付のない行(エラー値)を削除 B列を選択して、 Ctrl+G ⇒ [セル選択] ⇒ [定数] ⇒ [エラー値]以外のチェックを外す ⇒ [OK] [編集] ⇒ [削除] ⇒ [行全体] ⇒ [OK] 5.B列の[表示形式]を日付にする [セルの書式設定] ⇒ [表示形式] ⇒ [日付] で適切なものを選択 数式の「4」の部分(合計3ヵ所)は実際の列数に応じて調整してください こちらは、ありふれた処理を組み合わせただけのもので、 ある程度慣れた人であれば普通に思いつく、順当な手順かと思います。 ------------------------------------------------------ ●乙案 数式一発で 1.A1セル : =Sheet1!A1 とする 2.A2セル : =IF(COUNTIF($A$1:A1,A1)=COUNT(INDEX(Sheet1!A:E,MATCH(A1,Sheet1!A:A,0),)),INDEX(Sheet1!A:A,MATCH(A1,Sheet1!A:A,0)+1),A1) として下方にフィル 3.B1セル : =SMALL(INDEX(Sheet1!A:E,MATCH(A1,Sheet1!A:A,0),),COUNTIF($A$1:A1,A1)) として下方にフィル 4.B列の[表示形式]を日付にする 数式の「Sheet1!A:E」の部分(合計2ヵ所)は実際の列数に応じて広くしてください。 こちらももさほど複雑な処理ではありませんが、実務であれば 乙案の数式を考える時間で甲案の処理が終わってしまいますから、 「やってやれなくはない」というニュアンスのものです。 単発の作業であれば甲案に比べてほとんどメリットはありませんが、 >今まで手打ちで表の編集をしていたようです とあったので、複数回繰り返す作業かと思い、 「使い回しのできる方法」として提案しました。 ------------------------------------------------------ いずれもExcel2003で動作確認済。 以上ご参考まで。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
>具体的にどのような数式になるのでしょうか 質問者は当然数式で出来るものと思っているらしいが、エクセルの経験が少ないようだ。 関数はデータの2番目のセルを捉えるとか 表の縦横の組み換え 空白セルを詰める など式が複雑だったり、難しいのだ。 ーー VBAであれば、質問例では横にB-Eの4列のセルが空白でなければ、縦にデータを順次置いていけばよいので、ロジックは簡単=コード行数は少ない。 例データ AMX - 5月12日 5月15日 PAN 5月17日 - - 5月19日 KBO - 5月20日 RUS - - 5月22日 5月23日 ーは実際は空白セルを示す。左セルに詰まって表示されないよう便宜上入れたもの。 ーー コード 標準モジュールに Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") d = sh1.Range("A65536").End(xlUp).Row MsgBox d k = 2 For i = 1 To d For j = 2 To 5 If sh1.Cells(i, j) = "" Then Else sh2.Cells(k, "A") = sh1.Cells(i, "A") sh2.Cells(k, "B") = sh1.Cells(i, j) k = k + 1 End If Next j Next i End Sub ーーー 結果 Sheet2 A列 B列 AMX 2008/5/12 AMX 2008/5/15 PAN 2008/5/17 PAN 2008/5/19 KBO 2008/5/20 RUS 2008/5/22 RUS 2008/5/23 B列は日付書式にしておくこと。
補足
ご回答ありがとうございます。 早速上記のプログラムを使用させていただきました。 あっという間にできたので感激です。 ありがとうございました。
- umach
- ベストアンサー率35% (600/1691)
日付データがdate(2008,5,12)形式(例だと39580)と仮定します。(文字情報だと方法が違います) 元の表に F1セル =min(b1;e1) G1セル =max(bi;e1) h1セル =g1-f1 それぞれ下方向へコピー G~F列の表示形式を標準にしておくのを忘れずに 編集後の表に(リンクは省略して表記します) B1セル =if(f1,f1,"") B2セル =if(and(g1,h1),g1,"") A列は、B列に日付データがあれば表記って事で。 複雑な集計のコツは、簡単な集計結果を出しておく事です。 自身のスキルを上回る表組みは結局何も残りません。(修正も改編も不可能ですよね) 自ら理解可能な手法をお薦めします。 excelのヘルプと戦って下さい。 配列変数の概念まで行くとVBAになってしまいますが。
お礼
ご説明ありがとうございます。 これから頂いた回答を参考に自分のできる範囲でヘルプを見ながら 一番いい方法をみつけようと思います。
- umach
- ベストアンサー率35% (600/1691)
max,min関数で解決出来ませんか?
補足
具体的にどのような数式になるのでしょうか? 教えていただけませんか? 上の例は日付順に並んでいますが、 A列の順番は変更せず、日付が入ってる場合は A列 + 日付 というデータにしたいのですが。。
補足
ご回答ありがとうございます。 さっそく数式を使用させていただきました。 すぐにできました。 スキルを身につけていくためには初めは段階を踏んで、 最終的に早くできる方法をやって、他の場面でも活用 できるようにしていきたいと思いました。 ありがとうございました。