Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Home Premium : Excel 2007)
セルを結合する
投稿日時: 18/09/26 17:54:16
投稿者: kkkk

検索しましたところ、以下のが近いです。
http://www.moug.net/tech/exvba/0050039.html
上記は連続しないとセルは結合しません。
 
やりたいこと  
テストの下にいくつかの空白セルがあります。テストの次の文字が出現するまでの間を結合したいです。Aセルのみではなく、AセルからZセルまでの間もそのようにしたいですが、どうすれば良いでしょうか?
 
テスト          テスト
(空白)
(空白)
(空白)        (結合)
(空白) マクロ実行→
(空白)
テスト2         テスト2
(空白)
(空白)        (結合)
(空白)
 
宜しくお願いします。

回答
投稿日時: 18/09/26 20:49:25
投稿者: WinArrow
投稿者のウェブサイトに移動

コードの作成依頼は、ご法度です。
 
次の操作をマクロの記録してみてください。
 
「テスト」のセルにカーソルを置いて、
[Ctrl]+[↓]を押す。
 
これで作成されるコードをアレンジしてみましょう。
 
なお、一番下の文字の下の空白を結合するのは、いかがなんでしょう?
 

回答
投稿日時: 18/09/26 21:38:23
投稿者: simple

すでに指摘いただいていますが、
最後の空白がどこまでかは、何か指定がないとわかりませんよね。
 
下の例で言えば、A1:A3 と A5:A7を結合することが目標です。
A8に仮の文字列を入力することで、その前の行までを結合するという印をつけましょう。

   A列
1  aa
2  
3  
4  bb
5  cc
6  
7  
8  dd

 
一行一行判別していってもよいです。
最初はそうしたほうがいいかもしれませんが、
ここではブランク領域に注目したある種のテクニック?を紹介しましょう。
 
(1)
A列の最終行(8行目)を得ることは、Endプロパティを使った例の方法でできますよね。
割と頻発しますから。
       Set rng = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))

(2)
次に、1行目から8行目までを対象として、その範囲のうちブランクセルだけを取り出します。
これは手作業で言えば、ジャンプ機能の活用です。
マクロではこんな風になります。
        Set blanks = rng.SpecialCells(xlCellTypeBlanks)

(3)
次に、そのブランク範囲を連続した範囲に分割し、そのそれぞれの空白領域(A2:A3,A6:A7)
に対して、その一行上と連結した範囲を結合します。
        For Each ar In blanks.Areas
            Union(ar(1).Offset(-1), ar).Merge
        Next

(4)
予め追加しておいた最終行の仮のデータ(dd)を消去します。
        Cells(Rows.Count, 1).End(xlUp).ClearContents  

これらをつなげれば、A列について求める処理になるはずです。
 
あとは、これを各列単位に繰り返すようにすればいいわけですね。
ここで一呼吸置きましょう。
まずは、ここまでトライして実行してみてください。

投稿日時: 18/09/27 13:20:03
投稿者: kkkk

simple様
 
コメントをありがとうございます。
 
「最後の空白がどこまでかは、何か指定がないとわかりません」
そういえばそうでした。なるほどブランク領域を使ったテクニックですね。
分かりやすい解説です。
お陰さまでできました。
 
感謝です。ありがとうございました。