プロが教える店舗&オフィスのセキュリティ対策術

表題の通りですが、エクセル2003で、以下のようなことがしたいです。
[元データ]
  A     B      
1  氏名   田中
2  住所   東京
3  電話番号 ***
4  登録日  ***
5
6  氏名   鈴木
7  住所   埼玉
8  電話番号 ***
9  登録日  ***
10
11  氏名   佐藤
12  住所   埼玉
13  電話番号 ***
14 
15 氏名   工藤

のように一人分のデータが、空白セル1マス空けて、延々と続いた様な表があります(3万行くらい)。
これを下記のように変更したいのです
[整理後]
  A    B    C    D    E
1 氏名   住所   電話番号  登録日
1 田中   東京   ***   ***
2 鈴木   埼玉   ***   ***
3 佐藤   埼玉   ***   (空白)
4 工藤   
5

のような感じです。

3つ目の佐藤氏のデータのように元データに登録日という項目が無い場合があります。
それ以外の項目に関して順番や有無の違いはありません、1データの最終行にある登録日という
項目だけ有ったり無かったりします。

項目だけは縦のものを横に貼り付け、で出来たのですが、それが意外のデータを効率よく移すには
どうしたら良いでしょうか。

関数、マクロを教えていただけたらありがたいです。こうしたら良いというアイデアだけでも助かります。どうか宜しくお願いします。
(説明不足のところがありましたらすいません…補足致します)

A 回答 (5件)

VBAのサンプル。


理解できればですが・・・

Sub Macro1()
Dim iWS As Worksheet
Dim oWS As Worksheet
Dim iRow As Long
Dim oRow As Long
Dim iPos As Long

iRow = 1
oRow = 2
iPos = 0
Set iWS = ActiveWorkbook.Sheets(1)
Set oWS = ActiveWorkbook.Sheets(2)

Do While iWS.Cells(iRow + iPos, 1) <> ""
If iWS.Cells(iRow + iPos, 1) <> "氏名" Then
MsgBox "カラム異常 行=[" & iRow + iPos & "] 内容=[" & iWS.Cells(iRow + iPos, 1) & "]"
End If
While iWS.Cells(iRow + iPos, 1) <> ""
Select Case iWS.Cells(iRow + iPos, 1)
Case "氏名"
oWS.Cells(oRow, 1) = iWS.Cells(iRow + iPos, 2)
Case "住所"
oWS.Cells(oRow, 2) = iWS.Cells(iRow + iPos, 2)
Case "電話番号"
oWS.Cells(oRow, 3) = iWS.Cells(iRow + iPos, 2)
Case "登録日"
oWS.Cells(oRow, 4) = iWS.Cells(iRow + iPos, 2)
Case Else
MsgBox "カラム異常 行=[" & iRow + iPos & "] 内容=[" & iWS.Cells(iRow + iPos, 1) & "]"
End Select
iPos = iPos + 1
Wend
iRow = iRow + iPos + 1
iPos = 0
oRow = oRow + 1
Loop
Set iWS = Nothing
Set oWS = Nothing
End Sub

この回答への補足

ありがとうございます。VBAはまだ初心者なのですが。
教えていただいたプログラムで出来ました。

ただ説明不足で申し訳ありません。各データを区切る空白の行が
1行だけではなく、2行の場合も存在するのです。3行はありま
せんでした。
この場合どうすれば良いでしょうか。

補足日時:2008/11/21 13:49
    • good
    • 0

Sheet1


    A     B    C
1  氏名   田中     1
2  住所   東京
3  電話番号 01-23-4567
4  登録日  2008/01/23
5
6
7  氏名   鈴木     7
8  住所   埼玉
9  電話番号 02-34-5678
10 登録日  2007/08/09
11
12 氏名   佐藤    12
13 住所   埼玉
14 電話番号 03-45-6789
15
16 氏名   工藤    16

1.Sheet1 の空き列(此処ではC列とする)の1行目に次式を入力し
  て、此れを下方にズズーッとドラッグ&ペースト
  =IF(A1="氏名",ROW(),"")

Sheet2
  A   B    C      D
1 氏名 住所 電話番号  登録日
2 田中 東京 01-23-4567 2008/01/23
3 鈴木 埼玉 02-34-5678 2007/08/09
4 佐藤 埼玉 03-45-6789
5 工藤
6

以下は Sheet2 における操作です。
2.セル A2 に次の[条件付き書式]を設定
    数式が    =ISERROR(A2)
    フォント色  白
3.セル A2 に次式を入力して、此れを右方にズズーッとドラッグ&ペ
  ースト
  =IF(OFFSET(INDIRECT("Sheet1!"&ADDRESS(SMALL(Sheet1!$C:$C,ROW(A1)),1)),COLUMN(A1)-1,1)=0,"",OFFSET(INDIRECT("Sheet1!"&ADDRESS(SMALL(Sheet1!$C:$C,ROW(A1)),1)),COLUMN(A1)-1,1))
4.セル D2 を yyyy/mm/dd に書式設定
5.範囲 A2:D2 を下方にズズーッとドラッグ&ペースト
    • good
    • 0
この回答へのお礼

丁寧に教えて頂き、ありがとうございました。

参考にさせていただきます。

お礼日時:2008/12/01 14:51

1人あて4行(空白行も入れて5行)ばかりなら、作業列を使わず行の計算だけで出来ます。


氏名は =INDEX($A$1:$B$100,(ROW()-1)*5+1,2)
しかし補足で、どうもソウでないらしい(大事なことだから、質問に初めからしっかり書いておくこと)からこの方法は使えない。
ーーーーーー
例データ(空白行数イレギュラーの場合)
第1行目は空白行にする。(データを入れない)
A2:B100の一部
氏名田中1
住所東京
電話番号***
登録日***
ーーー ---<===空白行の代わりの表示
ーーー ---
氏名鈴木2
住所埼玉
電話番号&&&
登録日***
ーーー ---
ーーー ---
ーーー ---
氏名木村3
住所神奈川
電話番号ーーー
C列は =IF(A2="氏名",MAX($C$1:C1)+1,"")
下方向に式を複写
結果
氏名に連番を振っている。
F2に
=INDEX($A$1:$B$100,MATCH(ROW()-1,$C$1:$C$100,0),2)
G2に
=INDEX($A$1:$B$100,MATCH(ROW()-1,$C$1:$C$100,0)+1,2)
H2に
=INDEX($A$1:$B$100,MATCH(ROW()-1,$C$1:$C$100,0)+2,2)
下方向に式を複写
結果 F2:H4
田中東京***
鈴木埼玉&&&
木村神奈川ーーー
上記は抜き出し問題で私が回答している手法の「imogasi方式」(Googleで照会のこと)と同じ手法で出来た。
ーー
もしA列の氏名が当てにならないなら、上記C列n式の変わりに
=IF(AND(A1="",A2<>""),MAX($D$1:D1)+1,"") なら使えるだろう。
塊で最終空白行の次行を氏名行とするという意味である。
    • good
    • 0
この回答へのお礼

丁寧に教えてもらい、ありがとうございました。

参考にさせていただきます。

お礼日時:2008/12/01 14:49

No.1です。


条件は正確に書いてください。
A3に入れる式を↓に換えればいけるはずです。
=IF(D3="","",IF(A2="",MAX(A$1:A2)+1,A2))
    • good
    • 0
この回答へのお礼

返事大変遅くなりました。。

出来ました、ありがとうございました。

お礼日時:2008/12/01 14:20

各データが誰のデータなのかを管理する情報があれば出来ると思います。


私でしたら、次の様にします。
先頭に作業列を2列追加します(A,B列を追加)。
A1とA2に 1
A3に =IF(D3="","",IF(D2="",A1+1,A2)) と入れて下までコピー。

これでA列が個人No.になり、誰のデータなのか特定できます。
次にB列を作業列として使います。

B1に =A1&C1 と入れて下までコピー
これで、「1住所」の様に個人No.データの項目名が1つになった情報ができました。これをVlookupで整理します。

F~J列を使うとして説明します。
G1~J1に「氏名」「住所」「電話番号」「登録日」と、データの項目名と同じ物を入力します。
そしてF2に 1
G2に =IF(ISNA(VLOOKUP($F2&G$1,$B:$D,3,FALSE)),"",VLOOKUP($F2&G$1,$B:$D,3,FALSE))  と、入れてJ2までコピー

最後に、F2:J2を下までコピー。

コレでいかがでしょう。

この回答への補足

ありがとうございます。出来ました。
ただ説明不足で申し訳ないです。各データの区切りの空白行が
2行になっている場合もありました。。
3行はありません1行か2行になります。。すいませんがこの場合も
教えていただけないでしょうか。

補足日時:2008/11/21 13:47
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!