[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
■
そして、このトピックの回答としては、一度、ステップ実行などを行って、ローカルウィンドウで各変数の中身を真面目に確認してみるとよいと思いますが、
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
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
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.