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

エクセルにまだまだ不慣れなもので、質問させてください。
下の図《1》のようなデータが大量にあります。CSV形式に出力したいのですが《2》のように並べ替えなければいけませんよね?(←ここら変の知識も未熟なものですみません。。)
《1》のようなデータを《2》のような並びにする事は可能でしょうか?
ちなみに《1》のようなデータは、一行ずつ空白行をはさみ、下まで何百件も並んでいます。また、1データの行数もランダムです。

何か良い方法がありましたら是非ご教授下さい。よろしくお願い致します。


《1》
A  B   C   D   E   F
1 ●●
2 ■■
3 ▲▲
4 ◎◎


《2》
A   B  C  D  E   F
1 ●● ■■ ▲▲ ◎◎
2
3
4

A 回答 (8件)

ちょっとかわった方法ですが…



まずそのファイルを「CSV(カンマ区切り)形式」に保存します。
保存したファイルを正規表現の使えるテキストエディタで開きます。
置換で
「\n\n」→「丸い卵も切りようで四角」
「\n」→「,」
「丸い卵も切りようで四角」→「\n」
その後、テキストエディタを閉じます。

そのファイルをExcelで読み込めば、目指す形式に並び替えられているはずです。

ただし、ExcelでCSVファイルを読み込むときには時間がかかる場合がありますので、あわてずにやってみてください。
    • good
    • 0
この回答へのお礼

色々な方法があるのですね!とても参考になります。どうもありがとう御座いました!

お礼日時:2006/08/31 20:08

こんばんは。

Wendy02です。

使わないかもしれませんが、マクロで考えてみました。基本的なエラー処理は含めています。

●●
■■
▲▲
~改行~
○○
□□
△△

以下のようにCSVに出力される

  A B C D E F
 
1 ● ● ■ ■ ▲ ▲
2 ○ ○ □ □ △ △


あくまでも、2列が条件で、変換して256列の単位を越えるものは、出力されません。また、保存される、CSVのファイル名は、元のブックの名称が使用されます。

'なるべく標準モジュールに登録してください。
'----------------------------------------------------------
'Option Explicit

Sub TransposedCSVOut()
 '2列-数行をまとめて、横に変換して出力する
 Dim tmpSht As Worksheet
 Dim AcSht As Worksheet
 Dim myRng As Range
 Dim myArea As Range
 Dim i As Long, j As Integer, k As Integer
 Dim Ar As Range, c As Range
 Dim SaveName As String
 
 '保存名は、現在のブックの名前を使用します。
 'ただし、同名のCSVファイルがある場合は、枝番がつきます。
 With ActiveWorkbook
  SaveName = Mid$(.Name, 1, InStrRev(.Name, ".") - 1)
 End With
 
 Application.ScreenUpdating = False
 
 Set AcSht = ActiveSheet
 With AcSht
  '2列の設定は、Resize(,2)
  Set myRng = .Range("A1", .Range("A65536").End(xlUp)).Resize(, 2)
 End With
 '定数すべて選択
 Set myArea = myRng.SpecialCells(xlCellTypeConstants, 23)
 
 With ActiveWorkbook
  Set tmpSht = .Worksheets.Add(After:=.Sheets(.Worksheets.Count))
 End With
 
 i = 1
 '注意:空白行のない場合は、途中で中断されます。
 
 For Each Ar In myArea.Areas
  
  With Ar
   '行が、128行以上では、縦横変換で256列には収まらない
   If Ar.Rows.Count > 128 Then
    If MsgBox("変換時に256列越えていますので、排出されません。" & vbCrLf & _
     "OK =スキップして継続, Cancel = 中止", vbInformation + vbOKCancel + vbDefaultButton2) = vbCancel Then
     Application.DisplayAlerts = False
     tmpSht.Delete
     SaveName = ""
     Application.DisplayAlerts = True
     GoTo Quit
    End If
   Else
    If WorksheetFunction.CountA(.Cells) > 0 Then
     For Each c In Ar.Cells
      k = k + 1
      c.Copy tmpSht.Cells(i, k)
     Next c
     i = i + 1
    End If
   End If
  End With
  k = 0
 Next Ar
 Application.CutCopyMode = False
 
 If i < 2 Then
  Application.DisplayAlerts = False
  tmpSht.Delete
  SaveName = ""
  Application.DisplayAlerts = True
  GoTo Quit
 End If
 tmpSht.Move
 
 '枝番付け
 Do While Dir(SaveName & ".csv") <> ""
  If InStrRev(SaveName, "_") > 0 Then
   SaveName = Mid$(SaveName, 1, InStrRev(SaveName, "_") - 1)
  End If
  j = j + 1
  SaveName = SaveName & "_" & CStr(j)
 Loop
 
 'CSV 保存
 ActiveWorkbook.SaveAs SaveName, FileFormat:=xlCSV
 ActiveWorkbook.Close False
Quit:
 AcSht.Select
 Application.ScreenUpdating = True
 
 If SaveName <> "" Then
  MsgBox "このブックと同じフォルダに " & SaveName & ".csv で、保存されました。", vbInformation
 Else
  MsgBox "出力に失敗しました。", vbCritical
 End If
 
 Set Ar = Nothing
 Set tmpSht = Nothing
 Set myArea = Nothing
 Set myRng = Nothing
 Set AcSht = Nothing
End Sub
'----------------------------------------------------------
    • good
    • 0
この回答へのお礼

マクロはこれから勉強していこうと思っております。説明して頂きましてどうもありがとう御座いました!

お礼日時:2006/08/31 20:07

OFFSET関数をつかってみてはいかがでしょうか?



    A  B C D  E  F  G  H 
1  ●●   1  1  (1) (2) (3) (4)
2  ■■   2 (5)  ・   ・   ・   ・
3  ▲▲   3  ・   ・   ・   ・   ・
4  ◆◆
5  
6  ○○
7  □□
8  △△
9  ◇◇
10

(1)=OFFSET($A$1,D1-1,0,1,1)
(2)=OFFSET($A$1,D1,0,1,1)
(3)=OFFSET($A$1,D1+1,0,1,1)
(4)=OFFSET($A$1,D1+2,0,1,1)
(5)=D1+5

※全角数値が行番号、半角数字が実数値、カッコ数字が関数です。

C列はただの通し番号です。
D列は開始行番号です。今回は5行(データ4行+改行)1セットなので(5)の式で上の行+5を行います。
E~H列で実際に並び替えを行っています。

(1)~(5)の式を入力したら、あとはドラッグでそのまま下にコピーをします。(・の部分)

すべて値に貼り付けなおしてから、データとして必要のないD列(開始行番号)を削除してください。


ご参考になれば幸いです。
    • good
    • 1

1です。



状況がわかりました。
住所録の場合、最初にExcelで作成するときに、並びを工夫しておくと良いですね。

  氏名   住所   電話   家族
1 佐藤   東京都  090--  たかし
2 上田   兵庫県  080--  まゆみ

…みたいにしてはどうでしょう。
そうすればCSVで吐き出して、はがきソフトに読み込むのも簡単だと思います。

この回答への補足

申し訳ございません!最初から質問の仕方が悪かったようです。

>>
氏名   住所   電話   家族
1 佐藤   東京都  090--  たかし
2 上田   兵庫県  080--  まゆみ

…みたいにしてはどうでしょう。


そうなんです。実にこのようにしたいという質問だったのです。改行で区切られたデータを一行カンマ区切りにして出力したかったのです。


●●
■■
▲▲
~改行~
○○
□□
△△

のようなテキストを

●●, ■■,▲▲
○○,□□,△△

のような並びにすることは可能ですか?という意味でした。


解り難かったようでごめんなさい!

補足日時:2006/08/26 16:32
    • good
    • 0

CSV形式への変換については他の方が回答されているのでさておき



B2
B3
B4
B5




と順に下へ並ぶデーターを

B1・C1・D1・E1…
と横方向へ続くデーターに並べ替えたい場合について回答しますね

まず、先に他の方が述べられているように
Excelでの横方向のデーターの羅列は
比較的件数が少なく設定されています。(AからIVまでの256件)

それに対し縦は65536件データーを置けるようです、

なので、Bのラインから置きだす場合は255件しか置けないので
縦に並んだデーターから255件選んでコピーし
置きたい位置の右端を(この場合だとB1とかB2と加点)選択した後
そこの上で右クリックからプルダウンメニューを出して
「形式を選択して貼り付け」を選び
出てきたメニューから
右下隅の「行列を入れ替える(E)」にチェックを入れて
「OK」ボタンを押すと
縦並びが横並びに変換されて貼り付けられます。

この際にデーターの入っていないCの列のC1に1、
C2に
「=IF(MOD(C1,255)=0,1,C1+1)」
と書いた上
C2をコピーしてC65536までコピ-してみてください
1から255個までデーター個数をカウントしてくれるはずです

お役に立てましたでしょうか?
    • good
    • 0

》 《1》のようなデータを《2》のような並びにする事は可能でしょうか?



可能です。
でも、マクロがお出来になる方ならお茶の子だろうけど、それが出来ない私なら次のようにするかと。面倒なので、もっと簡単でスマートな方法があれば私も知りたいところ。

1.先頭行に1行の空白行を挿入して、データが2行目から始まることにする。
  つまり、データはセル A2、A3、A4、… にあり、データの区切りとしての1行の空
  白行が所々にある。
2.セル B1 に式 =A2="" を入力して、此れを下方に(列Aの下端のデータと同じ行ま
  で)ズズーッと複写
3.セル C2 に式 =IF(A2="","",IF(A1="",A2,C1&","&A2)) を入力して、此れを下方に
  (列Aの下端のデータと同じ行まで)ズズーッと複写
4.列B、C全体を選択して、[コピー]→[値の貼り付け]を実行
5.セル B1 のみを選択
6.[データ]→[フィルタ]→[オートフィルタ]を実行
7.セル B1 のオートフィルタ矢印(▼)をクリックして、FALSE を選択
8.セル B2 を選択して、Ctrlキーおよび Shiftキーを抑えたままで、下向き矢印(↓)
  キーをチョーン
9.[編集]→[行の削除]を実行して、表示されていたデータを全削除
10.ステップ6に同じ
11.(ステップ1で挿入した)先頭行を削除
12.列A、Bを削除
13.列Aを選択
14.[データ]→[区切り位置]を実行
15.“カンマやタブなどの…”に目玉を入れて[次へ]をクリック
16.“カンマ”にチェック入れ
17.Enterキーを2回叩き付け

以上の件で再質問があれば、ステップ番号および疑問点を示されたい。
    • good
    • 0

こんにちは。



>CSV形式に出力したいのですが《2》のように並べ替えなければいけませんよね?

逆の質問が時々あります。その質問者の方々は、みなさん、CSV形式のファイルだと思っていますが、似ていて違うものです。それは、CSV形式のファイルではありません。データベース・ソフトでないと出来ません。標準では、Excelでは、256列でおしまいになってしまうからです。
    • good
    • 0

はじめまして



CSVにするからといって、並べ方を変える必要はありません。
保存するときに、CSV形式で保存すればよいことです。

これで解決にはならないでしょうか?

この回答への補足

ご回答ありがとうございます。

住所録など、データの移し変えをする際、CSVではき出すと

○山○子,123-4567,東京都○○区,03-1234-5678
○田○夫,456-7890,北海道○○市,011-123-4567

のように表示されるのでこのような並べ方にしなければならないと思っていました。

補足日時:2006/08/26 01:41
    • good
    • 0

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