tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルオブジェクト参照エラー
記事No8699
投稿日: 2009/02/04(Wed) 14:07
投稿者masa
こんにちは。
VB2005でExcelに値を格納するPGを作成してます。

Excelを起動させるPGをclsAAAとし
値を代入している箇所をclsBBBとし
xlApp、xlBooksなどの宣言をclsCCCで行っています。

clsBBBでxlsheet.cells(1,1) = "aaa" と行うと

「"オブジェクト参照がオブジェクト インスタンスに設定されていません。"」
とエラーになります。

clsAAAで行うときちんと処理されます。
clsBBBでclsCCCを継承するために

Inherits clsCCC と記述しています。

これにNEW等をつけないといけないのでしょうか?

[ツリー表示へ]
タイトルRe: オブジェクト参照エラー
記事No8701
投稿日: 2009/02/04(Wed) 16:44
投稿者Abyss
ご自分のコードが提示されたら、第3者として
わかり易いと思いますが。

↓の方法では問題なかった。

Imports Microsoft.Office.Interop

Class clsAAA
    Inherits clsCCC

    ' Constructor...
    Sub New()
        Xl = New Excel.Application
        Books = Xl.Workbooks
        Book = Books.Open("C:\Test.xls")
        Xl.Visible = True
        xlSheets = Book.Sheets
        xlSheet = xlSheets.Item(1)
    End Sub
End Class


Class clsBBB
    Shared Sub Main()
        Dim cls As New clsAAA
        cls.xlSheet.Cells(1, 1).Value = "Hello"

    End Sub
End Class


Class clsCCC
    Public Xl As Excel.Application
    Public Books As Excel.Workbooks
    Public Book As Excel.Workbook
    Public xlSheets As Excel.Sheets
    Public xlSheet As Excel.Worksheet

End Class

[ツリー表示へ]
タイトルRe^2: オブジェクト参照エラー
記事No8702
投稿日: 2009/02/04(Wed) 17:10
投稿者masa
解りにくくてすみません。
ボタンが押されたらExcelを起動させDB接続したのちに
そのデータをExcelに書込んでいます。
Excel起動、データ取得までは上手くいってますが書込み時にエラーになってしまいます。
宣言もしてるしどこがおかしいか検討がつきません。

Imports Microsoft.Office.InteropはclsBBBで設定しました。

Public Class FrmMain

    '//// クラス変数 ///
    Private ExcelInsert As clsBBB = New clsBBB()
    Private Excel As clsAAA = New clsAAA()

    '接続ボタンを押した時の処理
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            ' EXCELテンプレートを開く
            Excel.AAAA()

            ' 書込み
            ExcelInsert.BBBB()

    End Sub

End Class

Public Class clsAAA

    Inherits clsCCC

    Public Sub AAAA()

      xlBook = xlBooks.Open(C:\Test.xls)
      xlSheets = xlBook.Worksheets
      xlSheet = xlSheets.Item(1)

      '// Excelの表示
      xlApp.Visible = True
    End Sub

End Class

Public Class clsBBB

     Public Sub BBBB()

    Dim cls As New clsAAA

    --DB接続しデータ取得

    --書き込み
    Do While --
      cls.xlSheet.Cells(1, 1) = "aaa"
      cls.xlSheet.Cells(1, 2) = "bbb"
    Loop

     End Sub

End Class

Public Class clsCCC

    '// Excel操作
    Public xlApp As New Excel.Application
    Public xlBooks As Excel.Workbooks = xlApp.Workbooks
    Public xlBook As Excel.Workbook = Nothing
    Public xlSheets As Excel.Sheets = Nothing
    Public xlSheet As Excel.Worksheet = Nothing
    '// Excel操作

End Class

[ツリー表示へ]
タイトルRe^3: オブジェクト参照エラー
記事No8703
投稿日: 2009/02/04(Wed) 17:29
投稿者YuO
> ボタンが押されたらExcelを起動させDB接続したのちに
> そのデータをExcelに書込んでいます。
> Excel起動、データ取得までは上手くいってますが書込み時にエラーになってしまいます。
> 宣言もしてるしどこがおかしいか検討がつきません。

まずはクラスについてちゃんと勉強をすることをお勧めします。
Newしたら別のインスタンスができて,
その時のSharedのフィールドは別物であることがわかっていないように見受けられます。

> Public Class clsBBB
>      Public Sub BBBB()
>     Dim cls As New clsAAA
>     Do While --
>       cls.xlSheet.Cells(1, 1) = "aaa"

ここで,cls.xlSheetはどこで代入しているのですか?

[ツリー表示へ]
タイトルRe^3: オブジェクト参照エラー
記事No8705
投稿日: 2009/02/04(Wed) 18:08
投稿者Abyss
YuOさんの仰るとおり、両方のInstanceは
全く別のものです。であれば、繋ぎの紐が
必要ですね。Classの設計の問題はありますが、
現状のコードで処理したいのであれば、以下の
ような方法も考えられます。


Public Class FrmMain

    '//// クラス変数 ///
    Private ExcelInsert As clsBBB = New clsBBB()
    Private Excel As clsAAA = New clsAAA()

    '接続ボタンを押した時の処理
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

         ' EXCELテンプレートを開く
         Excel.AAAA()
            
         ExcelInsert.TargetClass = Excel

         ' 書込み
         ExcelInsert.BBBB()

End Class


Public Class clsBBB

    Public TargetClass As clsAAA

    Public Sub BBBB()

        '--DB接続しデータ取得

        '--書き込み
      Do While --
        TargetClass.xlSheet.Cells(1, 1) = "aaa"
        TargetClass.xlSheet.Cells(1, 2) = "bbb"
      Loop

    End Sub

End Class

[ツリー表示へ]
タイトルRe^4: オブジェクト参照エラー
記事No8707
投稿日: 2009/02/04(Wed) 21:25
投稿者masa
YuOさん、Abyssさんありがとうございます。

あまり勉強はせず調べながらやっていたので
こんなPGになってしまいました。

もう少し勉強します。

[ツリー表示へ]