• ベストアンサー

セル内文字を切り取りその列の空白セルに貼付け

B列3行目から添付のようにセル内にカンマを含む文字がありカンマで区切った文字ごとに切り取り矢印右のように同B列の次の空白行に順に貼り付けたく、その際カンマは削除したいのですが行数が多くてできればVBAコードがお分かりなる方宜しくお願いします。 環境はwindows7 office2013です。

質問者が選んだベストアンサー

  • ベストアンサー
  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.4

>その際カンマは削除したいのですが行数が多くてできればVBAコードがお分かりなる方宜しくお願いします。 VBAのコードを記述するにはフローチャートを作成して仕事の流れを定義することが重要です。 フローチャートに沿ってトライ&エラーで確認しながらコードの記述を勧めます。 私なりの解釈でフローチャートを脳裏に浮かべてコーディングすると下記のようになりました。 Sub Sample() nextrow = 1 Cells(nextrow, 2).Select Row = 1 Do While Row <= Cells(Rows.Count, 2).End(xlUp).Row If InStr(Cells(Row, 2), ",") > 0 Then b = Cells(Row, 2) Cells(Row, 2) = Left(b, InStr(b, ",") - 1) nextrow = Cells(nextrow, 2).End(xlDown).Row If nextrow = Rows.Count Then nextrow = Row Cells(nextrow + 1, 2) = Mid(b, InStr(b, ",") + 1, Len(b)) End If Row = Row + 1 Loop End Sub 処理結果は添付画像のようになります。

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

例データ(質問と少し違うかも9 Sheet1の B1:B7に ーー B列 名前 うい,あた お,え,か い,きくけ ーー 標準モジュール Sub test01() Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") sh2.Range("B1") = "B列" sh2.Range("B2") = "名前" k = 3 lr = Range("B10000").End(xlUp).Row MsgBox lr For Each cl In sh1.Range("b3:B" & lr) If cl = "" Then GoTo p1 MsgBox cl x = Split(cl, ",") For i = 0 To UBound(x) MsgBox x(i) sh2.Cells(k, "B") = x(i) k = k + 1 Next p1: Next End Sub ーー 実行結果 Sheet2のB1:B9 ーー B列 名前 うい あた お え か い きくけ

kuma0220
質問者

お礼

ありがとうございます。勉強になります。

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.3

こんな感じでつくってみました。 ・データが入っているセルにはカンマ区切りで先頭のデータが残る ・先頭以外のデータは、空セルに順番に入れる Sub sample()   Dim sAbsence() As String   Dim vData As Variant   nCount = 0   For nRow = 3 To Cells(Rows.Count, 2).End(xlUp).Row     If Cells(nRow, 2) <> "" Then       vData = Split(Cells(nRow, 2), ",")       'データ有セルには先頭データを残す       Cells(nRow, 2) = vData(0)       '2つ目以降のデータを取得       For i = 1 To UBound(vData)         ReDim Preserve sAbsence(nCount)         sAbsence(nCount) = vData(i)         nCount = nCount + 1       Next i     End If   Next nRow      '先頭以外のデータを空セルに貼り付け   nSelRow = 3   For j = 0 To UBound(sAbsence)     If Cells(nSelRow + 1, 2) <> "" Then        nSelRow = Cells(nSelRow, 2).End(xlDown).Row + 1     Else       nSelRow = nSelRow + 1     End If     Cells(nSelRow, 2) = sAbsence(j)   Next j End Sub

kuma0220
質問者

お礼

ありがとうございます。勉強になります。

回答No.2

添付図のように 1、2行間隔で切り出す。 2、1番目と2番目を切り出す。 というのであれば、VBAコードを書く必要はありません。添付図では、以下の関数を利用しています。しかし、 Excel の関数でも可能だと思います。 で、問題は、冒頭のルールが崩れた場合。まあ、その時は、VBAコードを書くことになるかと・・・。でも、その場合でも CutStr()を利用すればチョイチョイだと思いますよ。なお、CutStr()の使用は次のようです。 ? CutStr("AAA,BBB,CCC", ",", 1) AAA ? CutStr("AAA,BBB,CCC", ",", 2) BBB ? CutStr("AAA,BBB,CCC", ",", 3) CCC ? CutStr("AAA,BBB,CCC", ",", 4) ? CutStr("AAA and BBB and CCC", " and ", 1) AAA ? CutStr("AAA and BBB and CCC", " and ", 2) BBB  例外を知っているのは質問者だけ。CutStr()を利用されたらVBAは書けるでしょう。 祈、成功! Option Explicit Public Function CutStr(ByVal Text As String, _           ByVal Separator As String, _           ByVal N As Integer) As String   Dim strDatas() As String   strDatas = Split("" & Separator & Text, Separator, , 0)   CutStr = strDatas(N * Abs((N <= UBound(strDatas)))) End Function

kuma0220
質問者

お礼

ありがとうございます。

  • SI299792
  • ベストアンサー率48% (712/1469)
回答No.1

空白が余った場合、足りない場合のルールが、わかりません。 例えば、B5は3つに分かれているのに、空白が1つしかありません。 この場合、余った「か」はB8に行っています。そのため、 「い,きくけ」が「い,か,きくけ」と変換されているように見えます。 空白が余った場合、足りない場合どうするのか説明して下さい。

kuma0220
質問者

お礼

ありがとうございます。

関連するQ&A

  • セル内文字を切取りその行範囲の列の空白セルに貼付

    B列3行目から添付のようにセル内にカンマを含む文字がありカンマで区切った文字ごとに切り取り矢印右のように同B列の次の空白行に順に貼り付けたく、その際カンマは削除したいです。また等間隔の名前の行がある中で枠内の空白に文字を張付けたく等間隔行数枠が多くてできればVBAコードがお分かりなる方宜しくお願いします。 環境はwindows7 office2013です。

  • VBAでセル内の文字列を一行にする方法

    ExcelのVBAで、セル内に折り返しで3行に書かれている文字列を、各文字列間に空白を1つ入れて、1行につなげるにはどうしたらいいですか

  • エクセルで空白のセルを探して貼り付け

    エクセルVBAでSheet2の指定のセルをコピーして、 Sheet1にある表の中の指定の列の空白セルを探して貼り付けるVBAを作成したいのですが、うまく出来ません。 Sheet1の表は1行目、2行目は見出しの項目が並んでいます。 3行目から50行目までは値を入力するようになっていて、 51行目はそれらをの集計が表示されるようになっています。 下記のVBAを作成したら3行目~50行目までの空欄に貼り付けず、 52行目に貼り付けてしまいます。 ----------------------------------------------------------- Sheets("Sheet2").Range("B6").CurrentRegion.Copy Sheets("Sheet1").Cells(Rows.Count, "B").End(xlUp).Offset(1).PasteSpecial xlPasteValues Application.CutCopyMode = False ------------------------------------------------------------ 修正して頂けないでしょうか? 宜しくお願いします。

  • エクセルで文字最終行の空白セルへ移動

    エクセル2000です。 1000行内で間にとびとび(順不同)に空白セル、他は文字有りです。 (1000行目は文字あり) シートが10個あり、各シートともばらばら(ウィンドー枠固定位置)ですが、ウィンドー枠固定内の行に「最終行へ移動」のボタンを設け、いずれの行からも、最終文字入力の次の行空白セル(AからZ列のいずれか)へ移動したいです。 方法がありますでしょうか? VBAの場合、素人につきVBAへの入力方法等も一緒にお願いします。またVBAの場合、ソフトを立ち上げたら直ぐに実行できるようにしたいです。(立ち上がり時のマクロ警告はあり) よろしくお願いいたします。

  • "0"だけを空白で返すには?

    Excel2000を使用しています。VBAである文字列データ(数値)を必要な長さに分割してシートの1行目から順にセルに貼り付けています。 例)要素数が20個ならA1セルからA20セルまでに その際数値が”0”の時は空白に置換して貼り付けているのですが、「10.3」や「50.6」などの”0”までなくなってしまい、セルに貼り付けた際「1.3」や「5.6」になってしまいます。 純粋に”0”だけ空白に(置換)してセルに貼り付けるにはどうすればいいのでしょうか?教えてください。

  • 空白セルを選んで、指定した順に貼り付けるコード

    文字列を空白セルに指定した優先順位の順で、貼り付けるコードについてお聞きします。 A1をコピーしそれをB1に貼り付け。 もし、貼り付け先のセルのB1が空白でなければB2、B3、B4、B5のように順位を指定して貼り付けをしたいと思います。 どのような方法があるのでしょうか。 ご回答宜しくお願いします。

  • 文字入力セルにのみに番号を順に付ける

    ExcelでD3:D12に文字が入力されたあとボタン押しで同じ行B列のB1:B12に入力された文字のセル分だけ順番に番号を入力したいのですがVBAコードが解る方ご教授宜しくお願いします。 office2013です。

  • エクセルで空白セルを寄せたい

    エクセル2002使用です VBAは使わずに関数だけで空白セルがあるセルを詰めて表示したいのですが・・・   A|B|C|D|E|F|G 1 あ い う え お か き 2 ○   ○ ○   ○ の表を   A|B|C|D|E|F|G 1 あ う え か  2 ○ ○ ○ ○ のように表を書き換えたいのです。 1行目には必ず文字が入力されています。 2行目には入力されているセルと空白セルが不定期に入力されています。 2行目のセルが空白ならば、1行目のセルも削除して左へ詰めて 表を転記したいのです。 よろしくお願いします。

  • 文字列が同じ場合、セルに色を塗りたい

    エクセル VBAでリストにある文字列と他のセルの文字列が末尾まで完全に同一の場合、 セルに色を塗るにはどのようなコードを記入すればよろしいでしょうか? 具体的には下記のような動きができればと考えております。 G列にリストがあります。(G列のリストの数は変動します) このリストの文字列とB2:B7とE2:E7の範囲の文字列が末尾まで完全に同一の場合、 B2:B7とE2:E7のセルに黄色で色を塗る。 また、リストにはあるけど、B2:B7とE2:E7のセルにない文字列がある場合、 リストのその文字列があるセルに緑で色を塗る。 上記のような動きをするには、エクセル VBA でどのようなコードを記入すればよろしいでしょうか? エクセルは2010及び2007を使用しております。 よろしくお願いします。

  • 列が空白なら削除したい

    「もし○列が空白なら削除、空白でない(ひとつでもセルに文字が入力されている)ならそのまま」ということを×列まで順に行いたいのですがどうすればいいのでしょうか? よろしくお願いします。

専門家に質問してみよう