ここから本文です

1、Thisworkbookのボタンでダイアログを表示し、任意でブック選択 2、任意で開...

アバター

ID非公開さん

2016/10/1004:14:07

1、Thisworkbookのボタンでダイアログを表示し、任意でブック選択
2、任意で開くのでシート名が不明である。

3、任意で開いた先頭のシートのA1をコピーして、Thisworkbookのsheet1のA1にペーストしたい
Rangeクラスのselectメソッドエラーが出て回避出来ず困っています。
記述ミスがありましたら指摘ください。
Private Sub CommandButton2_Click()

Application.ScreenUpdating = False

Dim NameFileOpen As String
Dim NameFileOpenOnlyFilename As String


NameFileOpen = Application.GetOpenFilename(FileFilter:="Microsoft EXCELブック,*.xlsx")
If NameFileOpen <> "False" Then
Workbooks.Open Filename:=NameFileOpen
End If
NameFileOpenOnlyFilename = Dir(NameFileOpen)

Workbooks(NameFileOpenOnlyFilename).Activate
Worksheets(1).Activate
Range("A1").Select
Selection.Copy
ThisWorkbook.Activate
Worksheets("Sheet1").Select
Range("A1").Select
Selection.Paste
End Sub

閲覧数:
61
回答数:
3
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tra********さん

2016/10/1009:06:06

>記述ミスがありましたら指摘ください。
ミスじゃないですけど、全体的に非効率。
SelectやActivateは、実行速度低下、プログラムの保守性低下を招きます。
使わない書き方に編集しなおす方法を学習しましょう。

Private Sub CommandButton2_Click()
Dim NameFileOpen As String
NameFileOpen = Application.GetOpenFilename(FileFilter:="Microsoft EXCELブック,*.xlsx")
If NameFileOpen <> "False" Then
Workbooks.Open Filename:=NameFileOpen
ActiveWorkbook.Worksheets(1).Range("A1").Copy _
ThisWorkbook.Worksheets("Sheet1").Range("A1")
End If
End Sub

(未実行につき不具合ご容赦)

アバター

質問した人からのコメント

2016/10/10 11:19:46

初心者でネット見ながらだったので、申し訳ありません。
見やすく効率的な構文を書けるよう気をつけます。
ご回答ありがとうございました

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

ina********さん

2016/10/1011:10:45

>Rangeクラスのselectメソッドエラーが出て回避出来ず困っています。
>記述ミスがありましたら指摘ください。

エラーは一つ目の Range("A1").Select の部分だと思いますが、
エラーの理由はこのコードがシートモジュールに記述してあるから
です。


Range("A1").Select のようにRangeの前のシートやブックを省略
し、尚且つそのコードがシートモジュールのコードである場合、
アクティブシートではなく、そのコードが書いてあるシートを指定
したことになります。


今回はこのコードの前で、別のブックをアクティブにして、
そのブックのRange("A1")をSelectするつもりで書いているの
でしょうが、実際には現在アクティブではないThisWorkbook
の方をSelectするコードになってしまっているためにエラーに
なっています。


ではどうすれば良いかというと、一番簡単なのはコードを標準
モジュールに記述することです。


しかし、Select、Activate を使用するコードは読みにくく保守性
も劣ります。またRangeの前のシートやブックを省略するのもバグの
原因になりやすいです。(今回が良い例です。)


Workbooks("コピー元ブック名").WorkSheets(1).Range("A1").Copy ThisWorkbook.WorkSheets(1).Range("A1")


と、Select、Activateを止めて且つRangeもフル記述にすれば、
シートモジュールでも標準モジュールでもエラーは出ませんが、
このように一行がだらだらと長いコードは、やはり読みにくく
保守性も良くありません。


一番のお勧めはオブジェクト変数を使用することです。

Dim S As Range
Dim D As Range

Set S=Workbooks("コピー元ブック名").WorkSheets(1).Range("A1")
Set D=ThisWorkbook.WorkSheets(1).Range("A1")

S.Copy D

一見、上の一行コードより面倒くさいように見えますが、可読性は
全然違います。
さらに、Rangeオブジェクトだけでなくその上位のシートやブックも
オブジェクト変数を使うことを推奨します。


今回のものでしたら以下のような感じです。


Private Sub CommandButton2_Click()
Dim NameFileOpen As String
Dim Wb As Workbook
Dim S As Range
Dim D As Range

NameFileOpen = Application.GetOpenFilename(FileFilter:="Microsoft EXCELブック,*.xlsx")
If NameFileOpen = "False" Then Exit Sub

'ブックを開いて変数に保持
Set Wb = Workbooks.Open(Filename:=NameFileOpen)

'コピー元セル
Set S = Wb.Worksheets(1).Range("A1")

'貼付け先セル
Set D = ThisWorkbook.Worksheets("Sheet1").Range("A1")

'コピペ
S.Copy D

'開いたブックを閉じる
Wb.Close False
End Sub



なお、今回質問でご提示のコードの最後の部分にもエラーがあります。

>Range("A1").Select
>Selection.Paste

前の行でA1セルを選択し、次の行でSelectionとしていることにより
この場合SelectionはRangeオブジェクトになります。

そして、RangeオブジェクトにはPasteメソッドは無く、PasteSpecial
メソッドしかないから、エラーになるのです。

正しくは、Selection.PasteSpecial です。

som********さん

2016/10/1007:10:37

Selection.Paste

これを

Selection.PasteSpecial

では。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる