none
Excel 2010(x64) VBAでセルの表示が途中から変わらなくなる、最後は正常に表示する。 RRS feed

  • 質問

  • Option Explicit
       Dim BUF
       Dim R_Row  As Long
       Dim i As Long
       Dim j As Long
       Dim MA As Single
      
    Sub セルの文字が表示しなくなる()
                   R_Row = 10000000
                   Range(Cells(1, 1), Cells(3, 2)).ClearContents
                  
    '①------Cells(1, 1)表示しない、最後は表示する。
                   BUF = Range(Cells(1, 1), Cells(1, 2))

                      For i = 1 To 10000000

                       BUF(1, 1) = i + 1
                         i = i + 1
                       Next
                   Range(Cells(1, 1), Cells(2, 2)) = BUF
                       Beep
    '②------Cells(1, 1)表示する
                      For i = 1 To 10000000
                         Cells(2, 1) = i + 1
                         i = i + 1
                       Next
                       Beep
    ③------Cells(1, 1)は途中から表示しなくなる、最後は表示する。
                      i = 1
                      Do While i <> R_Row
                         Cells(3, 1) = i + 1
                          i = i + 1
                       Loop
                       Beep               
    End Sub

    ①、は途中は表示しない。 Cells(1, 1) = BUF(1, 1)を追加すればたぶん表示するが遅くって、途中で表示が止まる。

    ②、 Cells(1, 2)は初めから最後まで表示する

    ③、Cells(1, 3)は途中から表示しなくなる、最後は表示する。

    ②、の方法で初めから最後まで表示させるには、どうしたら良いでしょうか

                                          






    2012年12月23日 11:30

回答

  • 何も悪くありません。

    Application.ScreenUpdating = False
    この状態のときには、現状の表示を維持するのではなく、画面更新(再描画)を行いません。
    (他のアプリケーションやタスクによる影響で)OSから画面更新を促されてもExcelは無視します。
    よって、のっぺらになったりゴミが残ったりは異常ではありません。
    • 回答としてマーク DavidMicro 2012年12月31日 1:32
    2012年12月24日 4:52

すべての返信

  • 自動計算の設定はどのようになっていますか? 通常、大量にセルに値をセットする場合は、自動計算を止めておくが良いと思います。 自動計算が影響しているのかもしれません。

    (参考)
    計算方法の自動/手動切替え・再計算
    http://xls.seesaa.net/article/20610973.html

    処理実行中の表現
    http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_090_040.html

    Excel VBAの再計算設定
    http://tsukinihinikeni.blogspot.jp/2011/02/excel-vba.html

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年12月23日 14:39
    モデレータ
  • trapemiya(MVP)さん、ありがっとうございます

    下記のように実行しましたが、①~③の表示速度は速くなりましたが、途中で表示が消えてしまいます。何が悪いでしょうか?

    Sub セルの文字が表示しなくなる()
                    R_Row = 10000000
                    Range(Cells(1, 1), Cells(2, 1)).ClearContents
                   BUF = Range(Cells(1, 1), Cells(2, 1))
                  Application.Calculation = xlCalculationManual  '手動
                  Application.ScreenUpdating = False
                      For i = 1 To 10000000
                   Application.StatusBar = "処理№(" & i & ")"
                       BUF(1, 1) = i
                          i = i + 1
                        Next
                 Application.CalculateBeforeSave = xlCalculationAutomatic '自動
                 Application.ScreenUpdating = True
                       Range(Cells(1, 1), Cells(2, 1)) = BUF
                        Beep
    Erase BUF
    End Sub

                                    
    2012年12月23日 16:38
  • 何も悪くありません。

    Application.ScreenUpdating = False
    この状態のときには、現状の表示を維持するのではなく、画面更新(再描画)を行いません。
    (他のアプリケーションやタスクによる影響で)OSから画面更新を促されてもExcelは無視します。
    よって、のっぺらになったりゴミが残ったりは異常ではありません。
    • 回答としてマーク DavidMicro 2012年12月31日 1:32
    2012年12月24日 4:52
  • hihijijiさん、ありがとうございます。

    (他のアプリケーションやタスクによる影響で)OSから画面更新を促されてもExcelは無視しないで、Excell画面の更新だけを判断出来るようになったら良いな。

    データ処理の進行を見る為に使用してましたが、突如カウントが止てしまい暴走したのではないかと思いEscキーを押しコードの実行中断と[継続]を繰り返していると、時々応答がなくなります。
    タスクマネージャーで実行を中断をすると、データ量が多いせいか立ち上がりがものすごく遅いので頭痛いです。
    Application.StatusBar = "№ "& i を試してみると、表示は早くなりますが途中っで止まったり消えたりします。

    trapemiyaさんが、紹介してくれたURLの中にプログレスバーがありました。いつか試してみたいと思っています。

    trapemiyaさん、hihijijiさんありがとうございます

    2012年12月24日 9:02
  • 処理の進行を見るだけですから、おおよそ解れば良いと思い下記のプログラムを作ってみました。
    参考になれば幸いです。

    Cd = i + 12345678でもっともらしく表現したつもりです、一番大きい桁で進行状態がおおよそ解ります。

                 12345678は処理速度により変更してください

    Option Explicit
        Dim i As Long
        Dim Cd As Long
       
    Sub セルの文字が表示しなくなる()
                    Range("a1").ClearContents
                     Disp
                     Cd = 1
                     
                       For i = 1 To 1000000000 - 1
                            If Cd = i Then
                                  Disp
                                  Cd = i + 12345678
                              End If
                           Next
                          
                      Disp
                      Beep
    End Sub


    Sub Disp()
             Application.StatusBar = "処理№(" & i & ")"
             Cells(1, 1) = i
    End Sub


    2012年12月31日 2:36