🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

4回答

4602閲覧

[VBA]他の行の最終行に合わせてセルの書式を結合したい

Jonny_dayo

総合スコア48

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2019/10/15 04:11

編集2019/10/16 01:39

前提・実現したいこと

図のように、別のエクセルファイルから持ってきたデータを一覧にするファイルを作成しています。

例1:
イメージ説明
この図を下記のように、
A行を別の列の最終行までセルの結合させたいです。

例2:
イメージ説明

MaxRowを使ってMergeするのかな?と思ったのですが、
どうやれば良いのか分からず、、お力添え頂けると幸いです…

コピー元(セルの結合を全て解除して使用します):
イメージ説明

ソースコード

Option Explicit Sub import_excel() '最終行を変数に取得 Dim MaxRow As Integer MaxRow = Worksheets("2019年10月").Cells(Rows.Count, 1).End(xlUp).Row + 2 Dim arrayPath As Variant arrayPath = Application.GetOpenFilename("ブック, *.xlsm", MultiSelect:=True) If IsArray(arrayPath) Then MsgBox "ちょっと時間かかるかも(´;ω;`)" '画面の描画を停止する Application.ScreenUpdating = False 'Forループ(iが1から配列の要素数まで) Dim i As Integer For i = 1 To UBound(arrayPath) '変数を用意し、ブックを開いて格納 Dim openBook As Workbook Set openBook = Workbooks.Open(arrayPath(i)) 'セルの結合を解除する Cells.Select Selection.UnMerge With Workbooks("管理表VBA").Worksheets("2019年10月") .Range("A" & MaxRow).Value = openBook.Worksheets(1).Range("E6").Value Call RgCopy(.Range("B" & MaxRow), openBook.Worksheets(1).Range("AA9:AA14")) Call RgCopy(.Range("D" & MaxRow), openBook.Worksheets(1).Range("S9:S14")) .Range("E" & MaxRow).Value = openBook.Worksheets(1).Range("AH15").Value .Range("F" & MaxRow).Value = openBook.Worksheets(1).Range("H8").Value .Range("G" & MaxRow).Value = openBook.Worksheets(1).Range("B4").Value End With Application.DisplayAlerts = False openBook.Close MaxRow = MaxRow + 2 Next i '画面の描画を再開する Application.ScreenUpdating = True MsgBox "おわたよ(`・ω・´)" End If End Sub
'fromRg:コピー元セル 'toRg:コピー先セル Private Sub RgCopy(toRg As Range, fromRg As Range) Dim rg As Range Dim i As Long i = 0 For Each rg In fromRg If rg.Value <> "" Then toRg.Offset(i).Value = rg.Value i = i + 1 End If Next End Sub

ツールのバージョン

Excel 2016

追記(19/10/15)

イメージ図をもっとわかりやすいものに変更しました。

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

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

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

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

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

kaputaros

2019/10/16 00:09

読み取る他のファイルのデータがどのようなものか、も提示したほうがいい回答が得られるかと思います~
guest

回答4

0

セル結合することが目的でないのであれば、条件付き書式で「セルの値が"" なら上罫線を消す」というのはどうでしょう。
ループが無いので処理速度は速いです。

条件付き書式の設定方法の説明がむつかしいので、VBAで設定するコードを以下に記載します。

VBA

1 Dim maxRow As Integer 2 With Worksheets("2019年10月") 3 4 ' B列を対象に最終行を求める 5 maxRow = .Cells(.Rows.Count, 2).End(xlUp).Row 6 7 'A4~AXXの範囲で、セルの値が入っていないセルは、上罫線なしにする。 8 With .Range("A4:A" & maxRow) 9 .FormatConditions.Add Type:=xlExpression, Formula1:="=$A4=""""" 10 Dim idx 11 idx = .FormatConditions.Count 12 .FormatConditions(idx).SetFirstPriority 13 .FormatConditions(idx).Borders(xlTop).LineStyle = xlNone 14 .FormatConditions(idx).StopIfTrue = False 15 End With 16 End With

投稿2019/10/15 08:43

Y.H.

総合スコア7918

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

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

Jonny_dayo

2019/10/15 10:01

回答ありがとうございます!! こんな方法もあるんですねっ!勉強になります。。 ただ今回はセルの結合を目的としているため、別の機会でこの方法も試してみようと思います!
guest

0

表の1列目の空白部分を、その1行上から含めて結合したい。
ということですよね?

その作業の流れをVBA語にしたら、こんな感じになると思います。

ExcelVBA

1Sub test() 2 Dim rngTable As Range 3 Dim a As Range 4 5 '表の範囲の取得 6 With Workbooks(1).Worksheets(1).Range("A1").CurrentRegion 7 Set rngTable = Intersect(.Cells, .Offset(2)) 8 End With 9 '表の1列目の空白セルの塊を順次みていく 10 For Each a In rngTable.Columns(1).SpecialCells(xlCellTypeBlanks).Areas 11 '1行上のセル範囲を含めて結合 12 Application.Range(a, a.Offset(-1)).Merge 13 Next 14End Sub

ブック名、シート名はそちらの環境に合わせて変更ください。

提示のコード、
セル範囲を変数に入れると、コードがすっきりすると思います。

投稿2019/10/15 08:36

mattuwan

総合スコア2163

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

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

Jonny_dayo

2019/10/15 12:03

回答ありがとうございます! 環境に合わせて入れてみたところ、「アプリケーション定義、またはオブジェクト定義のエラーです」と出てしまいました。。つまりこれは環境に合わせ切れていないということでしょうか…?
guest

0

ベストアンサー

他のファイルからデータを貼り付ける際にレコード数をカウントして、
最後にカウントした数を考慮してmargeすればいいのでは?
というのも、
列は要素が固定ですが、行は可変なので、
列で考えるより、行で考えたほうがいいかと思います。
(Rangeの指定も定数固定になっているので、もう少し汎用的にできるといいかも。。。)

【VBA入門】Rangeでセルの範囲指定(Cellsとの使い分けも解説)


Rangeはコピー先の指定が定数固定になってるってことでしょうか?奥が深い…

~.Range("AA9:AA14")
など、
"AA9:AA14"
と定数で指定しているので、固定になりますよね。
ここに必ず欲しいデータがあって、そこだけしか要らない場合には有効ですが、そうでない場合は、
"AA"&[変数1]&":AA"&&[変数2](変数のところは適宜変えてください)
にして変数のところが可変にすれば、データが少なくても多くても対応できますよね。
他にもいろいろやり方はあると思います。

あと、どのようなデータが入っているのかわかり得ませんが、
ファイルの読み込みは一度にしてしまったほうがいいですよ。
外部データのIOは時間や負荷がかかりやすし、
全てのデータを読み込んでしまってからまとめて処理したほうが、効率がいいことが多いです。
(仕様によってはそうできないものもありますが)

箇条書きでもいいので、どんな処理フローにしたいか、まとめてからコーディングするといいですよ。

投稿2019/10/15 08:31

編集2019/10/16 00:30
kaputaros

総合スコア1844

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

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

Jonny_dayo

2019/10/15 13:01

回答ありがとうございます! 一番汎用性が効きそうな方法ですね!調べてみたところ、DAOやらDcount関数など出てきました。 これで指定した列のデータをカウントしてマージする感じですかね…?(難しそう…) Rangeはコピー先の指定が定数固定になってるってことでしょうか?奥が深い…
kaputaros

2019/10/16 00:30 編集

いやいや、DAOはデータベースを扱うときにはつかうだろうけど、 ワークシート上での作業だったら別に使わなくてもいいかと思いますよ。 (勉強のためにつかって色々してみてもいいとは思うけど、目先の問題を解決してからで遅くないかと、、。) 回答に追記しました。
Jonny_dayo

2019/10/16 01:45

追記及び諸々ご丁寧にありがとうございます! 今回は必ずほしいデータのセルが決まっているのでこのままにさせていただこうと思いますが、たくさん他のやり方を教えて頂けたので次回以降色々試してみようと思います!!! 読み取る先のデータ画像も追記させて頂きました! 今回はファイルを複数選択する ↓ コピー先へ転記する ↓ A列のセル結合などレイアウトを整える ↓ 2枚目のファイルを処理する というループ処理をさせています。 (私の中では…もしなってなかったらすみません)
guest

0

A列の切り替わり、もしくはB列の最終行でA列を結合するサンプルです。
お試しください。

VBA

1Dim sh As Worksheet 2Dim sr As Long 3Dim er As Long 4 5Set sh = Worksheets("2019年10月") 6sr = 2 7er = 2 8Do 9 If ((sh.Cells(er, 1).Value <> "" And sh.Cells(er, 2) <> "") Or (sh.Cells(er, 2) = "")) And er <> 2 Then 10 sh.Range(sh.Cells(sr, 1), sh.Cells(er - 1, 1)).Merge 11 If sh.Cells(er, 2) = "" Then Exit Do 12 sr = er 13 End If 14 er = er + 1 15Loop

投稿2019/10/15 06:56

ttyp03

総合スコア17000

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

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

Jonny_dayo

2019/10/15 10:09

回答ありがとうございます! 早速試してみたのですが、マージされず…(なぜでしょうか…) Worksheets("2019年10月")部分をそのままにしてみたり、Workbooks("管理表VBA").Worksheets("2019年10月")にしてみたりとしたのですが、、 B列の最終行でA列を結合できたら最高なんですけど…
ttyp03

2019/10/15 10:20

しまった。データは3行目からでしたね。 最初のsrとerの値を3にしてみてください。
Jonny_dayo

2019/10/15 11:57

ご丁寧にありがとうございます! データは4行目からなので、4にして実行してみたところ結合はされたのですが、後からデータを追加していっても既に結合されたセルがどんどん大きくなっていってしまいます。。
ttyp03

2019/10/15 14:43

いやぁ、そんな仕様聞いてないっすわ。 しかも表のフォーマット変わってないすか? あとはご自分で修正よろしく!
Jonny_dayo

2019/10/15 14:46

ですよねー、、すみません! お忙しいところありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問