[[20190718010605]] 『VBA コピー参照先が変わってしまう』(あんこう) ページの最後に飛ぶ

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

 

『VBA コピー参照先が変わってしまう』(あんこう)

<作業用>シートの表1〜3を<印刷用>にコピー・ペーストをしたいのですが、ステップインと実際とで挙動が異なってしまいます。
会社のデスクトップPCで作成したものをノートPC(会社のよりは低スペック)で編集しようとしたところ下記の状態になりました。
どちらもWin10 Excel 2013です。スペックの問題でしょうか。ご教示ください。

・ステップインでは正常にペーストされるが実際に動かすと最後の表3が<印刷用>シートで範囲指定がされてしまい別の値がペーストされる。
 表3は<作業用>シートのA46:O49にあるが実際動かすと<印刷用>シートのA46:O49がペーストされる。
・コピーの順番を変えて表3・表2・表1の順に指示すると最後の表1で1004「アプリケーション定義またはオブジェクト定義のエラーです。」が出る。
・下記のコードだとステップインでは上手くいく。
・Rangeの前にシート指定を入れると1004「アプリケーション定義またはオブジェクト定義のエラーです。」が出る。
・会社のデスクトップPCではエラーなしで上手くいくが自宅ノートPCでは上記の状態になる。

Sub Print_Setting()

Dim endR, endC As Integer

  Application.ScreenUpdating = False

  endR = Range("A200").End(xlUp).Row
  endC = Range("AX2").End(xlToLeft).Column

  Set Prt = Worksheets("印刷用")
  Prt.Range("A1:AJ200").Delete Shift:=xlUp

  Range(Cells(2, 1), Cells(endR, endC)).copy             '表1
  Worksheets("印刷用").Range("A5").PasteSpecial Paste:=xlPasteAll
  Range(Cells(endR + 6, 1), Cells(endR + 6, endC)).copy  '表2
  Worksheets("印刷用").Range("A1").PasteSpecial Paste:=xlPasteAll
  Range(Cells(endR + 2, 1), Cells(endR + 4, endC)).copy   '表3
  Worksheets("印刷用").Range("A2").PasteSpecial Paste:=xlPasteAll
  Application.CutCopyMode = False

End Sub

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 >Rangeの前にシート指定を入れると1004「アプリケーション定義またはオブジェクト定義のエラーです。」が出る。

 こういうエラー内容なのか忘れたけど
 Range には、シートが解るけど、中の Cells 達には、どんなシートか解りませ〜ん。状態では
(BJ) 2019/07/18(木) 01:46

たぶん、お困りのことの解決にはつながらないと思いますが・・・

(1)

 Dim endR, endC As Integer
  ↑だと↓という意味になってます。(「endR」がVariant型として解釈されている)
 Dim endR As Variant, endC As Integer

(2)

 Application.ScreenUpdating = False
 ↑意味が分かって入れているなら止めませんが、検証作業の邪魔になるから
 試行錯誤している段階ではコメントアウトを推奨します。

 また、少なくとも、どこかで↓にしたほうがよくないですか?
 Application.ScreenUpdating = True

(3)

 変数「prt」が定義されていません。

(4)

 〜.Copy 
 〜.PasteSpecial Paste:=xlPasteAll
 この場合、1行で(Copyメソッドのみで)記述することも可能です。

(5)

 標準モジュールに記述している場合。
 Range("〜")
  ↓
 ActiveSheet.Range("〜")
 と解釈されますが、問題はないのでしょうか?

(6)

 endR、endR いずれも、なんで中途半端なところから上(左)に見ていくんです?
 一番端っこからみるとまずいのですか?
 endR + 6 なんでやってるので実は、最終行じゃなくて表の開始行?を
 求めていたりするのでしょうか?

(7)

 とりあえず上記を踏まえて整理してみました。
    Sub test()
        Dim endR As Variant, endC As Integer
        Dim prt As Worksheet: Set prt = Worksheets("印刷用")

        With ActiveSheet

            endR = .Range("A200").End(xlUp).Row
            endC = .Range("AX2").End(xlToLeft).Column

            '削除
            prt.Range("A1:AJ200").Delete Shift:=xlUp

            '表1をコピペ
            .Range(.Cells(2, 1), .Cells(endR, endC)).Copy prt.Range("A5")

            '表2をコピペ
            .Range(.Cells(endR + 6, 1), .Cells(endR + 6, endC)).Copy prt.Range("A1")

            '表3をコピペ
            .Range(.Cells(endR + 2, 1), .Cells(endR + 4, endC)).Copy prt.Range("A2")
        End With

    End Sub

(もこな2) 2019/07/18(木) 02:33


やはりCellsのシート指定が原因でした。
もこな2様のコードを実行したところ上手く動きました。
ご回答いただいたみなさまありがとうございます。
(あんこう) 2019/07/18(木) 11:04

コメント返信:

[ 一覧(最新更新順) ]


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