Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
複数範囲セルの別シートへの連続コピーについて
投稿日時: 24/04/17 16:43:46
投稿者: AoAo

お世話になります。
早速ですが・・・
  
Worksheets("SheetA").Activate
Worksheets("SheetA").Range(Cells(i, 1), Cells(i, 20)).Copy Destination:=Worksheets("SheetB").Cells(j, 1)
  
上記記述をループ内でSheetAで指定した区分が一致した場合、その行(1レコード)をSheetBに
そのまま1レコード分を貼付という連続動作をさせておりました。
ところが今月に入り突然ポップアップで
タイトル「クリップボードエラー」
本文「別のアプリケーションで使用されている為、コンテンツをクリップボードに
コピーできませんでした。このブック内にコンテンツを張り付けることはできますが
他のアプリケーションでは使用できません」と
表示されるようになりました。処理自体は問題なく行われ、
終わるとポップアップ表示も消えます。(他のアプリは起動しておりません)
但しコピー先のSheetBが結果的に数十行程度で終了する場合はこのポップアップは
表示されないようです。クリップボードを毎回クリアしても同様の現象でした。
  
Win11の場合はアップデートによりこのような現象がおきているという情報は
みつけましたが私の条件では見つけれませんでした。
  
そこで対応策としてCopyを利用せず
複数セルをコピーする為に
  
Worksheets("SheetB").Range(Cells(j, 1), Cells(j, 20)).Value = Worksheets("SheetA").Range(Cells(i, 1), Cells(i, 20)).Value
  
と記述しましたがエラーが表示され止まってしまいます。
私のレベルだと逃げ道対策として
  
Worksheets("SheetB").Cells(j, 1) = Worksheets("SheetA").Cells(i, 1)
Worksheets("SheetB").Cells(j, 2) = Worksheets("SheetA").Cells(i, 2)
  -----------省略---------
Worksheets("SheetB").Cells(j, 20) = Worksheets("SheetA").Cells(i, 20)
  
と、20行記述。1セル毎にコピーさせてとりあえず正常に動いております。
スマートに記述する方法がありましたらアドバイスを頂ければ助かります。
よろしくお願いいたします。

回答
投稿日時: 24/04/17 17:14:52
投稿者: WinArrow

余計なコードがあるかもしれません。
ループの中のコードの全部を掲示できますか?

回答
投稿日時: 24/04/17 17:43:43
投稿者: simple

>Worksheets("SheetB").Range(Cells(j, 1), Cells(j, 20)).Value = Worksheets("SheetA").Range(Cells(i, 1), Cells(i, 20)).Value
これは結構FAQに属するのですが、
中にある Cells(j, 1)たちの頭にもシート指定が必要です。
 
シート指定をしないと、アクティブシートとみなされますから、
例えば、SheetAがアクティブだと

Worksheets("SheetB").Range(Worksheets("SheetA").Cells(j, 1), Worksheets("SheetA").Cells(j, 20)).Value = ・・・・
と書いたことになり、エラーになります。
 
例えば、
 With Worksheets("SheetB")
    .Range(.Cells(j, 1), .Cells(j, 20)).Value _
    = wsA.Range(wsA.Cells(i, 1), wsA.Cells(i, 20)).Value
 End With
などのように工夫するとよいでしょう。

回答
投稿日時: 24/04/17 17:49:58
投稿者: simple

 Worksheets("SheetB").Cells(j, 1).Resize(1,20).Value _
   = Worksheets("SheetA").Cells(i, 1).Resize(1,20).Value
などとする方法もあります。

回答
投稿日時: 24/04/17 18:07:46
投稿者: WinArrow

siimpleさん、お疲れ様です
 
ご懸念の件
私も引っ掛かりましたが、
直前にシートをActiveにしているので、
まあ〜いいかと思いした。
オーソドックスにいうと、ダメですか?

回答
投稿日時: 24/04/17 19:00:58
投稿者: simple

アクティブにするとしても、
代入ステートメント

Worksheets("SheetB").Range(Cells(j, 1), Cells(j, 20)).Value = Worksheets("SheetA").Range(Cells(i, 1), Cells(i, 20)).Value
の左か右か、どちらかは不整合になるのではないでしょうか。

回答
投稿日時: 24/04/17 19:34:01
投稿者: WinArrow

simple さんの引用:

左か右か、どちらかは不整合になるのではないでしょうか。

なるほどね。
 
基本に忠実に従うことで
シートをActiveにする必要もないし・・・

投稿日時: 24/04/18 09:01:41
投稿者: AoAo

WinArrowさん
simpleさん
 
おはようございます。
勤務中帰り際に質問していた為、ご返答に遅れまして申し訳ありません。
適格なアドバイス大変助かりました。そして有難うございます。
Resizeという手が思い浮かびませんでした。
勉強になりました!
今回は同じ範囲ですので、動きとしてResizeがスマートに見えましたので
こちらで記述したところイメージ通りの動きをしてくれました!!
 
それにしてもWinアップデートやOfficeのアップデートによって
VBAに不具合がでてしまうのは心臓にわるいです…。
今回はCopyする回数?データー量?によって
クリップボードエラーが出たりでなかったりで(^^;