Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 8.1 Pro : Excel 2007)
アプリケーション定義またはオブジェクト定義のエラーです
投稿日時: 17/06/13 18:17:05
投稿者: FILETUBE

 こんばんは。
一つ教えてください。
 
1つのブックの列の値とW24の列の値を比較して
同じ値があったらとなりの列の値を元のブックに
セットするコードです。
 
Dim r As Range
Dim iRow As Long
Set wb = Workbooks.Open("C:\test\W24.xls ")
 
Set thisbk = ThisWorkbook
 
iRow = thisbk.Sheets("原").Range("A" & Rows.Count).End(xlUp).Row
   
 For Each r In thisbk.Sheets("原").Range("H3:H" & iRow)
     If r.Offset(0, 0).Value <> "" Then
        Set rmst = wb.Sheets(1).Cells.Find(what:=r.Value, LookAt:=xlWhole)
        If Not rmst Is Nothing Then
 
        r.Offset(0, -1).Value = rmst.Offset(0, -4).Value
 
     End If
     Set rmst = Nothing
     End If
 Next
 
見る限り問題ない行ですが、ある1行の値のせいで
「アプリケーション定義またはオブジェクト定義のエラーです」
となってしまいます。
 
どのようなことが考えられるのでしょうか?
教えて頂けないでしょうか?
よろしくお願いします。
 
 

回答
投稿日時: 17/06/13 19:04:58
投稿者: カリーニン

>ある1行の値のせいで
 
これは回答者にどこでエラーになってるのか当てさせるクイズですか?
でなければ、どこでエラーになってるのかを提示してください。
デバッグウィンドウで黄色くなってるところです。

投稿日時: 17/06/13 21:13:39
投稿者: FILETUBE

 大変申し訳ありませんでした。
 
エラーですが今はけんしょう、r.offset(0,-1).value = c.offset(0,-4).value
の部分でなります。
 
a.xlsm
A列 B列 ボタン
           11
           22
             
ボタンをクリックするとb.xlsを検索しa.xlsmのB列とb.xlsのE列の値が等しい行の
A列の値をa.xlsmのA列にセットしたいのです。
b.xls
A列 E列
QQ 11
SS 12
DD 22
 
a.xlsm
A列 B列
QQ 11
DD 22
 
と結果したいのですが
b.xlsのデータが1000行あって
エラーが出なかったり、1行だけでも
エラーになったりするのです。
見る限りデータは問題無さそうなのですが
アプリケーション定義、またはオブジェクト定義のエラー
ってどういうことなのでしょうか?
 
よろしくお願いします。
 

投稿日時: 17/06/13 21:23:39
投稿者: FILETUBE

 追記させていただきます。
 
findの範囲をE列だけに絞ることはできるのでしょうか?
 
エラーは先ほど投稿した場所か、findの部分だと思うのですが。
 
大変申し訳ありません、どうぞよろしくお願いします。

回答
投稿日時: 17/06/14 10:02:26
投稿者: kakka

たぶんですけど、rmstがE列より左側なんでしょう。
Offset(0, -4)が存在しないのでエラーになっているのかと。
エラーが出たときにイミディエイトウィンドウで「?rmst.address」と入力して変数にセットされているセルを確認できます。
 
で、検索する範囲を指定するには
Set rmst = wb.Sheets(1).Range("E:E").Find(what:=r.Value, LookAt:=xlWhole)
といった感じです。

投稿日時: 17/06/14 13:08:08
投稿者: FILETUBE

  回答ありがとうございます。
 
rmst.Offset(0, -4).Value がアプリケーション定義またはオブジェクト定義のエラーです
となっています。
 
Set rmst = wb.Sheets(1).Cells.Find(what:=r.Value, LookAt:=xlWhole) で見つかるはずなのですが
 
Set rmst = wb.Sheets(1).Range("E:E").Find(what:=r.Value, LookAt:=xlWhole)
と列を指定したらOKになりましたが
 
どういう事なのでしょうか?

回答
投稿日時: 17/06/14 14:52:53
投稿者: kakka

エラーの原因とその確認方法まで一つ前の私のコメントの前半で書いたのですが、読んで頂けましたか?
分かりにくかったですかね?
 
たとえばrmstがD4セルだったとしましょう。そうすると
rmst.Offset(0, -4) は
Range("D4").Offset(0, -4) ですよね。
D4セルから左へ4つずれたセル、っておかしいですよね?
エクセルにはA列より左には列がありませんよね?
なのでエラーになります。
 
で、このrmstという変数に今現在なにがセットされているかを確認するには、
エラーが出たときにデバッグボタンを選択するとコードの編集画面(VBE)が開きますよね。
この時にイミディエイトウィンドウに「?rmst.Address」と入力してエンターを押すと
現在セットされているセルのアドレスが表示されます。
イミディエイトウィンドウが表示されていなかったら Ctrl + G で表示させることが出来ます。

投稿日時: 17/06/14 16:52:35
投稿者: FILETUBE

 大変丁寧な回答ありがとうございました。
なるほどですね。
 
またどうぞよろしくお願いします。