投稿者 葉月  (社会人) 投稿日時 2008/11/20 08:21:52
昨日、気づいたのでいまさらですが……
 他の利用者の参考になるかも知れません。制約つきでサンプルコードを掲載します。
 制約の説明は、以下になります。

>分解したRGBの表示まではできたのですが、座標(0,0)から(100,100)までのRGBのデータをエクセルに送るやり方が分かりません。
 座標0:0~100:100のRGBを取得するのは、処理に負担がかかるため範囲を狭くしています。
 スペックのあるマシーンなら制約なしでも動作しますが、処理が終わるまでビジー状態になるためプログレスバーが必要になります。

>>>サンプルコード
'参照の追加を行う必要があります。詳しくは、注意点を参考にしてください。

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

'Excelファイルを保存するフルパスを指定してください。
        Dim strPathXls As String = "フルパスを指定してください"
        Dim bmpSample As Bitmap = PictureBox1.Image
        Dim xlsApp As New Excel.Application        
        Dim xlsBooks As Excel.Workbooks = xlsApp.Workbooks
        Dim xlsBook As Excel.Workbook = xlsBooks.Add
        Dim xlsSheets As Excel.Sheets = xlsBook.Worksheets
        Dim xlsSheet As Excel.Worksheet = xlsSheets.Item(1)
        Dim xlsCells As Excel.Range
        Dim xlsRange As Excel.Range
        xlsCells = xlsSheet.Cells
        '次のセルへ進む
        Const INT_CELL_NEXT = 1
        '列を1行目に戻す
        Const INT_ROW_BACK = 1
        '列
        Dim intRow As Integer = 1
        '行
        Dim intLine As Integer = 1


        For i As Integer = 0 To 10
            For j As Integer = 0 To 10
                xlsRange1 = DirectCast(xlsCells(intLine, intRow), Excel.Range)
                xlsRange1.Value = bmpSample.GetPixel(i, j).A.ToString
                LeaseObject(xlsRange1)
                intRow += INT_CELL_NEXT

                xlsRange1 = DirectCast(xlsCells(intLine, intRow), Excel.Range)
                xlsRange1.Value = bmpSample.GetPixel(i, j).R.ToString
                LeaseObject(xlsRange1)
                intRow += INT_CELL_NEXT

                xlsRange1 = DirectCast(xlsCells(intLine, intRow), Excel.Range)
                xlsRange1.Value = bmpSample.GetPixel(i, j).G.ToString
                LeaseObject(xlsRange1)
                intRow += INT_CELL_NEXT

                xlsRange1 = DirectCast(xlsCells(intLine, intRow), Excel.Range)
                xlsRange1.Value = bmpSample.GetPixel(i, j).B.ToString
                LeaseObject(xlsRange1)
                intRow = INT_ROW_BACK
                intLine += INT_CELL_NEXT
            Next
        Next

        xlsSheet.SaveAs(strPathXls)
        LeaseObject(xlsSheet)
        LeaseObject(xlsSheets)
        xlsBook.Close(False)
        LeaseObject(xlsBook)
        LeaseObject(xlsBooks)
        xlsApp.Quit()
        LeaseObject(xlsApp)
        Me.Close()

    End Sub


    Private Sub LeaseObject(Of T As Class)(ByRef objCom As T, Optional ByVal lease As Boolean = False)
        If objCom Is Nothing Then
            Return
        End If

        Try
            If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
                If lease Then
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
                Else
                    Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)

                    If 0 < count Then
                        Dim strMsg As String = "開放されていないオブジェクトがあります"
                        Dim strTitle As String = "オブジェクトの開放"
                        MessageBox.Show(strMsg, strTitle, MessageBoxButtons.OK, MessageBoxIcon.Warning)
                    End If
                End If
            End If
        Finally
            objCom = Nothing
        End Try
    End Sub

>>>注意点
①参照の追加を行う必要があります。
 プロジェクト(P)→参照の追加→COMタブ→Microsoft Excel ~(*1) Object Library
  *1 ~入る数字は、利用者の環境により変化します。
②strPathXls変数に、処理するExcelファイルのフルパスを指定する必要があります。
 OSがVistaの場合は、パスの指定場所に注意してください。
③参考程度にしてください。