tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルエクセルへのテキストボックス描写方法
記事No11410
投稿日: 2015/04/25(Sat) 18:42
投稿者もとき
すみませんが、教えていただけないでしょうか?

VB2013 エクセル2013を使用しています。
エクセルへテキストボックスを複数個描写したいと思っています。
1つなら描写できますが、それ以上になるとエラーとなってしまいます。
また、エクセルの解放もできません。

始めたばかりで、いろいろなコードを参考させてもらいながら
作りましたが、エラーとなってしまいます。
よろしくお願いいたします。

Imports Microsoft.Office.Interop
Imports Microsoft.Office.Core
Imports System.Runtime.InteropServices

Public Class Form1
    Private Sub cmdOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOK.Click
        Dim FilePath As String
        FilePath = "D:\VB\excel1.xlsx"
        Dim xlApp As New Excel.Application
        Dim xlBooks As Excel.Workbooks
        Dim xlBook As Excel.Workbook
        Dim xlSheets As Excel.Sheets
        Dim xlSheet As Excel.Worksheet
        Dim xlShapes As Excel.Shapes
        Dim xlShape As Excel.Shape
        Dim xlTextBox As Excel.TextBox
        Dim TextBoxSu As Integer = 0
        Dim TextBoxColor As Integer = 0

        xlBooks = xlApp.Workbooks
        xlBook = xlBooks.Open(FilePath)
        xlSheets = xlBook.Worksheets
        xlSheet = CType(xlSheets("sheet1"), Excel.Worksheet)
        xlShapes = xlSheet.Shapes
         xlApp.Visible = False
        'Excelの警告メッセージを表示しない
        xlApp.DisplayAlerts = False

        For i As Integer = 0 To 100
            xlShape = xlSheet.Shapes.AddTextbox(MsoTextOrientation.msoTextOrientationHorizontal, _
                                                 100 + 100 * i, 100 + 100 * i, 100, 100)
            xlShape.Name = "textBoxName" & TextBoxSu
            '〇テキストボックスへテキスト追加
            xlTextBox = xlSheet.TextBoxes("textBoxName" & TextBoxSu)
            xlTextBox.Text = i
            MRComObject(xlShape)
            MRComObject(xlShapes)
            TextBoxSu += 1

            ' 〇テキストボックス(ライン色変更)
            xlTextBox.ShapeRange.Line.ForeColor.RGB = RGB(0, 0, 255)
            MRComObject(xlTextBox.ShapeRange)

            xlTextBox.ShapeRange.Line.Weight = 3 '太さ
            MRComObject(xlTextBox.ShapeRange)
            '〇テキストボックス フォント変更
            'xlTextBox.Font.Size = 15
            'MRComObject(xlTextBox.Font)

            '〇テキストボックス背景色変更
            xlTextBox.ShapeRange.Fill.ForeColor.SchemeColor = i
            MRComObject(xlTextBox.ShapeRange)
            MRComObject(xlTextBox)
        Next i
        xlBook.SaveAs(FilePath, FileFormat:=Excel.XlFileFormat.xlOpenXMLWorkbook)

        '▼終了処理
        MRComObject(xlShapes)
        MRComObject(xlSheet)              'xlSheet の解放
        MRComObject(xlSheets)              'xlSheets の解放
        xlBook.Close()                   'xlBook を閉じる
        MRComObject(xlBook)                'xlBook の解放
        MRComObject(xlBooks)               'xlBooks の解放
        xlApp.Quit()                       'Excelを閉じる
        MRComObject(xlApp)                 'xlApp を解放

        MessageBox.Show("保存しました", "メッセージ", MessageBoxButtons.OK, MessageBoxIcon.Information)

    End Sub
    '●エクセルの開放
    Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False)
        If objCom Is Nothing Then
            Return
        End If
        Try
            If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
                If force Then
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
                Else
                    Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
                End If
            End If
        Finally
            objCom = Nothing
        End Try
    End Sub


End Class

[ツリー表示へ]
タイトルRe: エクセルへのテキストボックス描写方法
記事No11411
投稿日: 2015/04/28(Tue) 07:53
投稿者花ちゃん
解放処理等の基本的な事が間違っておられるので、肝心なところのコードはほとんど書き直しが必要になります。
詳しく書いていると、このサイトに掲載している内容と同じになるので、下記をよく読んで、試して解らない
ところがあれば、改めて質問して下さい。

2.Excelのプロセスが正常に終了しない理由
   http://www.hanatyan.sakura.ne.jp/vb2005/vb2013excel01.htm#no2

それとデータ型等を理解されるまでは、Option Strict On でコードを書くようにして下さい。

[ツリー表示へ]
タイトルRe: エクセルへのテキストボックス描写方法
記事No11412
投稿日: 2015/04/29(Wed) 15:27
投稿者魔界の仮面弁士
> xlShape = xlSheet.Shapes.AddTextbox(
xlSheet.Shapes も変数に受けて、MRComObject で解放しましょう。


> MRComObject(xlTextBox.ShapeRange)
> xlTextBox.ShapeRange.Line.Weight = 3 '太さ
まだ利用するのであれば、そのオブジェクトは MRComObject してはいけません。
もう使うことが無くなったという時点で解放します。

また、プロパティ経由での COM オブジェクトの解放は避けましょう。
プロパティの値を一度変数に受け取り、それを扱うようにします。


> xlTextBox.ShapeRange.Line.ForeColor.RGB = RGB(0, 0, 255)
・ShapeRange プロパティ(ShapeRange クラス)
・Line プロパティ(LineFormat クラス)
・ForeColor プロパティ(ColorFormat クラス)
が解放対象です。


> xlTextBox.ShapeRange.Line.Weight = 3 '太さ
・ShapeRange プロパティ(ShapeRange クラス)
・Line プロパティ(LineFormat クラス)


> xlTextBox.ShapeRange.Fill.ForeColor.SchemeColor = i
・ShapeRange プロパティ(ShapeRange クラス)
・Fill プロパティ(FillFormat クラス)
・ForeColor プロパティ(ColorFormat クラス)

[ツリー表示へ]
タイトルRe^2: エクセルへのテキストボックス描写方法
記事No11413
投稿日: 2015/04/29(Wed) 18:29
投稿者もとき
ありがとうございました。
とても勉強になりました。

おかげさまで、エクセルは解放はできました。
本当にありがとうございます。

でも、やはり複数個の描写をさせようとした場合は、
エラーとなってしまいます。
どうか原因を、教えて頂けないでしょうか?


(エラー内容)「型 'System.Runtime.InteropServices.COMException' のハンドルされていない例外が mscorlib.dll で発生しました」
(発生場所) xlShape = xlShapes.AddTextbox(MsoTextOrientation.msoTextOrientationHorizontal, _
                                                 200, 100 + 100 * i, 100, 100)
       または、
        xlFont = xlTextBox.Font
             xlFont.Size = 12
      

Option Strict On
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Core
Imports System.Runtime.InteropServices

Public Class Form1
    Private Sub cmdOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOK.Click
        Dim FilePath As String
        FilePath = "D:\VB\excel1.xlsx"
        Dim xlApp As New Excel.Application
        Dim xlBooks As Excel.Workbooks
        Dim xlBook As Excel.Workbook
        Dim xlSheets As Excel.Sheets
        Dim xlSheet As Excel.Worksheet
        Dim xlShapes As Excel.Shapes
        Dim xlShape As Excel.Shape
        Dim xlTextBox As Excel.TextBox

        Dim xlShapeRange As Excel.ShapeRange
        Dim xlLine As Excel.LineFormat
        Dim xlColor As Excel.ColorFormat
        Dim xlFont As Excel.Font
        Dim xlFill As Excel.FillFormat

        Dim TextBoxSu As Integer = 0
        Dim TextBoxColor As Integer = 0

        xlBooks = xlApp.Workbooks
        xlBook = xlBooks.Open(FilePath)
        xlSheets = xlBook.Worksheets
        xlSheet = DirectCast(xlSheets.Item("sheet1"), Excel.Worksheet)
        xlShapes = xlSheet.Shapes

        'Excelを表示する
        'xlApp.Visible = True
        'Excelを表示しない
        xlApp.Visible = False
        'Excelの警告メッセージを表示しない
        xlApp.DisplayAlerts = False

        For i As Integer = 0 To 20
            xlShape = xlShapes.AddTextbox(MsoTextOrientation.msoTextOrientationHorizontal, _
                                                 200, 100 + 100 * i, 100, 100)
            xlShape.Name = "textBoxName" & TextBoxSu
            '〇テキストボックスへテキスト追加
            xlTextBox = DirectCast(xlSheet.TextBoxes("textBoxName" & TextBoxSu), Excel.TextBox)
            xlTextBox.Text = CStr(i)
            MRComObject(xlShape)
            TextBoxSu += 1

            ' 〇テキストボックス(ライン色変更)
            xlShapeRange = xlTextBox.ShapeRange
            xlLine = xlShapeRange.Line
            xlColor = xlLine.ForeColor
            xlLine.Weight = 3                   '太さ
            xlColor.RGB = RGB(0, 0, 255)        'ラインを青へ
            MRComObject(xlColor)
            MRComObject(xlLine)
            MRComObject(xlShapeRange)

            '〇テキストボックス フォント変更
            xlFont = xlTextBox.Font
            xlFont.Size = 12
            MRComObject(xlFont)

            '〇テキストボックス背景色変更
            xlShapeRange = xlTextBox.ShapeRange
            xlFill = xlShapeRange.Fill
            xlColor = xlFill.ForeColor
            xlColor.SchemeColor = i
            MRComObject(xlColor)
            MRComObject(xlFill)
            MRComObject(xlShapeRange)
            MRComObject(xlTextBox)
        Next i
        xlBook.SaveAs(FilePath, FileFormat:=Excel.XlFileFormat.xlOpenXMLWorkbook)

        '▼終了処理
        MRComObject(xlShapes)
        MRComObject(xlSheet)              'xlSheet の解放
        MRComObject(xlSheets)              'xlSheets の解放
        xlBook.Close(False)                'xlBook を閉じる
        MRComObject(xlBook)                'xlBook の解放
        MRComObject(xlBooks)               'xlBooks の解放
        xlApp.Quit()                       'Excelを閉じる
        MRComObject(xlApp)                 'xlApp を解放

        MessageBox.Show("保存しました", "メッセージ", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub
    '●エクセルの開放
    Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False)
        If objCom Is Nothing Then
            Return
        End If
        Try
            If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
                If force Then
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
                Else
                    Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
                End If
            End If
        Finally
            objCom = Nothing
        End Try
    End Sub
End Class

[ツリー表示へ]
タイトルRe^3: エクセルへのテキストボックス描写方法
記事No11414
投稿日: 2015/04/29(Wed) 20:48
投稿者魔界の仮面弁士
> エラーとなってしまいます。

以下、コードを試さずに回答しています。


> xlShapes = xlSheet.Shapes
TextBoxes も同様に処置した方が良い気が。


ただ、今回の作りで言うと、TextBoxes を辿って TextBox を取得しなおさなくても、
最初の Shape をそのまま利用してやれば、xlTextBox を使うことなく、
TextEffect プロパティから Text や FontSize を指定したり、
Line から ForeColor や Weight を指定することができそうです。Fill プロパティもかな。



> ' 〇テキストボックス(ライン色変更)
> xlShapeRange = xlTextBox.ShapeRange '★1
> xlLine = xlShapeRange.Line
(中略)
> MRComObject(xlLine)
> MRComObject(xlShapeRange)      '★2
>
> '〇テキストボックス背景色変更
> xlShapeRange = xlTextBox.ShapeRange '★3
> xlFill = xlShapeRange.Fill
(中略)
> MRComObject(xlFill)
> MRComObject(xlShapeRange)      '★4

上記の★1と★3は同一のオブジェクトですよね。

であれば、★2と★3の行ははずしておいてください。
★1を使いまわしてから最後に★4で処理すればよいわけで。

[ツリー表示へ]
タイトルRe^4: エクセルへのテキストボックス描写方法
記事No11415
投稿日: 2015/05/02(Sat) 01:32
投稿者もとき

本当にいろいろ、
教えて頂き、ありがとうございます。
アドバイスを参考に変更しました。(合っているでしょうか?)
ただ、複数個描写しようと思うと
やはり、エラーとなってしまいます。
申し訳ございませんが、教えて頂けないでしょうか?


Option Strict On
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Core
Imports System.Runtime.InteropServices

Public Class Form1
    Private Sub cmdOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOK.Click
        Dim FilePath As String
        FilePath = "D:\VB\excel1.xlsx"
        Dim xlApp As New Excel.Application
        Dim xlBooks As Excel.Workbooks
        Dim xlBook As Excel.Workbook
        Dim xlSheets As Excel.Sheets
        Dim xlSheet As Excel.Worksheet
        Dim xlShapes As Excel.Shapes
        Dim xlShape As Excel.Shape

        Dim xlLine As Excel.LineFormat
        Dim xlColor As Excel.ColorFormat
        Dim xlFill As Excel.FillFormat
        Dim xlTextEffect As Excel.TextEffectFormat

        Dim TextBoxSu As Integer = 0
        Dim TextBoxColor As Integer = 0

        xlBooks = xlApp.Workbooks
        xlBook = xlBooks.Open(FilePath)
        xlSheets = xlBook.Worksheets
        xlSheet = DirectCast(xlSheets.Item("sheet1"), Excel.Worksheet)
        xlShapes = xlSheet.Shapes

        'Excelを表示する
        'xlApp.Visible = True
        'Excelを表示しない
        xlApp.Visible = False
        'Excelの警告メッセージを表示しない
        xlApp.DisplayAlerts = False

        For i As Integer = 0 To 20
            xlShape = xlShapes.AddTextbox(MsoTextOrientation.msoTextOrientationHorizontal, _
                                                 200, 100 + 100 * i, 100, 100)
            xlShape.Name = "textBoxName" & TextBoxSu
            '〇テキストボックスへテキスト追加
            xlTextEffect = xlShape.TextEffect
            xlTextEffect.Text = Str(i)
            xlTextEffect.FontSize = 12   'フォントサイズ
            TextBoxSu += 1
            MRComObject(xlTextEffect)

            ' 〇テキストボックス(ライン色変更)
            xlLine = xlShape.Line
            xlColor = xlLine.ForeColor
            xlLine.Weight = 3                   '太さ
            xlColor.RGB = RGB(0, 0, 255)        'ラインを青へ
            MRComObject(xlLine)

            '〇テキストボックス背景色変更
            xlFill = xlShape.Fill
            xlColor.SchemeColor = 1
            MRComObject(xlColor)
            MRComObject(xlFill)
            MRComObject(xlShape)
        Next i

        '▼終了処理
        MRComObject(xlShapes)
        MRComObject(xlSheet)              'xlSheet の解放
        MRComObject(xlSheets)              'xlSheets の解放
        xlBook.Close(False)                'xlBook を閉じる
        MRComObject(xlBook)                'xlBook の解放
        MRComObject(xlBooks)               'xlBooks の解放
        xlApp.Quit()                       'Excelを閉じる
        MRComObject(xlApp)                 'xlApp を解放

        MessageBox.Show("保存しました", "メッセージ", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub
    '●エクセルの開放
    Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False)
        If objCom Is Nothing Then
            Return
        End If
        Try
            If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
                If force Then
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
                Else
                    Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
                End If
            End If
        Finally
            objCom = Nothing
        End Try
    End Sub
End Class

[ツリー表示へ]
タイトルRe^5: エクセルへのテキストボックス描写方法
記事No11419
投稿日: 2015/05/14(Thu) 13:08
投稿者shu
>
> 本当にいろいろ、
> 教えて頂き、ありがとうございます。
> アドバイスを参考に変更しました。(合っているでしょうか?)
> ただ、複数個描写しようと思うと
> やはり、エラーとなってしまいます。
> 申し訳ございませんが、教えて頂けないでしょうか?
>
どこでどのような時にどのような内容のエラーが発生するのでしょうか?

[ツリー表示へ]
タイトルRe^6: エクセルへのテキストボックス描写方法【解決】
記事No11427
投稿日: 2015/05/17(Sun) 22:46
投稿者もとき
> >
> > 本当にいろいろ、
> > 教えて頂き、ありがとうございます。
> > アドバイスを参考に変更しました。(合っているでしょうか?)
> > ただ、複数個描写しようと思うと
> > やはり、エラーとなってしまいます。
> > 申し訳ございませんが、教えて頂けないでしょうか?
> >
> どこでどのような時にどのような内容のエラーが発生するのでしょうか?

すみませんでした。
エラーが出なくなりました。

原因は、
今まで普通に立ち上がっていたエクセルが、
急にプロダクトキーの入力を聞いてくるようになった事だと思います。
解決後(急に聞いてこなくなりました)実行すると
エラーが出なくなりました。

本当にご迷惑おかけしました。
本当に勉強になりました。
ありがとうございました。

[ツリー表示へ]