Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11193 / 13644 ツリー ←次へ | 前へ→

【17545】カンマ区切りのデータ列の分解と表の整形 しん 04/9/2(木) 3:04 質問[未読]
【17548】Re:カンマ区切りのデータ列の分解と表の整形 かみちゃん 04/9/2(木) 7:44 回答[未読]
【17553】Re:カンマ区切りのデータ列の分解と表の整形 しん 04/9/2(木) 10:03 お礼[未読]
【17550】Re:カンマ区切りのデータ列の分解と表の整形 こもれび 04/9/2(木) 9:02 回答[未読]
【17554】Re:カンマ区切りのデータ列の分解と表の整形 しん 04/9/2(木) 10:08 お礼[未読]

【17545】カンマ区切りのデータ列の分解と表の整形
質問  しん E-MAIL  - 04/9/2(木) 3:04 -

引用なし
パスワード
   いつもお世話になっております。

たとえば、下記のような罫線付きExcel表(ワークシートSheet1)

┌─┬─┬───┐
│A │B │C   │
├─┼─┼───┤
│1 │あ│a   │
├─┼─┼───┤
│2 │い│   │
├─┼─┼───┤
│3 │う│b,c  │
├─┼─┼───┤
│4 │え│d   │
├─┼─┼───┤
│5 │お│e,f,g │
└─┴─┴───┘

を下記のような罫線付きExcel表(ワークシートSheet1)

┌─┬─┬─────┐
│A │B │C     │
├─┼─┼─┬─┬─┤
│1 │あ│a │ │ │
├─┼─┼─┼─┼─┤
│2 │い│ │ │ │
├─┼─┼─┼─┼─┤
│3 │う│b │c │ │
├─┼─┼─┼─┼─┤
│4 │え│d │ │ │
├─┼─┼─┼─┼─┤
│5 │お│e │f │g │
└─┴─┴─┴─┴─┘

に自動的に変換するVBAコードを教えて頂きたいのですが、よろしくお願いします。ただし、行と列の数は任意とします。要は最終列にあるカンマ区切りのデータを分離して最終列 +(データ数 - 1)列の罫線付き表に書き直し、最終列のタイトル(第1行目)のセルは最大データ数(上記の例では3)に応じたセルの大きさにしたい。

【17548】Re:カンマ区切りのデータ列の分解と表の...
回答  かみちゃん  - 04/9/2(木) 7:44 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>に自動的に変換するVBAコードを教えて頂きたいのですが、よろしくお願いします。ただし、行と列の数は任意とします。要は最終列にあるカンマ区切りのデータを分離して最終列 +(データ数 - 1)列の罫線付き表に書き直し、最終列のタイトル(第1行目)のセルは最大データ数(上記の例では3)に応じたセルの大きさにしたい。

・セルA1から表が始まること
・表の途中には、1行がすべて空白の行、1列がすべて空白の列がないこと
以上を前提にすると、以下のマクロでできると思います。(動作確認済み)
多少、マクロの記録そのままのコードを載せていますので、長くなっています。
長ければ※印の行は削除していただいてもいいです。

ポイントは、変形前の最終列を取得と、その列全体を「データ」の「区切り位置」でカンマで区切っているところです。

Option Explicit

Sub Macro1()
  Dim MaxColumn As Integer, MaxColumnStart As Integer
  
  '変形前の最終列を取得
  '表の途中に空白行、空白列がないことが前提
  MaxColumn = Range("A1").CurrentRegion.Columns.Count
  MaxColumnStart = MaxColumn
  '最終列をカンマ区切りで分割
  Columns(MaxColumn).Select
  Selection.TextToColumns Destination:=Cells(1, MaxColumn), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
    Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
    :=Array(1, 1), TrailingMinusNumbers:=True
  '変形後の表の大きさを取得
  MaxColumn = Range("A1").CurrentRegion.Columns.Count
  '変形後の表全体の罫線処理(マクロの記録により記述)
  Range("A1").CurrentRegion.Select
  Selection.Borders(xlDiagonalDown).LineStyle = xlNone '※
  Selection.Borders(xlDiagonalUp).LineStyle = xlNone '※
  With Selection.Borders(xlEdgeLeft)
    .LineStyle = xlContinuous
    .Weight = xlThin '※
    .ColorIndex = xlAutomatic '※
  End With
  With Selection.Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .Weight = xlThin '※
    .ColorIndex = xlAutomatic '※
  End With
  With Selection.Borders(xlEdgeBottom)
    .LineStyle = xlContinuous
    .Weight = xlThin '※
    .ColorIndex = xlAutomatic '※
  End With
  With Selection.Borders(xlEdgeRight)
    .LineStyle = xlContinuous
    .Weight = xlThin '※
    .ColorIndex = xlAutomatic '※
  End With
  With Selection.Borders(xlInsideVertical)
    .LineStyle = xlContinuous
    .Weight = xlThin '※
    .ColorIndex = xlAutomatic '※
  End With
  With Selection.Borders(xlInsideHorizontal)
    .LineStyle = xlContinuous
    .Weight = xlThin '※
    .ColorIndex = xlAutomatic '※
  End With
  '拡張したタイトル行の修正
  Range(Cells(1, MaxColumnStart), Cells(1, MaxColumn)).Select
'  Range("C1:E1").Select
  Selection.Borders(xlDiagonalDown).LineStyle = xlNone '※
  Selection.Borders(xlDiagonalUp).LineStyle = xlNone '※
  With Selection.Borders(xlEdgeLeft) '※
    .LineStyle = xlContinuous '※
    .Weight = xlThin '※
    .ColorIndex = xlAutomatic '※
  End With '※
  With Selection.Borders(xlEdgeTop) '※
    .LineStyle = xlContinuous '※
    .Weight = xlThin '※
    .ColorIndex = xlAutomatic '※
  End With '※
  With Selection.Borders(xlEdgeBottom) '※
    .LineStyle = xlContinuous '※
    .Weight = xlThin '※
    .ColorIndex = xlAutomatic '※
  End With '※
  With Selection.Borders(xlEdgeRight) '※
    .LineStyle = xlContinuous '※
    .Weight = xlThin '※
    .ColorIndex = xlAutomatic '※
  End With '※
  Selection.Borders(xlInsideVertical).LineStyle = xlNone
  '拡張したタイトルをセル結合する
  Selection.MergeCells = True
  Range("A1").Select
End Sub

【17550】Re:カンマ区切りのデータ列の分解と表の...
回答  こもれび  - 04/9/2(木) 9:02 -

引用なし
パスワード
   こもれびです

表の途中に空白がない場合はかみちゃんさんの手法でよいと思いますが、
空白がある場合は「シーケンシャルファイルの入出力」で解決するしかないかな
と思います。
openステートメント、print#、input#、などのヘルプを参照すると
ファイルの入出力のサンプルコードが載っております。
1行にカンマつきデータが混在していますからwrite#は使わないほうがよいと思います。

ヘルプで調べてどうにもならないようでしたらレスを付けてください。

【17553】Re:カンマ区切りのデータ列の分解と表の...
お礼  しん E-MAIL  - 04/9/2(木) 10:03 -

引用なし
パスワード
   ▼かみちゃん さん:
おはようございます。
さっそくVBAコード教えて頂きありがとうございました。今朝、いくつかの例で試してみたのですが、全部うまく変換できました。行き詰まっていた処理ができるようになり感謝感激です。
さすがかみちゃんですね。これからもどうぞよろしくお願いします。

【17554】Re:カンマ区切りのデータ列の分解と表の...
お礼  しん E-MAIL  - 04/9/2(木) 10:08 -

引用なし
パスワード
   ▼こもれび さん:
おはようございます。

>表の途中に空白がない場合はかみちゃんさんの手法でよいと思いますが、
>空白がある場合は「シーケンシャルファイルの入出力」で解決するしかないかな
>と思います。
このようなケースも将来的には考えられますので、この際少し勉強をしてみたいと思います。

>openステートメント、print#、input#、などのヘルプを参照すると
>ファイルの入出力のサンプルコードが載っております。
>1行にカンマつきデータが混在していますからwrite#は使わないほうがよいと思います。
>
>ヘルプで調べてどうにもならないようでしたらレスを付けてください。
いろいろ大切なコメントありがとうございました。ヘルプを見てみてわからなかったらまたお助け下さい。よろしくお願いします。

11193 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free