[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/06/06(Wed) 16:55
投稿者名:アキ
Eメール:
URL :
タイトル:
「オブジェクト変数または With ブロック変数が設定されていません。」というエラーが出てしまいます。
OS:WindowsXP
開発:VB6.0
Excel2002

Excelのデータを編集するプログラムを作れと言われまして、初めてVBを扱いました。
文献やHPを見て、VBからExcelを操作するプログラムにしようと考えました。

A列の「Start」という文字が含まれるセルのある行から「End」という文字が含まれるセルのある行まで、B列の見つけた行の上の値をB列の前記の行にコピーするというものです。(説明が分かりづらくてすいません)

[プロジェクト]→[参照設定]→[Microsoft Excel 10.0 Object Library]
にチェックを入れ、以下のようなコードを作りました。

Option Explicit
    Dim XLSBook As Object
  
Private Sub Command1_Click()
    Dim Fname As String
    Dim num As Single
    Dim row1 As Integer
    Dim row2 As Integer

    Set XLSBook = CreateObject("excel.application.10")
    With XLSBook.Application
        .Visible = True
        Fname = C:\Documents and Settings\User1\My Documents\book1.xls
        .Workbooks.Open (Fname)
        With .Workbooks(1).Worksheets(1)
            Do
                row1 = .Range("A:A").Find("Start", lookin:=xlValues).Row
                row2 = .Range("A:A").Find("End", lookin:=xlValues).Row
                num = .Cells(row1 - 1, 2)
                .Range(Cells(row1, 2), Cells(row2, 2)) = num
            Loop Until IsError(.Range("A:A").Find("Start", lookin:=xlValues)) = True
        End With
    End With
    Set XLSBook = Nothing
    Exit Sub
End Sub

これを実行すると、タイトルのエラーメッセージが表示され、Doループがうまく回りません。デバッグすると、「row1 = .Range("A:A").Find("Start", lookin:=xlValues).Row」の部分が黄色く反転表示されます。
どなたか助言お願いいたします。

投稿時間:2007/06/06(Wed) 17:30
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: 「オブジェクト変数または With ブロック変数が設定されていません。」というエラーが出てしまいます。
>     Set XLSBook = CreateObject("excel.application.10")
変数名に Book という名前が付いていますが、ここで得られるオブジェクトは、
Excelブックをあらわすオブジェクト(Workbookオブジェクト)ではなく、
Excel本体をあらわすオブジェクト(Applicationオブジェクト)ですよ。

>     With XLSBook.Application
すでに Application オブジェクトを取得済みですので、今回のコードで
Application プロパティを利用することは無意味かと思います。

上記の場合、「XLSBook」「XLSBook.Application」「XLSBook.Application.Application」は
同一のオブジェクトを参照することになりますので…。

>         Fname = C:\Documents and Settings\User1\My Documents\book1.xls
誤記とは思いますが、両端を「"」で囲まないと。

>         .Workbooks.Open (Fname)
括弧は不要です。付けたいのであれば、Call ステートメントを併用しましょう。

>                 row1 = .Range("A:A").Find("Start", lookin:=xlValues).Row
Find メソッドは、一致するデータが見つからなかった場合に Nothing を返しますので、
Set x = 〜.Find(…)
If x Is Nothing Then
 '見つからなかったときの処理
Else
 row1 = x.Row
End If
のようにすべきでしょう。

> タイトルのエラーメッセージが表示され、
Nothingすなわち、オブジェクト自体が存在しない状態であれば、そうなるでしょうね。
存在しないオブジェクトの Row プロパティを得ることはできませんし。


>                 .Range(Cells(row1, 2), Cells(row2, 2)) = num
『Cells』ではなく、『.Cells』です。
ドットが抜けていると、どのシートのセルを参照しているのかが曖昧になり、
幾つかの弊害を引き起こします。
http://hanatyan.sakura.ne.jp/vbhlp/ExcelErr.htm

投稿時間:2007/06/06(Wed) 18:36
投稿者名:アキ
Eメール:
URL :
タイトル:
解決しました!
お早いご返答ありがとうございます!

おかげで考えていたプログラムを完成させることができました。
恥ずかしながらこのプログラムを作るのに、2週間以上かかっていたので本当に感謝しています。
これからもプログラムに精進していきます!