ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.4154520 エクセル 表編集
質問者:isofutabon エクセルの表編集で以下の作業を自動に行う方法はありますか?

   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  ・

今まで手打ちで表の編集をしていたようですが、
面倒なので自動でできる方法があれば教えてください。
困り度:
  • すぐに回答を!
質問投稿日時:
08/07/06 01:16
この質問に対する回答は締め切られました。

回答良回答20pt

ANo.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で動作確認済。
以上ご参考まで。
回答者:Kater_Kurz
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/07/06 11:07
この回答への補足ご回答ありがとうございます。
さっそく数式を使用させていただきました。
すぐにできました。

スキルを身につけていくためには初めは段階を踏んで、
最終的に早くできる方法をやって、他の場面でも活用
できるようにしていきたいと思いました。

ありがとうございました。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答良回答10pt

ANo.3 >具体的にどのような数式になるのでしょうか
質問者は当然数式で出来るものと思っているらしいが、エクセルの経験が少ないようだ。
関数はデータの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列は日付書式にしておくこと。
回答者:imogasi
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/07/06 09:07
この回答への補足ご回答ありがとうございます。
早速上記のプログラムを使用させていただきました。
あっという間にできたので感激です。

ありがとうございました。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.2 日付データが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
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/07/06 03:49
この回答へのお礼ご説明ありがとうございます。
これから頂いた回答を参考に自分のできる範囲でヘルプを見ながら
一番いい方法をみつけようと思います。

回答

ANo.1 max,min関数で解決出来ませんか?
回答者:umach
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/07/06 01:19
この回答への補足具体的にどのような数式になるのでしょうか?
教えていただけませんか?

上の例は日付順に並んでいますが、
A列の順番は変更せず、日付が入ってる場合は
A列 + 日付 というデータにしたいのですが。。
この回答へのお礼この回答にお礼をつける(質問者のみ)