[[20250619115149]] 『結合セルがないのにエラーでマクロがとまる』(shishi) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『結合セルがないのにエラーでマクロがとまる』(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 >


1.マクロが動かないといわれているBookの
  一番左にあるワークシート「ActiveWorkbook.Worksheets(1)」の
  A2〜AM6行目までで、結合セルは一つもありませんか?

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


xyzさま

ご指摘ありがとうございます!

マクロの記録で作ったので、
お見苦しいコードでお恥ずかしい限りです…
表示されてるシートを対象にできたら、
今回のような間違いが起きなかったですよね。

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


もこな2さま

なるほど!
修正案を見比べて、
Withでまとめてあるところの違いがわかりました!
お時間割いていただき恐縮です。
解説ありがとうございました。

xyzさま

もこな2さまのコードを見させていただいて、
ご指摘の意味がわかりました!
ご親切に教えていただいたのに、
見当違いの返信失礼致しました。
今後は綺麗なコードを書けるように研鑽いたします。

皆様お力添えいただきありがとうございました。
(shishi) 2025/06/20(金) 10:28:57


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.