10秒目をつむったら…

エクセル2007にて、for...next構文を含むマクロをフォームボタンに登録し使用していました。
カウンタ変数に3から25を代入しています。
(3行目から25行目を処理するため)

しかしエクセル2016にパソコンが変わり、ボタンを押すと3行目だけ処理しマクロが終わってしまいます。
ボタンを押す代わりに、VBEから直接実行すると問題なく最後まで繰り返し処理されます。

バージョンアップにより何か不都合があるのでしょうか。お教え下さい。

質問者からの補足コメント

  • Sub syuseki_zeisei()

    Dim i As Integer '入力表シートの行数

    Dim h As Integer 'データ集積シートの最終行

    Application.ScreenUpdating = False
    For i = 3 To 25 '入力表の入力可能行数

    h = Worksheets("集積_税制").Range("A65536").End(xlUp).Row + 1

      補足日時:2017/01/31 00:41
  • Select Case Range("C" & i).Value

    Case 1
    Range("G" & i, "I" & i).Copy
    Worksheets("集積_税制").Range("A" & h).PasteSpecial Paste:=xlPasteValues
    Range("J" & i).Copy
    Worksheets("集積_税制").Range("D" & h).PasteSpecial Paste:=xlPasteValues

      補足日時:2017/01/31 00:48
  • Case 2
    Range("G" & i, "I" & i).Copy
    Worksheets("集積_税制").Range("A" & h).PasteSpecial Paste:=xlPasteValues
    Range("J" & i).Copy
    Worksheets("集積_税制").Range("E" & h).PasteSpecial Paste:=xlPasteValues

      補足日時:2017/01/31 00:50
  • Case 3
    Range("G" & i, "I" & i).Copy
    Worksheets("集積_税制").Range("A" & h).PasteSpecial Paste:=xlPasteValues
    Range("J" & i).Copy
    Worksheets("集積_税制").Range("F" & h).PasteSpecial Paste:=xlPasteValues

      補足日時:2017/01/31 00:51
  • End Select

    Next i

    Application.CutCopyMode = False
    Application.ScreenUpdating = True

    Sheets("集積_税制").Select
    MsgBox "取り込みが終了しました!"
    Sheets("入力表_税制").Select
    Range("B1").Select
    End Sub

      補足日時:2017/01/31 00:52

A 回答 (5件)

#2の回答者です。


長文でまとまっていませんが、私の考えたレポートです。

こちらは、Excel 2013ですが、一応、通して動かしてみて完結はするのですが、途中、何か良くわからない動きがあります。このコードには、どちらかというと「気になる」の部分はあります。しかし、それ以上に、ハングしたかなって思わせるような状態で、マクロが終了しているのです。それが何か今のところは分かりません。
どうも、ステップで進める分には、まったくその問題はみられません。

そのコードで問題になる部分は、2つですが、結論からすると、直しても変わりませんでした。
> Dim h As Integer 'データ集積シートの最終行
これは、Integer ではなくて、Long 型のほうがよいです。
ついでに、Dim i As Long '入力表シートの行数 もLong型のほうがよいのは、PCの扱うデータは、32bit が主なので、Integer 型は、一旦、Long型に変換しているので、なるべく、Integer 型は使わないほうがよいとしています。

>h = Worksheets("集積_税制").Range("A65536").End(xlUp).Row + 1
これは、最初、ループの外で行って、書き込みが完了したら、
h = h+1

とします。ただ、それでも、問題はほとんど改善されませんでした。
ふつうは、マクロが抜けるという現象からしても、私の試した感じでは、どうやらメモリリークの現象に似ています。アンタッチャブルな部分に触れると、マクロは急停止してしまいます。

なお、Select Case  [値]  ←ここの値は、文字列でも数値でも構わないです。ただ、コードを見る限りは、数値になっているようですので、それ自体は問題なかろうと思います。

ボタンは、フォームオブジェクトのボタンをお使いになっているものだとは思いますが、ActiveX ですと、そのコードですと、少し問題が出る可能性はあります。

それで、私なりの書き方でコードを書いてみましたので、そちらで診ていただけませんか?

'// 基本的には、標準モジュールです。
Sub Integrated_Taxes()
 Dim i As Long '入力表シートの行数
 Dim h As Long 'データ集積シートの最終行
 Dim j As Long '新しく加えた変数
 Dim acSh As Worksheet '現在の表
 Dim iTaxSh As Worksheet
 '***設定****
 Set acSh = ActiveSheet 'このシートは「入力表_税制」か?
 Set iTaxSh = Worksheets("集積_税制")
 
 Application.ScreenUpdating = False
 h = iTaxSh.Cells(Rows.Count, 1).End(xlUp).Row + 1
 With acSh
  For i = 3 To 25 '入力表の入力可能行数
   If .Cells(i, 3).Value > 0 And .Cells(i, 3).Value < 4 Then
    j = .Cells(i, 3).Value + 3
    iTaxSh.Cells(h, 1).Resize(, 3).Value = .Cells(i, 7).Resize(, 3).Value
    iTaxSh.Cells(h, j).Value = .Cells(i, 10).Value
    h = h + 1
   End If
  Next i
 
 End With
 Application.ScreenUpdating = True
 
 iTaxSh.Select
 MsgBox "取り込みが終了しました!"
 Worksheets("入力表_税制").Select
 Range("B1").Select

End Sub
'//

以上です。
    • good
    • 0
この回答へのお礼

うまくいきました。ありがとうございます。やはりコードが私より全然スマートです。私もまだまだですね。結局どこが原因かは特定できないんですよね。。。
でもご教示のとおりのコードでうまくいったので何よりです。
(ちなみにボタンはフォームオブジェクトです。)

お礼日時:2017/02/07 21:42

エクセルのVBAエディタで、ツール ー オプションを開いて見てください。


そこのエラートラップを変更すると止まり方が変わるから、
ステップ実行できるかもしれません。
また、ソースコードの中にオンエラー文を入れて、
もしジャンプするならそこに stop 文と resume 文を入れてみてください。
健闘を祈ります。
    • good
    • 0
この回答へのお礼

ありがとうございます。まだ勉強不足でオンエラー文を理解していないためその辺りのコードを使いこなすのはもう少し先になりそうです。
本文にも記載したとおり、ステップ実行すると問題なく動きます。

お礼日時:2017/02/07 21:45

ステップ実行でcaseはちゃんと通ってます?


確認しました?

現状、caseでは数値ですが、セル値が文字列になってません?
これは想像ですが、2016だと型判定が厳密になってるのかもしれません。
case "1" だと上手くいくかもね。
    • good
    • 0
この回答へのお礼

ステップ実行は本文にも記載のとおり問題ありません。
半角英数字を使用しております。セルの書式は標準です。

お礼日時:2017/02/03 18:19

あくまでも、一般論で返事させていただきます。



>本文でも書いたように問題の箇所はありません。ステップ実行もして確認済みです。

ご自身が書いたコードは問題はないのだから、見せる必要などなく、Excel2016の問題ではないかという予想を裏付ける解答をお望みなのかもしれません。しかし、実際、ひとつのエラーや不具合が、ひとつの問題をあぶり出すような原則論は、VBAでは、それほど多くはありません。

経験的には、バージョンアップした後に、そのような問題が発生するのは、VBA自体の言語の甘さで書かれたコードが、今までの前のバージョンでコードを走らせていたのが、バージョンアップで、より厳密になってエラーを出すということがあります。ほとんどの人は、VBAは独学で、正しい書き方を知る人などはいません。他の言語から、Excel VBAなどを通して、動かそうとする時に、初めて、暗黙のプロパティなどが通用しないことを知るわけです。

残念ながら、今のままでのご質問の情報だけでは、直接の解答に繋がるものは見つかりません。

>カウンタ変数に3から25を代入しています。
3だけしか処理しなかったというのは、例えば、カウンターから、その都度、オブジェクト(OLEが多いようです)を呼び出す時に、そのような現象があります。オブジェクトを、ステップで実行する時は、維持できても、本番で実行すると、それを保てないままに、抜けてしまうというわけです。

これは、あくまでも私の想像の範囲の事象です。その解決方法は、コードを含めて全体の状態を公開していただくか、この私の話をヒントにご自身で探すか、どちらかだと思います。また、かなり望みは薄いのですが、VBEで、ツールーオプション-全般で、エラートラップやコンパイルの方法を変えてみるとか、それも、一つの選択としてあるかもしれません。
    • good
    • 2
この回答へのお礼

ありがとうございます。ボタンを押すとうまくいかないが、VBEで直接実行するとうまくいく。ボタンを削除してもう一回ボタンを作り直してからマクロ登録し直したが、やはりだめ。
という経過からボタンに原因があるのではと推測しました。調べるとOfficeのアップデートに原因がある記事もみかけました。

お礼日時:2017/01/31 00:59

ステップ実行して、問題の箇所を特定してください。


もしくはソース載せるか。
これだけじゃわかりません。
    • good
    • 0
この回答へのお礼

本文でも書いたように問題の箇所はありません。ステップ実行もして確認済みです。
本文でも書いたようにボタンを押すと繰り返し処理がされないのです。

お礼日時:2017/01/29 01:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!