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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1805閲覧

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

takahashi-

総合スコア56

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/02/27 11:19

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を使用したりしてみたのですがエラーや実行結果がうまくいきませんでした
アドバイスよろしくお願いします

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

vba

1Sub 完成2() 2 Dim op As Variant 3 op = Application.GetOpenFilename() 4 If op = "False" Then 5 'キャンセルされた場合は処理を続行しなくてよいのでさっさと抜ける(早期リターン) 6 '以降のIfのネストが減って若干見やすくなる 7 Exit Sub 8 End If 9 10 'Withやif文ではインデント(Tab)をして範囲をわかりやすくする 11 With Workbooks.Open(op) 12 '暗黙のActive指定に依存しないように対象シートを変数に入れる 13 Dim srcSheet As Excel.Worksheet 14 Set srcSheet = .ActiveSheet 15 16 '既存のプロパティ被る名前は避けた方が無難 17 Dim srcLastRow As Long 18 srcLastRow = srcSheet.Cells(srcSheet.Rows.Count, 1).End(xlUp).Row 19 srcSheet.Range("A2", srcSheet.Cells(srcLastRow, "B")).Copy 20 21 Dim destSheet As Excel.Worksheet 22 Set destSheet = ThisWorkbook.Worksheets.Item(1) 23 destSheet.Range("D" & destSheet.Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues 24 Application.CutCopyMode = False 25 26 .Close 27 End With 28End Sub

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

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

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

vba

1Sub 完成3() 2 Dim op As Variant 3 op = Application.GetOpenFilename() 4 If op = "False" Then 5 Exit Sub 6 End If 7 8 Dim destSheet As Excel.Worksheet 9 Set destSheet = ThisWorkbook.Worksheets.Item(1) 10 11 '出力先の範囲の左上のセル 12 Dim destTopLeft As Excel.Range 13 Set destTopLeft = destSheet.Range("D" & destSheet.Rows.Count).End(xlUp).Offset(1, 0) 14 15 With Workbooks.Open(op) 16 Dim srcSheet As Excel.Worksheet 17 Set srcSheet = .ActiveSheet 18 19 'コピー元のA列最終セル 20 Dim srcALastCell As Excel.Range 21 Set srcALastCell = srcSheet.Cells.Item(srcSheet.Rows.Count, 1).End(xlUp) 22 23 'コピーするセル範囲 24 Dim srcCopyArea As Excel.Range 25 Set srcCopyArea = srcSheet.Range("A2", srcALastCell).Resize(, 2) 'A列→A~B列に拡張 26 27 '出力先のセルをsrcCopyAreaの大きさに拡張してから値を設定 28 destTopLeft.Resize(srcCopyArea.Rows.Count, srcCopyArea.Columns.Count) _ 29 .Value = srcCopyArea.Value 30 31 .Close 32 End With 33End Sub

投稿2019/02/27 12:19

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

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

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

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

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

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

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

VBA

1Sub 完成2() 2 Dim op As String 3 4 op = Application.GetOpenFilename() 5 If op = "False" Then Exit Sub 6 7 With Workbooks.Open(op) 8 With .Worksheets(1) 9 .Range(.Range("A2"), .Cells(.Rows.count, "A").End(xlUp)).Resize(, 2).Copy 10 End With 11 12 With ThisWorkbook 13 .Cells(.Rows.count, "D").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues 14 End With 15 .Close 16 End With 17End Sub

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

VBA

1Sub test2() 2 Dim vFName As Variant 3 Dim wbkFrom As Workbook 4 Dim rngFrom As Range 5 Dim rngTo As Range 6 7 vFName = Application.GetOpenFilename() 8 If v = False Then Exit Sub 9 10 Set wbkFrom = Workbooks.Open(vFName) 11 With wbkFrom.Worksheets(1) 12 Set rngFrom = .Range(.Cells(2, "A"), .Cells(.Rows.count, "A").End(xlUp)).Resize(, 2) 13 End With 14 With ThisWorkbook.Worksheets(1) 15 Set rngTo = .Cells(.Rows.count, "D").End(xlUp) _ 16 .Offset(1).Resize(rngFrom.Rows.count, rngFrom.Columns.count) 17 End With 18 19 rngTo.Value = rngFrom.Value 20 21 wbkFrom.Close 22End Sub

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

投稿2019/02/27 12:32

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takahashi-

2019/02/28 00:15

VBA初心者で本やネットのコードのコピペでした とてもわかり易く読みやすいコードになおして頂きありがとうございました アドバイス通りに読み直してみます 懇切丁寧にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問