マンガでよめる痔のこと・薬のこと

Excelで同一セル内にに記載してあるデータ(カンマ区切り)を
行を分けて表示したいのですが、簡単な方法はありますか?


例)

A列 B列
---- --------
001 T1,T2,T3



A列 B列
---- --------
001 T1
001 T2
001 T3

と変更したいのです。


アドバイスをお願いいたします。

A 回答 (6件)

こんばんは。



こんな風にしたらどうでしょうか?
ただし、C列, D列を使用して展開して、それを元の列に戻して上書きしています。
上書きモードを避けたいのでしたら、

 Const MYOPTION As Boolean = False
 
にすると、C列、D列に展開されます。

このような展開方法に問題があれば、全面的に書き換えます。
なお、Version は、XL2000 ~ 2003 で稼動します。

'------------------------------------------

Sub TestSplit()
 Dim myRng As Range
 Dim buf As String
 Dim myAry As Variant
 Dim i As Long, j As Long
 Dim strFirst As String
 '上書きモード False =OFF, True = ON
 Const MYOPTION As Boolean = True
 
 If Selection.Count = 1 Then
  Set myRng = ActiveCell.CurrentRegion
 Else
  Exit Sub
 End If
 
 With myRng
  If WorksheetFunction.CountA(.Cells) < 2 Then
   MsgBox "分割するセルを選択をしてください。", vbInformation
   Exit Sub
  End If
  If .Columns.Count <> 2 Then
   MsgBox "データは2列でないと、現在のマクロでは出来ません。", vbInformation
   Exit Sub
  End If
  If InStr(.Cells(1, 2).Value, ",") = 0 Then
   MsgBox "カンマ付きデータではありません。", vbInformation
   Exit Sub
  End If
 End With
 i = 0 '行の初期設定
 Application.ScreenUpdating = False
 For Each c In myRng.Columns(2).Cells
  myAry = Split(c.Value, ",")
  c.Offset(i, 1).Resize(UBound(myAry) + 1).NumberFormatLocal = "000"
  c.Offset(i, 1).Resize(UBound(myAry) + 1).Value = c.Offset(, -1).Value
  For j = 0 To UBound(myAry)
   c.Offset(j + i, 2) = Trim(myAry(j))
  Next j
  i = i + UBound(myAry)
 Next c
 If MYOPTION Then
   With myRng.CurrentRegion.Offset(, 2).Resize(, 2)
    .Copy myRng.Cells(1, 1)
    .Clear
   End With
 End If
 Application.ScreenUpdating = True
 Set myRng = Nothing
End Sub

'------------------------------------------
    • good
    • 0
この回答へのお礼

返事が遅くなり大変申し訳ございませんでした。

どうもありがとうございます!
望んだ結果が返ってまいりました。

この方法にて対応を行いたいと思います。

お礼日時:2006/08/31 14:27

^^;)



説明不足ということはなかったように思います。

1行に展開されたデータを…

6. 形式を選択して貼り付け→値 、 行列を入れ替える とし、OK とする。
7. A列の「001」に相当する値を、必要量コピーする

としたつもりです。

データが多いと、煩雑になりやすいので、ほかの方の回答のようなマクロの方が、簡便なのでしょうけどね。
    • good
    • 0
この回答へのお礼

お返事が遅くなり申し訳ございません。

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

134様がおっしゃるっとおりデータ量が多めなので
マクロにて実施したいと思います。

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

お礼日時:2006/08/31 14:24

#2です。



>同一セル内にに記載してある

と書いてありましたので、質問の読み違えました。

セルが分かれているので、関数の処理も考えました。

A1   B1
001   T1,T2,T3

A2:
=IF(B2<>"",$A$1,"")

B2:
=MID($B$1,1,FIND(",",B1)-1)

B3:
一応のエラー処理は施してあります。
フィルダウン・コピー

=IF(ISERROR(FIND("^",SUBSTITUTE($B$1,",","^",ROW(A1)))),"",IF(ISERROR(FIND("^",SUBSTITUTE($B$1,",","^",ROW(A2)))),RIGHT($B$1,LEN($B$1)-FIND("^",SUBSTITUTE($B$1,",","^",ROW(A1)))),MID($B$1,FIND("^",SUBSTITUTE($B$1,",","^",ROW(A1)))+1,FIND("^",SUBSTITUTE($B$1,",","^",ROW(A2)))-FIND("^",SUBSTITUTE($B$1,",","^",ROW(A1)))-1)))


となります。

なお、マクロの修正をしておきます。

一応、どこのモジュール(クラスModule以外)に貼り付けても可能なはずです。
'--------------------------------------------------------
Sub TestSplitR()
 Dim myRng As Range
 Dim buf As String
 Dim myAry As Variant
 Dim strFirst As String
 If Selection.Count > 0 Then
  Set myRng = Selection.Cells(1, 1)
 End If
 
 With myRng
  If .Value = "" Or InStr(.Offset(, 1).Value, ",") = 0 Then
   MsgBox "横に2列並んでいるセルを選択をしてください。", vbInformation
   Exit Sub
  End If
  myAry = Split(.Offset(, 1).Value, ",")
  
  Application.ScreenUpdating = False
  .Offset(1).Resize(UBound(myAry) + 1).NumberFormatLocal = "000"
  .Offset(1).Resize(UBound(myAry) + 1).Value = .Value
  For i = 0 To UBound(myAry)
   .Cells(i + 2, 2) = Trim(myAry(i))
  Next i
  Application.ScreenUpdating = True
 End With
 Set myRng = Nothing
End Sub
'--------------------------------------------------------

この回答への補足

いろいろと考えていただき
ありがとうございます。

関数、マクロと両方試したのですが、
いずれも単一行の場合のみの変換ですよね。

こちらの説明不足で申し訳ないのですが
複数行の対応方法についても教えていただけますと
大変助かります。

補足日時:2006/08/21 21:24
    • good
    • 0

'単一セルを選択して実行


Sub カンマ区切りの文字列を縦に展開()
  Dim myStr As String, myArr As Variant
  With Selection
    If .Count > 1 Then Exit Sub
    myStr = .Text
    If myStr = "" Then Exit Sub
    myArr = Split(Replace(myStr, ", ", ","), ",")
    .Resize(UBound(myArr) + 1).Value = WorksheetFunction.Transpose(myArr)
  End With
End Sub

この回答への補足

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

すいません。
こちらの説明不足でした。

以下のように、複数行の場合は無理でしょうか?

A B
--- ------
001 T1,T2,T3
002 T4,T5,T6



A B
--- ------
001 T1
001 T2
001 T3
002 T4
002 T5
002 T6

補足日時:2006/08/21 21:23
    • good
    • 0

こんばんは。



関数でも考えて見ましたが、補助セルを使わないとややこしくなりそうなので、マクロで考えてみました。その文字列の下に展開されます。その文字をアクティブにしてから、実施してみてください。

Sub TestSplit()
 Dim buf As String
 Dim myAry As Variant
 Dim strFirst As String
 With ActiveCell
 If .Value = "" Or InStr(.Value, " ") = 0 Then Exit Sub
 strFirst = Mid(.Value, 1, InStr(.Value, " ") - 1)
 buf = Mid(.Value, InStr(.Value, " ") + 1)
 myAry = Split(buf, ",")
 
 Application.ScreenUpdating = False
 For i = 0 To UBound(myAry)
  .Cells(i + 2, 1).NumberFormatLocal = "000"
  .Cells(i + 2, 1).Value = strFirst
  .Cells(i + 2, 2) = Trim(myAry(i))
 Next i
 Application.ScreenUpdating = True
 End With
End Sub

この回答への補足

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

すいません。
こちらの説明不足でした。

以下のように、複数行の場合は無理でしょうか?

A B
--- ------
001 T1,T2,T3
002 T4,T5,T6



A B
--- ------
001 T1
001 T2
001 T3
002 T4
002 T5
002 T6

補足日時:2006/08/21 21:22
    • good
    • 0

1. B2セルをクリック


2. データ→区切り位置
3. 区切り記号に「カンマ」をチェック
4. ウィザードに従い、最後まで
5. 複数行に、データが分割されるので、分割されたデータをコピー
6. 形式を選択して貼り付け→値 、 行列を入れ替える とし、OK とする。
7. A列の「001」に相当する値を、必要量コピーする


 という方法が、最も早そうですかね。

この回答への補足

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

すいません。
こちらの説明不足でした。

以下のように、複数行の場合は無理でしょうか?

A B
--- ------
001 T1,T2,T3
002 T4,T5,T6



A B
--- ------
001 T1
001 T2
001 T3
002 T4
002 T5
002 T6

補足日時:2006/08/21 21:21
    • good
    • 0

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qexcelで1つのセルだけを分割する方法

excelで、行全体または列全体でなく、1つのセルだけを縦または横に分割する方法はありますか?

ご存知の方、是非お教えください。

Aベストアンサー

エクセルでセルは最小単位です、分割は出来ません。
むしろ逆に考えて、不要な行はセルを結合して1列的に見せてはどうでしょう。
見た目でやるなら(多分したいことを想像して)
桁合わせだけの問題なんですが。
(1)文字列のケースとする。数値や半角が混じると
うまくいかないかも。
(2)例えばD1セルに半角スペース10個を入れる。
(3)A列はフォントをPのつくものは避ける。
(4)例えばB列、c列に文字列データが入っているとする。
(5)A1セルに
=MIDB($D$1,1,10-LENB(B1))&B1&MIDB($D$1,1,10-LENB(C1))&C1
といれて下行に複写する。LENBをあえて使う。
(データ例)
    (A列)       (B列)  (C列)
大阪市 西園寺大阪市西園寺
長岡京市 熊山長岡京市熊山
津市 佐藤津市佐藤
(6)真中に縦に図形の直線を貼りつける。

Qエクセルのセルの中で改行して入力したものを分割したいんです。

エクセルの入力編集について質問です。

セルに改行(Alt&Enter)をして下記のように入力を行ったのですが、

 Γ ̄ ̄Τ ̄ ̄ ̄ ̄¬
 |番号|内容1 |
 |  |内容2 |
 L__⊥____」

データ処理に不便なために同一セル内にある「内容1」と「内容2」を下記のように別々のセルにしたいと思います。

 Γ ̄ ̄Τ ̄ ̄ ̄ ̄¬
 |番号|内容1 |
 ―――――――――
 |  |内容2 |
 L__⊥____」

もしくは、
 Γ ̄ ̄Τ ̄ ̄ ̄ ̄¬
 |番号|内容1 |
 ―――――――――
 |番号|内容2 |
 L__⊥____」

手作業にてコピーアンドペーストと行の挿入を繰り返しを行うのは、非常に時間がかかるかと思います。

そこで、なにか一括で処理できる方法はありませんでしょうか?お願いします。
また、一括ではなくても入力が簡単になる方法はありませんか?

最後になりますが、Excel 2003を利用しています。

Aベストアンサー

    A      B
1  番号A  内容A
         内容B
2  番号B  内容C
         内容D
3  番号C  内容E
         内容F

のように並んでいる場合ですが、

1.A1:B3を選択してコピーし、Wordに形式選択(HTMLかリッチテキスト)で貼り付け。
2.Wordに貼り付けた全体を選択してコピーし、Excelの別シートに貼り付け。
3.番号の列が結合された状態なので、それらのセルをまとめて選択して結合解除。

ではいかがでしょうか。

Qエクセルで横並びの複数データを縦の一本のデータにしたい

こんにちは。宜しくお願い致します。

   A   B  C
1 静岡 埼玉 
2 福島 東京 愛媛
3 青森 
4 長崎 徳島 愛媛
5 東京 千葉 
6 秋田 兵庫 大阪
.
.
.


例えばこういう形で好きな都道府県の上位3つの解答がそれぞれあったとします。(1個の人もいるし、2個の人もいます)

これを別のシート(同じシートの違う場所でも構いません)に縦並び1本で出したいときどうしたらいいでしょうか。

★こういう風にしたい★

静岡
福島
青森
長崎
東京
秋田
埼玉
東京
愛媛
徳島
愛媛
千葉
兵庫
大阪
.
.

※好きな県などが人によって重複していても構いません、また順不同でもいいです。(縦並びのデータに東京が20個あってもよいということ)

形式を選択して貼り付けで行列を入れ替えるではうまくいかないです。

宜しくお願い致します。

Aベストアンサー

VBAで、もっと簡単に。
下記をVBEの標準モジュールにコピーし貼りつけ。
元データのあるシートで、データのある範囲を範囲指定して(空白セルが範囲内にあっても結構)、下記を実行。
Sub ichiretu()
Dim cl As Range
p = 1
For Each cl In Selection
If cl <> "" Then
Worksheets("sheet3").Cells(p, "A") = cl
p = p + 1
End If
Next
End Sub
Sheet3のA列に並びます。

Q"/"でセル内の文字を縦に分割するマクロについて

マクロ作成の為に、ご協力下さい。

このようなデータが1つのセル内にあります。
aaaa/bbbb/cccc/dddd

このセルに対して、"/"があったら下のセルに入力するようにしたいです。
aaaa
bbbb
cccc
dddd

どのようにしたら良いか見当がつきません。。。
よろしくお願いいたします。

※区切り位置の機能を縦に使うようなイメージです。

Aベストアンサー

#1です。

>v = Split(Range("A1").Value, "/")
変数vにSplit関数にて"/"で区切られた配列を格納します。

この場合
v(0)="aaaa"
v(1)="bbbb"
v(2)="cccc"
v(3)="dddd"
となります。

>Range("A2").Resize(UBound(v) + 1).Value
Resize(行、列)で、A2からのセル範囲を変更します。
今回の場合行方向に増やしますので、Resize(行,1)或いはResize(行)となります。
⇒列方向なら、Resize(1,列)或いはResize(,列)となります。
","のつけ方に気をつけて下さい。

>Resize(UBound(v) + 1)
行方向に増やす場合ですが、Ubound関数では添字「()内の数」の最大値を求めます。
ただし、今回は0~3までの内での最大値になりますので3ですが、データ数は4こありますので
+1をしてセル範囲をA2~A5としてます。

>= Application.Transpose(v)
先のセル範囲に対して変数vを代入していきますが、そのままではvは横方向だけにしか
データをきちんと出すことができません。
⇒Range("A2").Resize( ,UBound(v) + 1).Value = v
 とやってみるとA2より右に代入します。
 列方向に代入するなら = v でいけます。

そこで方向を変えるために、TRANSPOSE関数(ワークシート関数)を呼び出します。
⇒Application.が呼び出している物です。
セル範囲を指定して「コピー」右クリックで「形式を選択して貼り付け」
にある「行列を入替える」と言う感じの作業です。

ワークシート関数を使う(WorksheetFunction プロパティ) 
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_ws_kansu.html#WorksheetFunction
ただ「WorksheetFunction」の部分は省けるので、省いてしまってますが。

こんな感じでしょうか。

#1です。

>v = Split(Range("A1").Value, "/")
変数vにSplit関数にて"/"で区切られた配列を格納します。

この場合
v(0)="aaaa"
v(1)="bbbb"
v(2)="cccc"
v(3)="dddd"
となります。

>Range("A2").Resize(UBound(v) + 1).Value
Resize(行、列)で、A2からのセル範囲を変更します。
今回の場合行方向に増やしますので、Resize(行,1)或いはResize(行)となります。
⇒列方向なら、Resize(1,列)或いはResize(,列)となります。
","のつけ方に気をつけて下さい。

>Resize(UBound(v) + 1)
行方...続きを読む

Qエクセルの表ををメモ帳などにカンマで区切って一列に表記

 はじめまして。よろしくお願いします。

 エクセルで、列に2項目、行が20行の表があります(セル:A1~B20)。
この表のそれぞれの行をカンマで区切って横並べしてテキスト表示
したいのですが、一括で行う方法はないでしょうか。
つまり
エクセル
A1 B1
A2 B2



A20 B20
で表されたものを以下のようにテキスト表記したいのです。
A1 B1,A2 B2,・・・,A20 B20

Aベストアンサー

Wordにコピーしてから編集してはいかがでしょう?
Excelで範囲を選択してコピー
Wordで[形式を選択して貼り付け]-[貼り付ける形式=(テキスト)]を選択して貼り付け
[置換]-[オプション]-[特殊文字]
検索する文字列=[段落記号]
置換後の文字列=[,] で1回目の置換
検索する文字列=[タブ文字] に変更して2回目の貼り付け
お望みの形式になると思いますので
[名前を付けて保存]-[ファイルの種類]=(書式なし(*.txt))]
officeのバージョンで上記と違うかもしれません。

Qエクセルで1列に500行並んだデータを5列毎に改行

エクセル2000で、A1~A500までデータが縦並びに入力されています。

これを5列毎に改行して、横並びのデータに加工したいのですが、何か方法ありますか?

図解すると、、


A1
A2
A3
A4
A5
A6
A7


A500

のデータを

A1 A2 A3 A4 A5
A6 A7 A8 A9 A10
・・・・・・
A496 A497 A498 A499 A500



したいのです。

何かよい方法ありましたらお教え願います。

Aベストアンサー

'直接シートをいじるのでコピーをしてから試してみてください。
Sub Macro1()
COUNTER = 0
For INP = 1 To Cells(Rows.Count, 1).End(xlUp).Row Step 5
COUNTER = COUNTER + 1
Range("A" & INP & ":A" & INP + 4).Copy
Range("B" & COUNTER).PasteSpecial Paste:=xlPasteValues, Transpose:=True
Application.CutCopyMode = False
Next INP
Range("A1").EntireColumn.Delete
End Sub

Qセル内の改行された文字列を分割

初めて質問します。

添付画像のようにセル内の改行された文字列を学校名1、2、3・・・といったように分割をするにはどうすればいいのでしょうか。
ちなみにデータには改行されていない(学校名が一つだけ)のデータもあります。

よろしくお願い致します。

Aベストアンサー

#1です。Excelの機能「区切り位置」でできました。

EXCELのバージョンは何ですか?
2003までなら、メニューの[データ]>[区切り位置]
2007以降なら[データ]>[データツール]グループの[区切り位置]

バージョンに合わせて読み替えてください。
セルB2~セルF5には何も無い状態から始めるものとしますよ。

1)セルA2~A5を選択して「コピー」
2)セルB2に「貼り付け」
3)そのままの状態で、上記の方法で[区切り位置]を起動
4)「カンマやタブなどの・・(後略)」を選んだ状態で「次へ」
5)「区切り文字」の「その他」にチェック(レ点)付ける
6)「その他」の右隣のボックスをクリックしてCtrl+Jキー押下
  (何も入力されないように見えるが、下にある「データのプレビュー」が変化する)
7)「完了」ボタンをクリック

Qセル内改行位置でセルを分割する方法

はじめまして よろしくお願いします。

エクセルで、ひとつのセル内に複数行に分けて入力してあるものを
行でそれぞれひとつのセルに分け直したい場合、

例えばA1のセルに
 1234
 aabbcc
A2のセルに
 12345
 aaabbbccc
 123
と入力してあるものを

A1→1234
A2→aabbcc
A3→12345
A4→aaabbbccc
A5→123
としたいとき、何かいい方法ありますか。

Aベストアンサー

1.A1のセルとA2のセルを選択してコピー
2.メモ帳などのエディタへ貼り付け
3."(ダブルコーテーション)がくっついているはずなので、置換えなどで"を削除する
4.編集したものを全部選択してコピー
5.エクセルへ貼り付け

これでOK。ちょっと手間ですけど...

QEXCELで作成した表(横)を表(縦)に変換ができますか。

EXCELで作表しましたが、横向きに作成した数値の入った表を縦向きに直す方法はどうすればできるか教えてくださいませんか。

Aベストアンサー

表を選択してコピーします。
他の場所か他のシートに、「編集」>「形式を選択して貼り付け」で「行列を入れ替える」にチェックを入れてOKを押します。

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む


人気Q&Aランキング