tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^2: シートのActiveXコントロールの内容が表示されない。
投稿日: 2020/05/16(Sat) 21:18
投稿者悩めるEXCELマクロ士
魔界の仮面弁士 さま

お世話になります。返信が遅くなってしまって申し訳ありませんでした。

> Active …?
> Activate ではなく?
『Activate』の間違いでした。

> 時間の問題ではなく、ビジー状態か否かという点だと思います。
なるほど、やはりそうですよね。何度か手直しをしているうちに
なんとなくそうではないかと思っていました。

とりあえず、当方の環境を説明していなかったので書きます。
OS  :Windows10
Office:Office365 32ビット版
です。
EXCELとしては、シートの数は設定シートなどを含めて20シートほど
そのうち、メニュー画面として使っているシートグラフを表示するシート
スクリーンショットで撮影した画像を貼り付ける為のシートがあります。
メニューシートには、ActiveXのCommandボタンを配置してあるだけで
クリックするとユーザーフォームが起動して日付とコードを入力。
作成ボタンを押すとグラフ作成と画像貼り付けを行うプログラムが走る
というような流れです。
で、結論からいうとお教えいただいた方法をベースに試作したところ
なんとか表示さるようになりました。
ですが、新たな問題として連続して同じ処理を実行するとEXCELがフリーズ
してしまうという現象が出るようになってしまいました。
試作したプログラムを記述すると

Sub Graph_CopyPast()

  Dim w        As Double
  Di tmpCNTNM  As Variant

  Application.ScreenUpdating =True
  
  With Worksheets(グラフシート名)
     For Each tmpCNTNM In .OLEObjects
         DoEvents
         Select Case True
             Case Instr(tmpCNTNM.Name,"lbl") >= 1 Or _
                               Instr(tmpCNTNM.Name,"cmb") >= 1
               w=tmpCNTNM.Width
               tmpCNTNM.Width=w+10
               tmpCNTNM.Width=w
         End Select
     Next tmpCNTNM
     .Range("A1:R37").CopyPicture Appeaance:=xlScreen,Format:=xlPicture
     Worksheets(画像貼り付け先シート名).Past Worksheets(画像貼り付け先シート名).Cells(5,9)
     Application.CutCopyMode=False
  End With
  
  Application.ScreenUpdating = False

というプログラムです。
解説すると、
最初に『Application.ScreenUpdating =True』しているのは、
実行ボタンが押されたときに画像描画を止めるため、『False』に
しているためです。
何度かやってみたんですが、これをTrueにしないと空白の枠だけが
ペーストされるだけになってしまうので、これを入れています。
本当は画像更新しているところ見せたくないので『True』に
したくないのですが。
次に、『For Each』ですがグラフ作成シートには
グラフデータから最大値や最小値、平均や中間値などを計算した
結果を出力するためActiveXのコントロールが『26』個程あるので
それをループで回して、名前の接頭語で判断して区別しています。
で、あとは教わった方法で強制的に再描画をさせています。
とりあえず、この方法でEXCEL起動後最初の1回目は問題なく
動作するんですがその後連続で同じ処理を実行すると、
『Past』のところで
『RangeクラスのCopyPictureメソッドが失敗しました』や
『処理を続行するにはメモリが不足しています。』
などのエラーが出るか、そのままEXCELがフリーズして処理が
止まります。
一応、1回目は処理が完了するのでいいといえばいいのですが
やはり、やり直しなどが発生した場合にいちいちEXCELを
再起動させていたのではシステムとして使いづらいと思うので
何とか安定して2度、3度と処理ができるようにしたいと
思っています。
何か、良い方法はないでしょうか。
乱文、長文になってしまって申し訳ありませんが
よろしくお願いします。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。