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

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

詳細はこちら
VBA

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

Q&A

解決済

2回答

1257閲覧

VBAの実行時エラーについて

nen

総合スコア1

VBA

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

0グッド

0クリップ

投稿2020/12/07 02:23

編集2020/12/07 02:49

前提・実現したいこと

VBA初学者です。
繰り返し処理で、以下のことを実現したいです。
① グループ化されている列を全表示にする。
② 3行目の最終列から数えて、任意の列(下記コードでは最終列から左へ39列目)から、左へ3列を列選択する。
② ②の3列を追加でグループ化し、グループ化した箇所を非表示にする。
③ ①、②の処理を各シートで繰り返す。
※新規でグループ化した列は、既にグループ化されている列と結合させたいです。

発生している問題・エラーメッセージ

実行時エラー1004
「アプリケーション定義またはオブジェクト定義のエラーです」

1シート目は狙い通りの処理が実行されるのですが、
2シート目以降を処理する際、上記エラーにより処理が止まってしまうみたいです。

該当のソースコード

Sub

1 Dim ii As Long 2 Dim sh1 As Worksheet, sh11 As Worksheet 3 Dim GroupLastColumn As Integer 4 5 For ii = 4 To Worksheets.Count 6 Set sh11 = Worksheets(ii) 7 sh11.Cells.EntireColumn.Hidden = False 8 GroupLastColumn = sh11.Range("C3").End(xlToRight).Offset(0, -39).Column 9 With sh11 10 .Range(.Columns(GroupLastColumn), .Columns(GroupLastColumn - 2)).Select 11 End With 12 Selection.Columns.Group 13 sh11.Outline.ShowLevels ColumnLevels:=1 14 15 Next 16 17End sub 18

補足情報(FW/ツールのバージョンなど)

この処理の前にFor Next文、変数を使って各シートの特定の位置にある情報をコピーペーストしているのですが、こちらはちゃんと動きました。
念のため上記処理と変数は分けています。

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

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

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

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

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

meg_

2020/12/07 02:42 編集

・コードは「コードの挿入」で記入してください。 ・゛シートのグループ化を解除し、゛と゛既にグループ化されている列゛が矛盾しているかと思うのですが違いますか? ・エラーはどこで発生していますか?
sazi

2020/12/07 02:53

Worksheetsが4から始まってますが、全体で何シートあるんですか?
nen

2020/12/07 02:57

meg_様 ご指摘ありがとうございます。そして失礼いたしました。 コードの挿入と、「グループ化を解除し」→「グループ化されている列を全表示にする」に変更いたしました。 エラーは一回目の処理が終わり、Nextで処理しようとするときに発生しています。「For ii = 4 To Worksheets.Count」の後にmsgboxを設けて変数の格納状態を確認しようとしましたが、5と表示されずに上記エラーが出て処理が止まってしまいます。
nen

2020/12/07 02:59

sazi様 変更したいシートは全てで5シートです。 動作確認のためのサンプル用なので、本運用する際には3桁くらいに増えます。
hatena19

2020/12/07 03:21

「アプリケーション定義またはオブジェクト定義のエラーです」が出たときに、エラーダイアログのデバッグボタンをクリックするとどのコードが反転表示されますか。
sazi

2020/12/07 03:26

>エラーは一回目の処理が終わり、Nextで処理しようとするときに発生しています。 結果だけをみるとWorksheets.Countの値によるものと思われますので、Worksheets.Countをforの前で確認して下さい。
nen

2020/12/07 04:16

hatena19様 どのコードも反転表示されないので、ステップインで一行ずつ実行していったところ、「.Range(.Columns(GroupLastColumn), .Columns(GroupLastColumn - 2)).Select」の処理を行う手前までは動くみたいでした。 また、ステップインで各シートの処理を行ったところ、処理するシートをアクティブにした状態だと処理が狙い通り実行されるみたいです。別のシートから処理を行おうとするとエラーで止まるようです。
nen

2020/12/07 04:18

sazi様 ご回答ありがとうございます。 Worksheets.Countをmsgboxで確認したところ、9と表示されました。 4シート目から5シート作業したいので、この数値で問題はなさそうです。
Usirow

2020/12/07 04:27

Activeではないシート内のセルをSelectしようとするとエラーになります。 そこでエラーが出ているのなら、原因の一つはこれでしょう。 加えて、Range内のColumnsの指定が0以下になっている可能性も考えられますが、そちらは大丈夫でしょうか?
guest

回答2

0

ベストアンサー

Usirowさんの回答通りだと思われます。
問題を回避するには、

  • シートをアクティブにする
  • Selectを使わない

のいずれかになるかと思います。
処理速度の観点で言えば後者と思いますので、以下のように修正してみてください。

この4行を、

VBA

1With sh11 2 .Range(.Columns(GroupLastColumn), .Columns(GroupLastColumn - 2)).Select 3End With 4Selection.Columns.Group 5

こうする。

VBA

1With sh11 2 .Range(.Columns(GroupLastColumn), .Columns(GroupLastColumn - 2)).Columns.Group 3End With

投稿2020/12/07 04:39

ttyp03

総合スコア17000

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

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

nen

2020/12/07 04:57

うわああできました!!! ありがとうございます!!! セレクトをなるべく使わずに作ることの大切さを実感しました… Usirow様、ttyp03様、ご指摘ご回答頂いた皆様、貴重なお時間を頂きまして誠にありがとうございました。
guest

0

vba

1 GroupLastColumn = sh11.Range("C3").End(xlToRight).Offset(0, -39).Column 2 With sh11 3 .Range(.Columns(GroupLastColumn), .Columns(GroupLastColumn - 2)).Select 4 End With

3行目は42列目まではデータが入っていて空白セル無しという前提のコードですが、
42列目までに空白セルがないというのは確認済みですか。

投稿2020/12/07 03:41

hatena19

総合スコア34073

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

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

nen

2020/12/07 04:27

hatena19様 ご回答頂きありがとうございます。 セルC3から最終列までの間に空白セルはございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問