[[20070125111810]] 『改行文字の入ったセルを分割する』(超EXCEL初心者) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『改行文字の入ったセルを分割する』(超EXCEL初心者)

 教えてください。 
 『sheet1のA列のセル内に複数行で書かれているものをがあったらsheet2のA列にあげ、
 それを隣のセルに1行ずつに分割する。』という作業を自動的に行えないでしょうか?

 【sheet1】 

        A
[1]  07
     SPRING&SUMMER
[2]  NO COLLECTION
[3]  2005-2006
     FALL/WINTER
     (01-56)
        ・
        ・
        ・

 【sheet2】

        A             B              C               D       E       F       G       H
[1]                 1行目          2行目            3行目   4行目   5行目   6行目   7行目
[2]  07              07            SPRING&SUMMER 
     SPRING&SUMMER
[3]  2005-2006       2005-2006     FALL/WINTER      (01-56)
     FALL/WINTER
     (01-56)
        ・
        ・
        ・

 ※sheet1のA列のデータ数は100以上あり、それも必ずしも複数行というわけではなく、
 1行のものも混在しています。(でも最大は7行です。) 

 良い方法をご存知の方、よろしくお願いします。


 A列を選択して、データ→区切り位置で、カンマやタブ・・・選択、次へ
 区切り文字にその他を選び、入力欄に「Ctrl+J」(表示は何も表示されません。)
 で、完了。
 BJ

 衝突しましたがそのままアップ。

 改行文字は
 char(10)
 です。

 FIND
 LEFT
 MID
 RIGHT

 の組み合わせて出来ると思います。
 (MARBIN)

 改行無しを考えると、
 ISERROR
 も必要ですね。
 (MARBIN)

 ExcelVBAを使用してできないでしょうか?

 (超EXCEL初心者) 

 マクロの自動記録が参考になりませんか?
 (MARBIN)

 自動記録では"コピーまたは移動先を置き換えますか?というメッセージ"前までの処理が記録されます。
  
[[20050614145654]]『改行文字の入ったセルを分割する方法』(HT)
 を参考(というか真似て)

 Sub test()
    Dim i As Long
    Dim Ary
    Ary = Split(Range("A2").Value, Chr(10))
    For i = 0 To UBound(Ary)
        Range("B2").Offset(, i).Value = Ary(i)
    Next i
 End Sub

 というのができました。
 Offset(, i).
 で横方向に書くように変えただけなんですが、かなりの時間がかかりました・・・

 そして更に問題が・・・
 これはA3のみのじゃないですか。
 A3から下のセルすべてを指定するにはどうすればいいのでしょう?
 わかりません。
 教えてください。お願いします。

(超EXCEL初心者)


マクロの自動記録を元に作ってみました。

Sub test()

    Sheets("Sheet1").Select    
    Range("A1:A100").Select  
    Selection.copy  

    Sheets("Sheet2").Select         
    Range("A2").Select              
    ActiveSheet.Paste              

    Selection.TextToColumns Destination:=Range("B2"), DataType:=xlDelimited, _
        Other:=True, OtherChar:=Chr(10), Fieldinfo:=Array(1, 1)
  End Sub

 実行後の"コピーまたは移動先を置き換えますか?"というメッセージが出ないようにするにはどうすれば良いでしょうか?
 (超EXCEL初心者)

 かういう事でっか?
     (弥太郎)
 '------------------------
 Sub test()
    Dim i As Long, j As Integer, x, data, tbl
        '正式には x As Variant,data As Variant,tbl As Variantと宣言
    Sheets("sheet1").Range("A1:A100").Copy Sheets("sheet2").Range("a2")
    tbl = Sheets("sheet2").Range("a2:a100")  'sheet2のA2からA100まで変数tblに格納
    ReDim x(1 To UBound(tbl, 1), 1 To 10) '配列変数xにメモリー再割り当て
    For i = 1 To UBound(tbl, 1)  '格納した変数tblの一行目から最終行まで走りまっせぇ

        On Error Resume Next  'エラーが出ても無視して作業続けなはれ
        data = Split(tbl(i, 1), Chr(10), -1)  'データを改行で分けます
        m = data(1)            '分けられないデータ、つまり1行のデータはここでエラーがでる
        If Err.Number = 9 Then  'もしそのデータのエラー番号が9やったら
            x(i, 1) = Empty      '変数xのi階1号室は入居者なし
        Else                      'エラーでなければ(複数行のデータがあれば)
            For j = 0 To UBound(data)  '分割して格納した変数dataを一行目から最終行までループ
                                        'この変数のIndexは0から割り当てられてる
                x(i, j + 1) = data(j)  '変数xのi階j+1(この変数はindex1から始まる)に分割したj番目を格納
            Next j
        End If
    Next i
    Sheets("sheet2").Cells(2, 2).Resize(UBound(tbl, 1), UBound(x, 2)) = x
                            'sheet2のrange("b2")から最終行の列方向の最も飛び出た列まで
                            '格納した変数xを一気に吐き出しなさい
    On Error GoTo 0        'エラー無視はここまでですヨ

 End Sub


 すごいです!
 やりたいことができました!!!

 ヘルプを見てもチンプンカンプンなのでVBA入門サイト(Let's Excel VBA)で
 勉強しているのですが、それでもやはりチンプンカンプンです。

 Dim i As Long, j As Integer, x, data, tbl
 ↑
 すでに最初の時点でつまずいています。
 Dim 変数名 As データ型という基本文法を学びました。
 疑問なのはDim i As Longのあとに何やらいっぱいあるけどこれって何?
 こう書かれている意味がわからないのです。

 わかったのはコピペするこの部分だけでした。
 Sheets("sheet1").Range("A1:A100").Copy Sheets("sheet2").Range("a2")

 教えてください。お願いします。

 (超EXCEL初心者)

 ↑にかきこんどきました。
 これは変数同士のやりとりにしとりますけど、下の様に書いても同じ結果が得られる
 と思います。
 只まぁ、セルにいちいちアクセスするやり方ですから、処理速度は2,3十倍遅く
 なります。
 コードの左にグレーのゾーンがある筈ですから、そこをクリックしてブレークポイント
 を設置し(そこでマクロがストップする)F8でを押下するとどんな作業を繰り返しとる
 か良くお分かりになると思います。
     (弥太郎)
 '------------------------
 Sub test2()
    Dim i As Long, j As Integer
    Sheets("sheet1").Range("A1:A100").Copy Sheets("sheet2").Range("a2")
    For i = 2 To 100
        On Error Resume Next
        data = Split(Cells(i, 1), Chr(10), -1)
        If UBound(data) > 0 Then
            For j = 0 To UBound(data)
                Cells(i, j + 2) = data(j)
            Next j
        End If
    Next i
    On Error GoTo 0
 End Sub


 解説していただいてありがとうございます。
 もうただただすごい!と感心するばかりです。
 それから羨ましくも思います。

 正直、自分にはまだちょっと難しいです。
 日々勉強ってことですかね?
 がんばります!

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

(超EXCEL初心者)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.