[[20190712191619]] 『424エラー オブジェクトが必要です』(kousin) ページの最後に飛ぶ

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

 

『424エラー オブジェクトが必要です』(kousin)

先程質問したものです。 先程回答して頂いた方々本当にありがとうございました。
いま作業をしていてエラーまた同じエラーなのですが、なぜエラーになったのか調べても分からなかったので再度質問させていただきたいと思いました。 お恥ずかしい限りです。

マクロブックに記載している文字列を二つ取得し取得した文字列で別ブックを開き、開いたブック内をもう一つ取得した文字列で検索。
さらに検索したセル位置から右4つ移動してコピーし、マクロブックの指定のセルにペーストするという文字にすると少しややこしい内容です。

 以下構文になります。

Sub test()
Dim sheetname As String
sheetname = Range("E4").Value 'E4の文字列をワークブック開く用の変数として扱う
Debug.Print sheetname

Dim name As String
name = Range("A4").Value 'A4の文字列を検索用として取得する
Debug.Print name

Dim wb As Workbook
Workbooks.Open Filename:="C:Desktop\デスクファイル\○○\マクロ開発用\" & sheetname & ".xlsx" 'E4の変数を代入してファイルを開く

Dim rng As Range
Set rng = Range("C:C").Find(What:=name) 'A4で取得したワードを開いたブックのC列から検索する。
Debug.Print (c.Address) 'ここで取得できずにエラーになる。元ファイルを見ても検索したい文字は存在している。
rng.Offset(0, 4).Copy

thisworkbooks = Range("F4").PasteSpecial

End Sub

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


投稿しなおしのためいったん削除

(もこな2) 2019/07/12(金) 20:56


投稿しなおしのためいったん削除

(もこな2) 2019/07/12(金) 21:17



とりあえず、回答ではないですが気になったので。
[[20190712163358]] 『424エラー オブジェクトが必要です』(kousin)
↑で話をつづけたほうが、前提がわかりやすいと思いますが、別トピックにしたい理由があるのですか?


そして、このトピックの回答としては、一度、ステップ実行などを行って、ローカルウィンドウで各変数の中身を真面目に確認してみるとよいと思いますが、

 Debug.Print (c.Address) 

ここでエラー出ているのですよね?
これ、そもそも意味を分かっていらっしゃいますか?
ざっくりいうと「【C】という(Range)オブジェクトのアドレスを、イミディエイトに出力しなさい。」ってことになってますよ。

とりあえず問題なのは、【C】という変数を宣言(定義)もしていなければ、代入もしていないところです。
おそらく、

 Debug.Print (rng.Address) 

と間違ったのだと推察しますが、このようなミスは、前トピックで???さんがすでにコメントされているとおり、変数の宣言を強制しておくことで、誰かに聞くことなく(真っ先にExcel君が指摘してくるので)自分で気づけるようになるはずです。
http://officetanaka.net/excel/vba/variable/02.htm
http://officetanaka.net/excel/vba/beginner/06.htm


また、おそらく標準モジュールに記述しているものと思われますが、

 Range("A4").Value
     ↓
 ActiveSheet.Range("A4").Value

上記のように、【どのシート】であるのかを省略すると、アクティブシートを指定したものとみなされますから、複数のブック、シートをまたいだ処理をする場合には、対象オブジェクトを意識されるようにしたほうがよいです。


上記のことは、いちいちオブジェクトを全部書かなくても、変数を使ったり、Withステートメントを使うという手もあります。
Withステートメントってなんだ?という場合は↓をご覧ください。
http://officetanaka.net/excel/vba/beginner/16.htm


インデントを付けていらっしゃいませんが、見やすくすることでご自身のデバッグ作業の役に立つと思いますから、特別なこだわりがなければ、インデントを付けることをおすすめします。
http://kabu-macro.com/vba_apply/vba_indent.html


 Set rng = Range("C:C").Find(What:=name) 

↑でFindメソッドというものを使っています。
この書き方でエラーは出ないのですが、実は失敗することがあります。
https://www.moug.net/tech/exvba/0150111.html
なので、私はLookIn、LookAtあたりは省略せず、きちんと指定することをおすすめしています。

これから出かけるので、気になった部分の列挙まで。

(もこな2) 2019/07/13(土) 10:01


もこな2さんがほとんど回答してくれていますが
もう一つ

Debug.Print (c.Address) が解決したとしても

thisworkbooks = Range("F4").PasteSpecial も おかしいような・・・

なにを使用しているのかわかりませんが

thisworkbooks は 予約語のようで予約語ではありませんから Variant 型の変数として認識されます
PasteSpecialの戻り値を使うということはやったことはありませんがヘルプを見ると
Variant型の戻り値を返すようですから、エラーにはならないかも です。

このコードが書かれているブックのシートに 貼り付けしたいということであれば

ThisWorkbook.Worksheets("シート名").Range("F4").Paste

とかでしょうね

Dim 文が 散見しているところを見ると、いろいろコードを寄せ集めているようですけれど、通常Dim分は プロシージャの先頭にまとめます。

思えておいて損はありません

(渡辺ひかる) 2019/07/13(土) 13:12


丁度、編集がかぶっちゃったけどそのまま。

PCの前に戻りました。続きです。


C:Desktop\
↑実際にはユーザ名が入ると思いますが、このようなものを特殊フォルダと言います。
そんな時は↓が参考になるとおもいます。
http://officetanaka.net/excel/vba/tips/tips107.htm


Findメソッドは見つかったセルを返しますが、見つからなかった場合は、Nothingを返します。
そうなると、見つからなかった場合、現状ではNothingをコピーしようとして、結局同じエラー(オブジェクトがない)が出ると思われますので、その対策もしておいたほうがよいです。


提示されたコードを、コメントを付けつつ修正してみました。
コンパイルエラーにならないことくらいしかチェックしてませんが、興味があればステップ実行して研究してみてください。

    Sub さんぷる()
        Dim ふぉるだぱす As String
        Dim ブック名 As String
        Dim 検索値 As String
        Dim dstSH As Worksheet
        Dim srcSH As Worksheet
        Dim MyRNG As Range

        Stop '←ブレークポイントの代わり

        '▼ActiveSheetに依存しない
        Set dstSH = ThisWorkbook.Worksheets(1)

        '▼検索値を取得
        検索値 = dstSH.Range("A4").Value

        '▼対象フォルダのパスを取得する
        ふぉるだぱす = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\○○\マクロ開発用"

        '▼指定フォルダを確認して対象ファイルの存在をチェック
        ブック名 = Dir(ふぉるだぱす & "\" & dstSH.Range("E4").Value & ".xlsx")
        If ブック名 = "" Then
            MsgBox ふぉるだぱす & " に " & vbCrLf & dstSH.Range("E4").Value & ".xlsx" & " は存在しません。"
            Exit Sub
        End If

        '▼ブックを開いて操作の対象に
        With Workbooks.Open(ふぉるだぱす & "\" & ブック名)

            '▼ブックを開いた時に目的のシートがアクティブとは限らないのでこちらもきちんと指定する。
            Set srcSH = .Worksheets(1)

            '▼Findメソッドを使用して検索
            Set MyRNG = srcSH.Range("C:C").Find(What:=検索値, LookIn:=xlValues, LookAt:=xlWhole)

            '▼Findメソッドの結果、見つからない場合はNothingになるのでその場合の処理も考えておく
            If MyRNG Is Nothing Then
                MsgBox 検索値 & "を探しましたが見つかりませんでした" & vbCrLf & "コピー処理は行いません"
            Else
                '▼ただのコピペでよければ、Copyメソッドだけでも対処可能
                MyRNG.Copy dstSH.Range("F4")
            End If

            '▼オマケ(開いたブックは用が済んだら閉じる)
            .Close

        End With

    End Sub


順番が前後しますがステップ実行と言われて、何を言われているかわからない場合はこちらが参考になるとおもいます。
https://www.239-programing.com/excel-vba/basic/basic023.html
https://asatte.biz/vba-debug-menu/
http://plus1excel.web.fc2.com/learning/l301/t405.html

(もこな2) 2019/07/13(土) 13:15


返信遅れました。 申し訳ありません。
遅ればせながら、もこな2さん、渡辺ひかるさん、ご回答ありがとうございました。
教えて頂いたコードを使って無事やりたいことが出来ました。
書かれている事全てを理解したわけではないので、ご紹介させて頂いているURLを参考に理解していこうと思います。
貴重な時間を使ってご回答頂き本当にありがとうございました。
(kousin) 2019/07/16(火) 09:33

コメント返信:

[ 一覧(最新更新順) ]


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