質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

2回答

446閲覧

結合セルの情報について

morishinrin3

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/10/22 01:34

イメージ説明

画像のような形で結合されたセルの情報を分割して表にする場合は
どのようにすればよいでしょうか。

結合セルの大きさが違う場合や間に空白セルが挟まることもあり難航しています。

下記の結合セルの解除を行ってみましたが、列によってセルの大きさが違うため
上手くいきませんでした。

ご教示いただけると助かります。

Sub UnmergeCellsAndFillValues() Dim rng As Range For Each rng In ActiveSheet.UsedRange If rng.MergeCells Then With rng.MergeArea .UnMerge .Value = .Resize(1, 1).Value End With End If Next End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2020/10/22 01:51

結合セルを解除するのではなく、結合セルに書かれた情報を読み取り、別シートに書き出すようにしてはいかがでしょうか。
tosi

2020/10/22 03:51

結合セルの値は先頭セルに入っています。 2行に見えるのは改行されているだけです。
guest

回答2

0

そのセルがそのセルを含む結合された範囲の1番目かをチェックし、
1番目以外は処理を飛ばします。
そして、値が空白かどうかはIsEmpty関数でチェックします。

ExcelVBA

1Sub test() 2 Dim Rng As Range 3 Dim c As Range 4 Dim r(1 To 7) As Variant 5 Dim v1 As Variant 6 Dim v2 As Variant 7 Dim i As Long 8 9 With ActiveSheet.Range("A1").CurrentRegion 10 Set Rng = Intersect(.Cells, .Offset(1, 1)) 11 End With 12 13 For Each c In Rng 14 If c.Address = c.MergeArea(1).Address Then 15 If IsEmpty(c.Value) = False Then 16 i = i + 1 17 v1 = Split(c.Value, vbLf) 18 v2 = Split(v1(1), "(") 19 20 r(1) = Intersect(c.EntireColumn, Rng.Rows(0)).Value 21 r(2) = Intersect(c.EntireRow, Rng.Columns(0)).Value 22 r(3) = Intersect(c(c.MergeArea.Rows.Count + 1, 1).EntireRow, Rng.Columns(0)).Value 23 r(4) = v1(0) 24 r(5) = v1(2) 25 r(6) = v2(0) 26 r(7) = Val(v2(1)) 27 ActiveSheet.Range("E4").Cells(i, 1).Resize(, 7).Value = r 28 End If 29 End If 30 Next 31End Sub 32

投稿2020/10/22 09:23

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

MergeCellsプロパティでそのセルが結合されいるかどうか、
MergeAreaプロパティで結合されてるセル範囲を取得できます。
それを利用してコードを組めばいいでしょう。

Office TANAKA - Excel VBA Tips[結合セルを調べる]


あれからサンプルを作成して試してみたら、.Offset(1) で結合セルの場合でも次のセルへ移動しますね。
(A2~A6 が結合セルの場合、Range("A2").Offset(1) で Range("A7") へ移動する)

ということで、下記のようなコードで結合セルでも順に最後まで移動しながらデータを取得できます。

vba

1Sub Test() 2 Dim endRow As Long 3 endRow = Cells(Rows.Count, 2).End(xlUp).Row 4 5 Dim curRng As Range 6 Set curRng = Cells(2, 2) 7 8 Do Until curRng.Row > endRow 9 If curRng.Value <> "" Then 10 Debug.Print "開始:"; curRng.Offset(0, -1).Text 11 Debug.Print "終了:"; curRng.Offset(1, -1).Text 12 Debug.Print curRng.Text 13 End If 14 Set curRng = curRng.Offset(1) ’次のセルへ移動(結合セルでもOK) 15 Loop 16End Sub

B列のみ順に移動していってイミディエイトに出力する例ですので、これをもとに改良してご希望の出力になるようにしてください。

投稿2020/10/22 02:15

編集2020/10/22 10:47
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問