Excel (VBA)

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

 
(指定なし : Excel 2013)
実行エラー13、について
投稿日時: 21/06/05 09:49:18
投稿者: sue619

お世話になります。
 
  データの検索結果が無い場合、エラーが発生します。
  変数の型が不一致だからだと思いますが、修正方法がわかりません。
  ご教示をお願い致します。
  
--------------------------------------------------------------------------
        検索 = range("a1").Value
        Set アドレス = Sheet2.Range("A1:A1000").Find(What:=検索, LookAt:=xlWhole)
        
       If アドレス Is Nothing Then
        Set アドレス = Sheet2.Range("A1").End(xlDown).Row + 1
        End If
                 
        Sheet1.Cells(n, "B").Resize(, 10).Copy
                
        Sheet2.Cells(アドレス.Row, "A").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
                 SkipBlanks:=False, Transpose:=False
---------------------------------------------------------------------------
説明が足りないかと思いますが、
 
 シート1、セルA1と同じデータを、シート2、A1からA100の中で検索。
 無ければ、シート2のA列データ最終行を、アドバイスとして設定。
 
 シート1のn行のB列から10列分をコピーし、
 シート2のアドレスで指定した行へデータを貼り付け。
 
 シート2のA列に検索結果がある場合は、エラーは発生しませんが、
 検索した結果が無い場合、実行エラー13が発生します。
 
 また、set を外し、アドレス = Sheet2.Range("A1").End(xlDown).Row + 1 とすると、
 今度は、データを貼り付けするところで、
 
   Sheet2.Cells(アドレス.Row, "A").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
       SkipBlanks:=False, Transpose:=False
 
 実行エラー424、オブジェクトが必要ですというエラーが出ます。 
 エラー回避方法をよろしくお願いいたします。
   
  

回答
投稿日時: 21/06/05 11:09:05
投稿者: simple

こんにちは。
確認ですが、
(1)Sub XXX() から End Subまで、省略せずに書いてもらえますか?
   変数の宣言はどうされているんですか?
(2)モジュールの冒頭に、Option Explicitを入れていますか?
   また、これを自動的に挿入することのできる設定にしていますか?
   http://officetanaka.net/excel/vba/beginner/06.htm
   を参照して下さい。

回答
投稿日時: 21/06/05 12:04:15
投稿者: simple

Findメソッドは、ヒットしたらそのRangeオブジェクトを返し、
ヒットしなければNothingを返します。
 
Set 変数 = と書いたら、そこに続くのはオブジェクトでないといけません。
この場合は、Rangeオブジェクトですから、それでOKです。
もし、行番号を入れるのなら、Setをつけてはダメです。
 
こんな風に書けるのではないかと思います。参考にしてみてください。
 

Option Explicit
Sub test()
    Dim 検索  As String
    Dim found As Range
    Dim n     As Long
    
    検索 = Sheet1.Range("A1").Value
    Set found = Sheet2.Range("A1:A1000").Find(What:=検索, LookAt:=xlWhole)

    If found Is Nothing Then
        Set found = Sheet2.Range("A1").End(xlDown).Offset(1)
    End If

    n = 20  'コピー元、コピー先はよく分からないが....
    Sheet1.Cells(n, "B").Resize(, 10).Copy
    found.PasteSpecial _
            Paste:=xlPasteValues, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False
End Sub

回答
投稿日時: 21/06/05 21:34:53
投稿者: simple

過去ログを拝見しました。
https://www.moug.net/faq/viewtopic.php?t=80583
そこでも変数宣言を求められているのに、
また同様のことを繰り返すのは残念です。
しかも型がポイントであればなおさらでしょう。

投稿日時: 21/06/06 16:29:40
投稿者: sue619

simple様
 
  お世話になります。
 
  ご返信ありがとうございました。
 
  Option Explicit 初めて知りました。
  基礎が無い、なんちゃって vba のため、
  参照先、大変勉強になりました!!
 
  今後も、どうぞご教示を宜しくお願い致します。