[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『改行文字の入ったセルを分割する』(超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.