[[20230615202814]] 『Win11上でマクロを動かすと「オーバーフローしまax(TAKA) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Win11上でマクロを動かすと「オーバーフローしました」と出る』(TAKA)

windows10 Excel2019で作成したファイルにスケッチした下記のプログラムが、windows11 Excel2021上で動作しない。

以下プログラム
__________________________________
名簿転記:

    sw名簿行数 = [CSW名簿行数]
    Dim iシート As Long

    For iシート = 3 To 9
        Set sht = Worksheets(iシート)
        sht.Activate
        ActiveSheet.Unprotect Password:="Jun-Y"
        Range("B25").Select
        Selection.Resize(sw名簿行数, 1).Select
        Selection.ClearContents
        [CSW名簿].Copy
        Range("B25").Select
        Selection.Resize(sw名簿行数, 1).Select
        Selection.PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
        [C学籍番号].Copy
        Range("A25").Select
        Selection.Resize(sw名簿行数, 1).Select
        Selection.PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
    Next iシート

    Worksheets("集計表").Activate

_________________________________

このマクロを動かすと「オーバーフローしました」と出てしまう。型はLong型で記述しているため3〜9の数字に対しては十分扱えるはずなので、原因がわかりません。
お手数ですが解る方ご教授ください。
よろしくお願いします。

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


 どの行でエラーになるんですか?
(xyz) 2023/06/15(木) 20:40:40

>(xyz)さん

Dim iシート As Long

です。
(TAKA) 2023/06/15(木) 20:42:30


>(xyz)さん
訂正します
Set sht = Worksheets(iシート)
です。
(TAKA) 2023/06/15(木) 20:45:39

iシートは いくつですか?
実在のシート数以上のものを指定するとまずいですが、
その時はオーバーフローではなく別のエラーメッセージになるはずです。
ちょっとわかりませんね。その情報だけですと。

そもそもコードのなかで型を宣言していない変数がいくつもあるのですが、何故ですか?

すべての変数をきちんと型をつけて宣言して、
Sub xxxx()
から
End Sub
までを全て示されると、皆さんからコメントが寄せられるかもしれません。
(xyz) 2023/06/15(木) 22:40:02


>(xyz)さん回答ありがとうございます。
全てを表記するとこうなります。
変数すべてに型を付けたほうが良いのでしょうか?
その辺もよくわかっていませんので、ご教授ください。
ちなみにシート数は11です。
________________________________________
Sub 名簿転記()

    Dim sht As Worksheet

名簿転記:

    sw名簿行数 = [CSW名簿行数]
    Dim iシート As Long

    For iシート = 3 To 9
        Set sht = Worksheets(iシート)
        sht.Activate
        ActiveSheet.Unprotect Password:="Jun-Y"
        Range("B25").Select
        Selection.Resize(sw名簿行数, 1).Select
        Selection.ClearContents
        [CSW名簿].Copy
        Range("B25").Select
        Selection.Resize(sw名簿行数, 1).Select
        Selection.PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
        [C学籍番号].Copy
        Range("A25").Select
        Selection.Resize(sw名簿行数, 1).Select
        Selection.PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
    Next iシート

    Worksheets("集計表").Activate
    ActiveSheet.Protect Password:="Jun-Y", Contents:=True
    Worksheets("結果").Activate
    ActiveSheet.Protect Password:="Jun-Y", Contents:=True
    Worksheets(1).Activate

End Sub

__________________________________________
(TAKA) 2023/06/15(木) 22:59:11


>(xyz)さん 追記します。

変数はそれ以外に3つあるのですが、頻繁に使っているため、VBA全体のトップに型をつけています。

Dim sw学年 As Byte
Dim swクラス数 As Byte
Dim sw名簿行数 As Integer

以上です。
(TAKA) 2023/06/15(木) 23:02:06


 オーバーフローの原因は私にはわかりません。
 Excelブックを扱っているだけなので、基本的にOSの変更は影響ないはずです。
 ステップ実行して、セル範囲から取り込んだものが何か異常値になっていないか確認してください。
 また、ブックの内容を新しいブックに移して、様子を見てみたらどうでしょう。(ブックが物理的に壊れている懸念)
 (・ブック間の単純なコピーペイストより、いったんCSVなどを経由したほうがよいと思います。
   ・コードもテキストエディターなどを経由させたほうがよいでしょう。)

 質問とは直接関係ないですが、気が付いたことをメモしておきます。参考にしてください。
 1.変数は必ず宣言して下さい。
   http://officetanaka.net/excel/vba/beginner/06.htm
   を参照してください。
 2.変数の型について
   Byteとかは理論上はメモリーを節約できるかもしれませんが、
   潤沢に資源がある昨今の環境では余り推奨されません。
   むしろ、オーバーフローしないだろうかなどと気を使うことが既にロスです。
   整数はすべてLongという方針の人も多いですし、速度的にはそのほうが有効らしいです。

 3.シートやセルを逐一Selectするのは余り好ましくないです。可読性も低いです。
   例えば、こんな風に書いたほうが見やすくないですか。

 Sub test()
     Dim sht As Worksheet
     Dim sw名簿行数 As Long
     Dim k   As Long

     sw名簿行数 = [CSW名簿行数]
     For k = 3 To 9
         Set sht = Worksheets(k)
         With sht
             .Unprotect Password:="Jun-Y"
             .Range("B25").Resize(sw名簿行数, 1).ClearContents

             [CSW名簿].Copy
             .Range("B25").Resize(sw名簿行数, 1).PasteSpecial Paste:=xlPasteValues

             [C学籍番号].Copy
             .Range("A25").Resize(sw名簿行数, 1).PasteSpecial Paste:=xlPasteValues
             .Protect Password:="Jun-Y" 'これが必要では?
         End With
     Next k
     'Worksheets("集計表").Activate
 End Sub  
 私からは以上です。他の回答を待ってください。
(xyz) 2023/06/16(金) 07:30:04

>(xyz)さん回答ありがとうございます。

(・ブック間の単純なコピーペイストより、いったんCSVなどを経由したほうがよいと思います。

   ・コードもテキストエディターなどを経由させたほうがよいでしょう。)

私は素人なので、上記内容がどういうことなのかわかりません・・・
とりあえずご教授頂いた通り、整理して直したもので試してみます。
(TAKA) 2023/06/16(金) 23:48:46


 それは、単純にコピーペイストすると、誤作動の原因そのものがコピーされてしまう可能性があります。
 その回避方法の一つと思ったまでです。
 (可能であれば、一から再作成するのがベストです。)

 意図した操作は単純なコピーペイストや、セル範囲の消去や、
 シートの保護設定・解除などですから、一般的操作と考えられます。
 ですから、想定しえないバグを踏んでいるか、
 もしくはブックが壊れかけている可能性があるのではと愚考します。
 (何らかの説明いただいていないことが原因の可能性もあるかも。)

(xyz) 2023/06/17(土) 13:11:52


コメント返信:

[ 一覧(最新更新順) ]


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