[[20220904161527]] 『アプリケーション定義またはオブジェクト定義のエ』(赤とんぼ) ページの最後に飛ぶ

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

 

『アプリケーション定義またはオブジェクト定義のエラー?』(赤とんぼ)

ダイアログで指定したブックSheet(1)A列をマクロを実行したブックのA列へ貼り付けるため、下記コードを実行しました。しかし「アプリケーション定義またはオブジェクト定義のエラー」?となりデバックすると「pWs.Columns("1").Select」で止まっています?VBAを始めたばかりでどう変更したら良いかわかりません?教えてくださいよろしくお願いします。

Sub コード列転記2()
Dim FName, i As Integer
Dim wb As Workbook, pWs As Worksheet

  Set pWs = ThisWorkbook.ActiveSheet
  FName = Application.GetOpenFilename("Excelマクロ,*.xlsm")
  If FName = False Then Exit Sub
  Workbooks.Open (FName)
  Set wb = ActiveWorkbook
      pWs.Columns("1").Select
      Selection.Copy
      wb.ActiveSheet.Columns("1").Select
      ActiveSheet.Paste  
  wb.Close
End Sub

< 使用 Excel:Office365、使用 OS:Windows11 >


 pWs.Columns(1).Select
 とするか
 pWs.Columns("A").Select
 としてください。
(hatena) 2022/09/04(日) 16:52

そもそも、Selectする必要はないですね。
あと、Workbooks.Openの返り値で開いたブックを取得できます。
また、Copyの引数に貼り付け先を指定できます。

 Sub コード列転記2()
    Dim FName, i As Integer
    Dim wb As Workbook, pWs As Worksheet
    Set pWs = ThisWorkbook.ActiveSheet
    FName = Application.GetOpenFilename("Excelマクロ,*.xlsm")
    If FName = False Then Exit Sub

    Set wb = Workbooks.Open(FName)
    pWs.Columns(1).Copy wb.ActiveSheet.Columns(1)
    wb.Close
 End Sub

(hatena) 2022/09/04(日) 16:59


hatenaさんともろ被りですが、書いてしまったので投稿しておきます。

■1
>どう変更したら良いかわかりません?
なんか疑問形で質問するのが流行っているようですが、↓でエラーになるのは【1】という列文字の列がないからですね。

 Columns("1").Select

なのでAという【文字列】を指定するか、1列目という【数値】を指定するとよいでしょう。

■2
VBAの世界では基本的にブックやシート(オブジェクトといいます)は、きちんと明示すればいちいちアクティブにしたり選択したりする必要はありません、
また、【標準モジュール】でシートの指定を省略した場合、ActiveSheetが指定したとみなされるルールです。
したがって、複数の(ブックや)シートを相手にした処理を考えるならば、対象のオブジェクトを明示するようにすることをお勧めします。

■3
Pasteメソッドを使用している部分ですが、これはこれで間違いではないのですが、直前のCopyメソッドの特徴として、引数に貼り付け先を指定するとPasteメソッドの代わりができてしまうという特徴があります。
割とよく使われるテクニックなので覚えておいて損は無いでしょう。

■4
提示のコードだと、(開いて)Activeになっているブックのアクティブシートに対して操作をすることになってますが、ブックに複数のシートがある場合、目的のシートがアクティブになっているか保証されませんが大丈夫なんですか?
仮に、ブックに1枚しかシートが無いならばその心配はありませんが、それならそれで1番目のシートと指定してしまったほうが安牌だと思います。

■5
ということを踏まえて、コードを整理してみるとこんな感じになります。
興味があればステップ実行して研究の上、必要な部分をご自身のコードに組み込んでください。

    Sub 研究用()
        Stop 'ブレークポイントの代わり

        Dim ふぁいるぱす As String
        Dim pWs As Worksheet
        Set pWs = ThisWorkbook.ActiveSheet

        ふぁいるぱす = Application.GetOpenFilename("Excelマクロ,*.xlsm")
        If FName = False Then Exit Sub

        With Workbooks.Open(FName)
            pWs.Columns(1).Copy .Worksheets(1).Range("A1")
            '.Save
            .Close
        End With
    End Sub

(もこな2) 2022/09/04(日) 17:10


hatenaさん。もこな2さんありがとうございます。私の説明が不十分でしたすいません。
下記コードでエラーは出ませんでしたが、逆さまの貼付けになってしまいました?
マクロ実行ブックA列がダイアログで指定したブックへ貼り付けられてしまいました。
ダイアログで指定したブックSheet(1)A列をコピーして、マクロ実行ブックSheet(1)A列へ貼り付けるにはどこを変更すればよいか教えていただけませんでしょうか、よろしくお願いします。

Sub コード列転記3()

    Dim FName, i As Integer
    Dim wb As Workbook, pWs As Worksheet
    Set pWs = ThisWorkbook.ActiveSheet
    FName = Application.GetOpenFilename("Excelマクロ,*.xlsm")
    If FName = False Then Exit Sub
    Set wb = Workbooks.Open(FName)
    pWs.Columns(1).Copy wb.ActiveSheet.Columns(1)
    wb.Close
 End Sub

(赤とんぼ) 2022/09/04(日) 17:42


>ダイアログで指定したブックSheet(1)A列をコピーして、マクロ実行ブックSheet(1)A列へ貼り付けるにはどこを変更すればよいか
【ステップ実行】してコードの意味をよく考えてみればわかるでしょう。

それでもわからなければ↓をよ〜〜〜〜〜〜〜〜〜く考えてみてください

 【どこを】コピーして【どこへ】貼り付けるのか

(もこな2) 2022/09/04(日) 18:12


wb.ActiveSheet.Columns(1).Copy pWs.Columns(1)
(o) 2022/09/04(日) 18:22

もこな2さん ご指摘ありがとうございます、お示しいただきました下記コードを実行するとエラーはでませんがA列がコピーされていませんでした。まだ何か追加しなければいけないのでしょうか?教えてください。

  Dim ふぁいるぱす As String

    Dim pWs As Worksheet
    Set pWs = ThisWorkbook.ActiveSheet
    ふぁいるぱす = Application.GetOpenFilename("Excelマクロ,*.xlsm")
    If FName = False Then Exit Sub
    With Workbooks.Open(FName)
    pWs.Columns(1).Copy .Worksheets(1).Range("A1")
        .Save
        .Close
    End With
    wb.Close

(赤とんぼ) 2022/09/04(日) 19:00


oさん ありがとうございます。お示しいただいた修正で完成しました。
みなさんありがとうございました。

(赤とんぼ) 2022/09/04(日) 19:35


コメント返信:

[ 一覧(最新更新順) ]


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