[[20150704175849]] 『大きな範囲を値貼り付けすると残像(?)が表示さ』(てつ) ページの最後に飛ぶ

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

 

『大きな範囲を値貼り付けすると残像(?)が表示される』(てつ)

 マクロで、あるブックから別の同じ名前のシートに大きな範囲を
 値貼り付けをしたところ 一部のセルに残像(?)が見られました。
 残像は、別のセルにあった文字列です。
 Workbooks(ファイル名).Worksheets(シート名).Activate
   Set WWR1 = Range(Cells(3, 10), Cells(最終行, 85))
   Set WWR2 = Workbooks(ブック名).Worksheets(シート名).Cells(3, 10)
   WWR1.Copy
   WWR2.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
     :=False, Transpose:=False    'データをすべて値貼り付け

 残像(?)は、プレビューして戻ると消えます。
 また、改ページプレビューして 標準に戻ると消えます。
 しかし、これらを記録したマクロを組み込んでも、
 残像(?)は残ったままです。
 もちろん、いったん閉じて、再び開くと消えています。
 どのようなマクロを組み込めば、残像(?)の表示をなくすことができるでしょうか?
 よろしくお願いします。
 なお、プロセッサは i5 で8ギガのメモリです。

< 使用 Excel:Excel2010、使用 OS:Windows8 >


 こちらのxl2010で試しましたが、特に「残像」というものは見えませんが?
 こちらでは10000行ぐらいで試しました。

 そちらの実行では、どのシートのどこに残像が残るのですか?

(β) 2015/07/04(土) 18:33


 単に画面の再描画が追い付いてないだけでは?
 一旦ウィンドウを最小化して再び表示させたらリフレッシュ
 されてませんか?
(カリーニン) 2015/07/04(土) 18:59

 K列の一部がCB列に表示されています。
 手動でウィンドウを最小化して再び表示させたら
 残像が消えます。
 Application.WindowState = xlMinimized
 Application.WindowState = xlMaximized
 をマクロの中に挿入しても残像は残っています。
 どのようなマクロを入れればよいでしょうか
 (てつ)


 プロシジャの先頭に Application.ScreenUpdating = False を記述してみると、どうなりますか?

(β) 2015/07/04(土) 20:55


 先頭に Application.ScreenUpdating = False を記述しても 残像は同じです。
 一つ訂正です。
  K列の一部がCB列に表示されています。(誤り)
 CC列の一部がCB列に表示されています。(正しい)
 画面を再描画させるマクロが入れば、うまくいきそうなのですが...
 (てつ)

 CC列をクリックすると、縮小化されていた文字が大きく出てきました。
 その一部がCB列に残っていたことが分かりました。
 どうすれば、マクロで表示させなくできるでしょうか?
 (てつ)

 >>画面を再描画させるマクロが入れば、うまくいきそうなのですが...

 じゃぁ、下手な鉄砲数打ちゃあたるで、

 Application.ScreenUpdating = True をいれるとか。

 再描画が原因ならば という前提ですが。
 こちらでは、そういったことが、そもそも発生していないので。
 別に原因があるのかもですよ。

(β) 2015/07/04(土) 22:13


 Application.ScreenUpdating = True をいれてみたのですが...
 同じです。
 (てつ)


 わかりませんねぇ・・・(繰り返しますが、こちらでは、そういった現象がでていないので)

 ・あえて、転記元か転記先かわからないのですが、残像の出るブックではないほうのブックをアクティブブックにして処理。
 ・あるいはコピペではなく、配列に転記元領域をいれ、そこから転記先に落とし込む。

 こうされてはいかがですか?

(β) 2015/07/04(土) 22:38


 ・アクティブブックを変えてみましたが、同じです。
 ・配列のやり方が分かりません。調べてみます。
 なお、CC列がセルの幅に比べて文字列が長くて、隣のCBセルが空欄になっている時、
 CBセルに残像が残るようです。
 (てつ)

 >>配列のやり方が分かりません。調べてみます。

 こんな感じです。

 Sub Sample()
    Dim v As Variant
    Dim shF As Worksheet
    Set shF = Workbooks("転記元ブック名.xlsx").Sheets("転記元シート名")
    v = shF.Range("J3", shF.Cells(最終行, "CG")).Value
    Workbooks("転記先ブック名.xlsx").Sheets("転記先シート名").Range("J3").Resize(UBound(v, 1), UBound(v, 2)).Value = v
 End Sub

(β) 2015/07/04(土) 23:14


 配列の Sample ありがとうございます。
 やってみましたが、やはり残像の残る部分があります。

(てつ) 2015/07/05(日) 09:14


 Application.WindowState = xlMinimized
 doevents:doevents
 Application.WindowState = xlMaximized
 doevents:doevents

 なんて入れてみるとどうでしょうか?

 ハード(ヴィデオカードやデバイスドライバ)の故障(又は、Vramメモリ不足)も疑ってみては?

(ichinose) 2015/07/05(日) 10:02


入れてみてもかわりません。
ハードが故障しているのかもしれません。
しばらく様子を見てみます。
ありがとうございました。
(てつ) 2015/07/05(日) 19:55

 >手動でウィンドウを最小化して再び表示させたら
 >残像が消えます。

 これが本当だとしたら、考えられるのは、

 標準モジュールに

 Sub Test()
 '  残像がある処理
    Application.WindowState = xlMinimized
    Application.OnTime Now() + TimeValue("00:00:01"), "app_max"
 End Sub
 Sub app_max()
    Application.WindowState = xlMaximized
 End Sub

 こんなところでしょうか

(ichinose) 2015/07/05(日) 20:27


 Testを組み込んでみました。
 app_maxが動作しないで、最小化されたままで、
 デスクトップからエクセルがなくなりました。
 タスクバーのエクセルをクリックすると出てきましたが、
 残像は残っていました。

 やはり、これはハードの故障ということでしょうか。

(てつ) 2015/07/05(日) 21:16


 >app_maxが動作しないで、最小化されたまま
 貼付けが何かOntimeの邪魔をしているのでしょうかねえ!!

 手動でウィンドウを最小化して再び表示させる代わりに

 Sub app_min()
    Application.WindowState = xlMinimized
    Application.OnTime Now() + TimeValue("00:00:01"), "app_max"
 End Sub
 Sub app_max()
    Application.WindowState = xlMaximized
 End Sub

 上記のapp_minを実行させると 残像現象がなくなりますか?

 これも駄目なら、私の方法では駄目ですね!!

 ハードの問題は確かに疑うべきですが、 手動操作でできるなら、VBAでも可能ではないか

 と思い、色々と思いついたことを試行していただいています。

(ichinose) 2015/07/06(月) 08:54


書き出したファイルに対して
app_minマクロを実行すると、
残像が消えました。
しかし、書き出すマクロの中に
Call app_min
で呼び出した場合は、
残像は残ったままになっています。
どうしてなのでしょうか??

(てつ) 2015/07/06(月) 17:57


 では、2例ほど・・・。

 例1

 Sub Test()
 '  残像がある処理
    doevents:doevents
    Application.OnTime Now() + TimeValue("00:00:01"), "app_min"
 End Sub
 Sub app_min()
    Application.WindowState = xlMinimized
    Application.OnTime Now() + TimeValue("00:00:01"), "app_max"
 End Sub
 Sub app_max()
    Application.WindowState = xlMaximized
 End Sub

 例2

 Option Explicit
 Private Declare Function SetTimer Lib "user32" _
  (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
 Private Declare Function KillTimer Lib "user32" _
  (ByVal hWnd As Long, ByVal uIDEvent As Long) As Long
 Private id As Long
 Private cnt As Long
 'コールバック処理
 Sub app_min_max(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
     If cnt Mod 2 = 0 Then
        Application.WindowState = xlMinimized
     Else
        Application.WindowState = xlMaximized
        KillTimer 0, idEvent
     End If
     cnt = cnt + 1
 End Sub
 Sub exec_min_max()
  cnt = 0
  id = SetTimer(0, 0, 10, AddressOf app_min_max)
  Debug.Print "id = " & id
 End Sub
 Sub kill_min_max() '終わらなかったら これを実行
    KillTimer 0, id
 End Sub

 Sub Test()
 '  残像がある処理
    doevents:doevents
    exec_min_max
 End Sub

 例1 例2 共に Testを実行

 これで駄目なら 撃沈です(こっちで試せないので)

(ichinose) 2015/07/07(火) 01:36


 ともに試してみましたが、
 うまくいきませんでした。
 とりあえず、手動で消すことができますので、
 それで間に合わせようと思います。
 色々とありがとうございました。
(てつ) 2015/07/07(火) 22:01

コメント返信:

[ 一覧(最新更新順) ]


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