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

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

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

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

Q&A

3回答

3764閲覧

E列の空白セルと空白セルから一つ上のセルを結合させるときにエラーが出てしまいます。

hana0118

総合スコア8

VBA

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

0グッド

0クリップ

投稿2020/09/29 06:04

E列の空白セルと空白セルから一つ上のセルを結合させる時にデバックが出てしまいます。
A列では同じ作業をさせてもデバックは出なかったので、どこがエラーになっているのかが分かりません。
変更しなければならない部分をご教授ください。宜しくお願い致します。

変更前イメージ説明
変更後イメージ説明

コード Sub E列の空白セルと空白セルから1つ上のセルを結合する() Columns("E").Select Dim mydata As Range, i As Long, j As Long Set mydata = Selection For j = 1 To mydata.Column For i = 1 To mydata.Cells(Rows.Count, 1).End(xlUp).Row If mydata(i, j) = "" Then Range(mydata(i - 1, j), mydata(i, j)).Merge End If Next i Next j End Sub

A列で作業させた時は、Columns("A").Selectと記載しており、以降の部分は変更なしでマクロを使っています。

ちなみに、デバックが出るのは、Range(mydata(i - 1, j), mydata(i, j)).Mergeの部分です。

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

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

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

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

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

kuma_kuma_

2020/09/29 06:09

> Range(mydata(i - 1, j), mydata(i, j)).Merge ここは > Range(mydata.cells(i - 1, j), mydata.cells(i, j)).Merge こうでは?
hana0118

2020/09/29 06:16

kuma_kuma_様 ご指摘ありがとうございます。教えて頂いたとおりに変更してみたのですが、アプリケーション定義またはオブジェクト定義のエラーということでデバックが出てしまいました。すみません????
meg_

2020/09/29 06:18

エラーが出たときのj、iの値はどうなっていますか?
kuma_kuma_

2020/09/29 06:25

いいえ、あやまらなくてもいいんですよ ちょっと質問者様の意図がどっちか判りませんが > mydata.Range(mydata.cells(i - 1, j), mydata.cells(i, j)).Merge か > Range(cells(i - 1, j), cells(i, j)).Merge どっちなんでしょうか? という点と エラーが発生した際、iの値が1じゃないですか?
hana0118

2020/09/29 06:26

meg_様 ありがとうございます。上の質問のコードにもあります通り、 For j = 1 To mydata.Column For i = 1 To mydata.Cells(Rows.Count, 1).End(xlUp).Row で指定しております。
hana0118

2020/09/29 06:46

kuma_kuma_様 お恥ずかしい話ですが、私、エクセルのことも良くわからないまま、会社から頼まれてVBAの作業をしており、いろいろな情報をネットで検索しながら必要と思われるマクロを組み立てていて、詳細な内容まで理解をしていない状況です。kuma_kuma_様のご質問の内容も何を質問されているのかが分からず、申し訳ありません。
kuma_kuma_

2020/09/29 06:51 編集

いえ、意図としては多分こちらなんでしょう > mydata.Range(mydata.cells(i - 1, j), mydata.cells(i, j)).Merge エラー発生個所をこちらに書き換えて下さい。 あと > For i = 1 To mydata.Cells(Rows.Count, 1).End(xlUp).Row を > For i = 2 To mydata.Cells(Rows.Count, 1).End(xlUp).Row に書き換えて試してください。
hana0118

2020/09/29 06:59

kuma_kuma_様 ありがとうございます。教えて頂いたとおりに変更してみましたが、残念ながら他の列が反応してしまい、E列のセルの結合にはなりませんでした。すみません。
meg_

2020/09/29 07:42

質問は「エラーが出たときのj、iの値はどうなっていますか?」です。数字を教えてください。
guest

回答3

0

一列選択ならこんなのでいけると思います。

VBA

1Sub E列の空白セルと空白セルから1つ上のセルを結合する() 2 3 Columns("E").Select 'E列を選択 4 5 Dim i As Long, j As Long 6 7 Dim mydataCol As Long 8 mydataCol = Selection.Column '選択列 9 Dim mydataRow As Long 10 mydataRow = Cells(Rows.Count, 4).End(xlUp).Row '最終行(作業時間D列の最終行を取得) 11 12 For i = 2 To mydataRow '2行目から開始(1行目からだと結合の際に0行目がないのでエラーになる) 13 If IsNull(Cells(i, mydataCol).Value) = True _ 14 Or Cells(i, mydataCol).Value = "" Then '検索しているセルに値が入っていない時 15 Range(Cells(i - 1, mydataCol), Cells(i, mydataCol)).Merge 'ひとつ上のセルと結合する 16 End If 17 Next i 18 19End Sub

投稿2020/09/30 01:30

radames1000

総合スコア1925

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

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

0

VBAのソースにコメント追加して修正してみました
したい事は、こういう事ではないのですか?

VBA

1Sub E列の空白セルと空白セルから1つ上のセルを結合する() 2 3 Columns("E").Select 'E列を選択 4 5 Dim mydata As Range, i As Long, j As Long 6 Set mydata = Selection '選択した範囲を取得 7 8 For j = 1 To mydata.Column '選択した範囲の列番号(1 = E列) 9 For i = 2 To mydata.Cells(Rows.Count, 1).End(xlUp).Row '選択した範囲の行番号(2行目から終わりまで) 10 If isNull(mydata.Cells(i, j).Value) = true _ 11 or mydata.Cells(i, j).Value = "" Then '検索しているセルに値が入っていない時 12 mydata.Range(mydata.Cells(i - 1, j), mydata.Cells(i, j)).Merge 'ひとつ上のセルと結合する 13 End If 14 Next i 15 Next j 16 17 '※ 行検索が2行目からなのは、1行目の上は無いから 18End Sub

投稿2020/09/29 07:03

編集2020/09/29 07:05
kuma_kuma_

総合スコア2506

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

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

0

A列では同じ作業をさせてもデバックは出なかったので

んと、、、、

1)

For j = 1 To mydata.Column '選択した範囲の列番号(1 = E列)

mydata.Column はE列だと5を返します。
A列は1なので意図した列数でしょうが、
1列目から5列目を繰り返すわけではないので、
意図したコードになってないです。
実際には、
mydata.columns.count
としたかったのでは?と想像します。
mydata.Columnは、変数mydataに入っているセル範囲の1列目の列番号を返します。
mydata.columns.countは、変数mydataに入っているセル範囲の列の数を返します。
単数形と複数形の違いに注意です。

2)

mydata.Cells(Rows.Count, 1).End(xlUp).Row

.End(xlUp)は、指定されたセルから上に見ていって最初にデータがあるセルを検索します。
A列は表の最後の行に「合計」等の文字が入っていると想像されますので、
「表の最後」を検索できますが、E列は空白なので、
そのコードでは、「表の最後の行」=「E列の最後のデータの行」になりません。
ただし、こちらの想像が違っていて、「表の最後の行」=「E列の最後のデータの行」になるならば、
ここは問題ありません。

3)

2で、最後のデータのセルを見た後(実際にはまだ結合したいセルが下にある)、
意図せず2列目(F列)の処理をしに行くわけですが、
A列からE列はタイトル行が入っているので、
If mydata(i, j) = "" Then
で条件に合わなくてスルーされますが、
F列は1行目が空白なので、
Range(mydata(i - 1, j), mydata(i, j)).Merge
を実行しようとするのですが、
i - 1 のところで、「1-1=0行目」という存在しないセルを指定することになるので、
エラーになります。

回避策としては、
「シートの使っているセル範囲の内、1行目を除いた、指定した列のセル範囲」を
求めることになりますが、
そもそも、列を指定する必要はなく、操作対象は、
「シートの使っている範囲の内の列毎に各空白の範囲をその範囲の1行上のセルと結合したい」
だと思います。
ならば、ジャンプ機能で得られる空白をループすればよいことになります。

ExcelVBA

1Sub test() 2 Dim Rng As Range 3 Dim c As Range 4 Dim a As Range 5 Dim b As Range 6 7 Set Rng = ActiveSheet.UsedRange 8 9 For Each c In Rng.Columns '列毎に繰り返し 10 Set a = Nothing '変数の初期化 11 On Error Resume Next 12 Set a = c.SpecialCells(xlCellTypeBlanks) '空白セルの検索 13 On Error GoTo 0 14 15 If a Is Nothing Then 16 For Each b In a.Areas '得られた飛び飛びのセル範囲毎の繰り返し 17 Application.Range(b, b.Cells(0, 1)).Merge '1個上のセルまで範囲を拡張し結合 18 Next 19 End If 20 Next 21End Sub

Application.Range(b, b.Cells(0, 1)).Merge

ここは、
b.offset(-1,0).resize(b.rows.count+1).merge
と書いても良いです。
他にもいろいろ表現の仕方は有るかもしれませんので、
いろいろ勉強して語彙を増やして、
色々な状況に対応してセル範囲を指定できるようになりましょう。

投稿2020/10/01 11:20

mattuwan

総合スコア2163

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問