質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.94%

CopyプロパティをValueプロパティにしたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 965

score 4

CopyプロパティをValueプロパティにしたい

動作を軽くしたいためにCopyプロパティをValueプロパティにしたいです
ブックオブジェクトを変数に代入してRangeやCellで範囲指定してセルの値を受け渡したいと思って自分でいじっていたのですが思ったような実行結果になりませんでした
アドバイスやTipsなんでもいいので教えてほしいです、よろしくお願いします。

該当のソースコード

Sub 完成()
    Dim op As Variant
    Dim count As Variant
    op = Application.GetOpenFilename()
    If op <> "False" Then
    With Workbooks.Open(op)
    count = Cells(Rows.count, 1).End(xlUp).Row
    Range("A2", Cells(count, "B")).Copy

    ThisWorkbook.Activate

    Worksheets(1).Range("D" & Rows.count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False

    Workbooks.Open(op).Activate
    ActiveWorkbook.Close
    End With
    End If
End Sub

試したこと

変数に代入しようとしたり、Resizeを使用したりしてみたのですがエラーや実行結果がうまくいきませんでした
アドバイスよろしくお願いします

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

どのような記述で試されたのかわかりませんが、質問のコードは暗黙の指定が多いため不安定になりやすいですね。

質問のコードを自分なりに整理すると以下のようになります)。

Sub 完成2()
    Dim op As Variant
    op = Application.GetOpenFilename()
    If op = "False" Then
        'キャンセルされた場合は処理を続行しなくてよいのでさっさと抜ける(早期リターン)
        '以降のIfのネストが減って若干見やすくなる
        Exit Sub
    End If

    'Withやif文ではインデント(Tab)をして範囲をわかりやすくする
    With Workbooks.Open(op) 
        '暗黙のActive指定に依存しないように対象シートを変数に入れる
        Dim srcSheet As Excel.Worksheet
        Set srcSheet = .ActiveSheet

        '既存のプロパティ被る名前は避けた方が無難
        Dim srcLastRow As Long
        srcLastRow = srcSheet.Cells(srcSheet.Rows.Count, 1).End(xlUp).Row
        srcSheet.Range("A2", srcSheet.Cells(srcLastRow, "B")).Copy

        Dim destSheet As Excel.Worksheet
        Set destSheet = ThisWorkbook.Worksheets.Item(1)
        destSheet.Range("D" & destSheet.Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False

        .Close
    End With
End Sub

CopyメソッドからValueプロパティなどに変更する際のポイント

コピーしたものを貼り付けるときは、左上の1セルさえ指定すればあとはExcel側自動で貼り付け範囲を拡張してくれます。

しかし、Valueプロパティなどを使用する場合は、自動の拡張は行われませんので自分で大きさを指定する必要があります。
コピー元の大きさを把握しておきたいため、対象のセル範囲を変数に入れておくと処理がしやすくなります。

Sub 完成3()
    Dim op As Variant
    op = Application.GetOpenFilename()
    If op = "False" Then
        Exit Sub
    End If

    Dim destSheet As Excel.Worksheet
    Set destSheet = ThisWorkbook.Worksheets.Item(1)

    '出力先の範囲の左上のセル
    Dim destTopLeft As Excel.Range
    Set destTopLeft = destSheet.Range("D" & destSheet.Rows.Count).End(xlUp).Offset(1, 0)

    With Workbooks.Open(op)
        Dim srcSheet As Excel.Worksheet
        Set srcSheet = .ActiveSheet

        'コピー元のA列最終セル
        Dim srcALastCell As Excel.Range
        Set srcALastCell = srcSheet.Cells.Item(srcSheet.Rows.Count, 1).End(xlUp)

        'コピーするセル範囲
        Dim srcCopyArea As Excel.Range
        Set srcCopyArea = srcSheet.Range("A2", srcALastCell).Resize(, 2) 'A列→A~B列に拡張

        '出力先のセルをsrcCopyAreaの大きさに拡張してから値を設定
        destTopLeft.Resize(srcCopyArea.Rows.Count, srcCopyArea.Columns.Count) _
                   .Value = srcCopyArea.Value

        .Close
    End With
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

CopyプロパティをValueプロパティにしたい

まず、
Copyメソッドです。プロパティではないです。
メソッド=命令です。
翻ってプロパティ=属性です。
属性といってもイメージしにくいでしょうが、
対象物を形作る要素です。
セルの値の場合、
引き出しの中の中身と考えるとわかるでしょうか?

で、コードについてですが。
1)VBAで使うために用意された言葉を、変数名に使ってはいけません。(今回の場合は、Count)
これが今回の混乱の原因ではないでしょうか?
行番号を入れる変数ならば、iとかixRowとかでどうでしょうか?(その辺はお好みで)

2)操作するセルが存在するシートを明示しましょう。
どのシートを操作したいかがコードを読んでわかりません。
(これも混乱の原因でしょう)

3)操作したい対象を明示してコードに書くだけで、いいです。
あえてアクティブにしたり選択したりさせる操作を命令する必要はないです。

4)With句が上手く使えてません。
「.(ピリオド)」を書き忘れてませんか?

5)セル範囲を特定するために、あえて行番号のみを変数に取り出さなくても、
Rangeプロパティには、セルその物で指定が可能になっていますので、
余分な手順ではないでしょうか?

これらの点に注意してもう一度コードを見直してみてはいかがでしょうか?
下記にこんな感じで書きたかったのかなぁというサンプルを貼ってみます。
(ピリオドの位置に注目して読んで、ご自分のコードと比較してみてください。)

Sub 完成2()
    Dim op As String

    op = Application.GetOpenFilename()
    If op = "False" Then Exit Sub

    With Workbooks.Open(op)
        With .Worksheets(1)
            .Range(.Range("A2"), .Cells(.Rows.count, "A").End(xlUp)).Resize(, 2).Copy
        End With

        With ThisWorkbook
            .Cells(.Rows.count, "D").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
        End With
        .Close
    End With
End Sub

ここで、Valueプロパティを使って値の転記をしたいならば、

Sub test2()
    Dim vFName As Variant
    Dim wbkFrom As Workbook
    Dim rngFrom As Range
    Dim rngTo As Range

    vFName = Application.GetOpenFilename()
    If v = False Then Exit Sub

    Set wbkFrom = Workbooks.Open(vFName)
    With wbkFrom.Worksheets(1)
        Set rngFrom = .Range(.Cells(2, "A"), .Cells(.Rows.count, "A").End(xlUp)).Resize(, 2)
    End With
    With ThisWorkbook.Worksheets(1)
        Set rngTo = .Cells(.Rows.count, "D").End(xlUp) _
                    .Offset(1).Resize(rngFrom.Rows.count, rngFrom.Columns.count)
    End With

    rngTo.Value = rngFrom.Value

    wbkFrom.Close
End Sub

こんな感じになるのかなぁと思います。
操作対象をどのブックのどのシートのどのセル範囲なのかを明確にしてから、
操作の命令をしたらよりよいと思いました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/28 09:15

    VBA初心者で本やネットのコードのコピペでした
    とてもわかり易く読みやすいコードになおして頂きありがとうございました

    アドバイス通りに読み直してみます
    懇切丁寧にありがとうございました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る