『結合セルがないのにエラーでマクロがとまる』(shishi)
|[A]|[B]|----[AM] [1]|39|38|----|1| ・ ・ ・ [6]
A1からAM1まで、39-1と逆に番号がふってあります。
(A2以降のセルを縦書きにしているため)
これを逆順に並び替えるマクロを使用しているのですが、
ファイルが壊れているのか、
結合セルがないのに
実行時エラー 1004
この操作を行うには、すべての結合セルを同じサイズにする必要があります。
と出ます。(結合セルを解除操作済)
新規ブックを作成し、内容をコピペするとマクロが使えます。
Range("A1:B1").Select Selection.AutoFill Destination:=Range("A1:AM1"), Type:=xlFillDefault Range("A1:AM1").Select Range("A1").Select ActiveWorkbook.Worksheets(1).Sort.SortFields.Clear ActiveWorkbook.Worksheets(1).Sort.SortFields.Add2 Key:=Range("A1:AM1") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets(1).Sort .SetRange Range("A1:AM6") .Header = xlGuess .MatchCase = False .Orientation = xlLeftToRight .SortMethod = xlPinYin .Apply End With
当該データでは、
.Apply で止まります。
新規ブックを作ってコピペするマクロを追加するしかありませんか?
何か他に考えられる原因がありますか?
< 使用 Excel:Excel2016、使用 OS:Windows11 >
2.ペースト時は「全て貼り付け」していますか?
(匿名) 2025/06/19(木) 12:26:32
1.
結合セルは一つもありません。
全てを選んで、セルの結合を解除をしてみましたが、
エラーは同じく出ました。
シートを保護にもしてません。
2.
形式から選択して貼り付け→すべて
にしてペーストしました。
新規ブックではマクロは動きました。
(shishi) 2025/06/19(木) 13:32:11
よく確認するともうひとつシートがあり、(1)ではありませんでした!
初歩的な間違い申し訳ありません…
無事マクロが動きました!
本当にありがとうございました!
(shishi) 2025/06/19(木) 13:38:56
解決したようでなによりです。 折角書きました(発言が衝突しました )ので、メモをしておきます。
(1) Rangeオブジェクトにシートを特定していないところが散見されます。 これらをきちんと指定するようにしたほうがよいと思います。 (例えば、 .SetRange Range("A1:AM6")などのところですね。)
Set ws1 = .... Set ws2 = .... とワークシート変数を定義して、それらを使ってシートを特定してください。
(2) また逐一Selectしないようなコードにしたほうがよいと思います。
(xyz) 2025/06/19(木) 13:46:31
ご指摘ありがとうございます!
マクロの記録で作ったので、
お見苦しいコードでお恥ずかしい限りです…
表示されてるシートを対象にできたら、
今回のような間違いが起きなかったですよね。
Set ws1 =
Set ws2 =
に続くコードはどんな感じにすればいいですか?
(shishi) 2025/06/19(木) 14:11:44
シートを特定するという意味は、 Range("A1") = 1 と書かずに、 ws1.Range("A1") = 1 と書くということです。
(xyz) 2025/06/19(木) 15:06:55
■1
VBAの世界では基本的にシートやセル(オブジェクトといいます)をきちんと明示すればいちいちアクティブにしたり選択したりする必要はありません。
また、【標準モジュール】でシートの指定を省略した場合、ActiveSheetが指定されたとみなされるルールです。
したがって、既に指摘されていることではありますが、可読性の向上や処理対象の明確化のためにも、対象のオブジェクトはきちんと指定することをお勧めします。
■2
>表示されてるシートを対象にできたら
ということは、アクティブシートを対象にすればよいことになります。
提案されている方法では変数を使ってますが、類似する考え方でWithステートメントを使う手もあります。
(個人的には、今回のケースでは1つのシートしか出てこないので、Withステートメントのほうがいいんじゃないかと思います)
■3
ということを踏まえると↓のような感じに修正してもよいと思います。
Sub 修正案1()
With ActiveSheet .Range("A1:B1").AutoFill Destination:=.Range("A1:AM1"), Type:=xlFillDefault
With .Sort .SortFields.Clear .SortFields.Add2 Key:=.Parent.Range("A1:AM1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange .Parent.Range("A1:AM6") .Header = xlGuess .MatchCase = False .Orientation = xlLeftToRight .SortMethod = xlPinYin .Apply End With End With End Sub ========================================= Sub 修正案2() With ActiveSheet .Range("A1:B1").AutoFill Destination:=.Range("A1:AM1"), Type:=xlFillDefault
.Sort.SortFields.Clear .Sort.SortFields.Add2 Key:=.Range("A1:AM1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.Sort.SetRange .Range("A1:AM6") .Sort.Header = xlGuess .Sort.MatchCase = False .Sort.Orientation = xlLeftToRight .Sort.SortMethod = xlPinYin .Sort.Apply End With End Sub
(もこな2 ) 2025/06/19(木) 21:15:07
なるほど!
修正案を見比べて、
Withでまとめてあるところの違いがわかりました!
お時間割いていただき恐縮です。
解説ありがとうございました。
xyzさま
もこな2さまのコードを見させていただいて、
ご指摘の意味がわかりました!
ご親切に教えていただいたのに、
見当違いの返信失礼致しました。
今後は綺麗なコードを書けるように研鑽いたします。
皆様お力添えいただきありがとうございました。
(shishi) 2025/06/20(金) 10:28:57
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.