QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

Excelシートのセルを変数で指定したいのですけれど

VB.net(2003)でExcelシートに罫線を
xlSheet.Range("A30:K30").Borders(7).LineStyle = 1
のような記述で引きたいのですけれど
"A30:K30" を変数で指定したいのですけれど、思ったように指定出来ません。
どのようにしたら良いのでしょうか?

質問者:初心者です

回答

未記入さんの書き込み (2006-07-04 15:15) より:

VB.net(2003)でExcelシートに罫線を xlSheet.Range("A30:K30").Borders(7).LineStyle = 1 のような記述で引きたいのですけれど "A30:K30" を変数で指定したいのですけれど、思ったように指定出来ません。

"A30:K30" はリテラル文字列です。

変数で表すと、
 Dim s As Strng = "A30:K30"
です。

おそらく、そんなことを伺っているのではないかと思いますが、
上記の文章からですと、'どのように' 指定したいのかがわからないです。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

説明不足で申し訳ありません。
"A30:K30"を

Dim s As Strng  (sはA30の変数)
Dim x As Strng  (xはK30の変数)

のように定義した変数 s x に
プログラムでセルを指定して、罫線を引くようにしたいのですけれど。

初心者の為、うまく説明が出来ないのですけれど、
よろしくお願いします。

投稿者:初心者です

編集 履歴 (0)

説明不足で申し訳ありません。

"A30:K30"を

Dim s As Strng  (sはA30の変数)

Dim x As Strng  (xはK30の変数)

のように定義した変数 s x に

プログラムでセルを指定して、罫線を引くようにしたいのですけれど。

上記のようには指定する方法は知りませんが、



Range(Cells(RowIndex,ColumnIndex),Cells(RowIndex,ColumnIndex)

というふうに指定できますよ。

投稿者:salf

編集 履歴 (0)

未記入さんの書き込み (2006-07-04 15:37) より:

"A30:K30"を

Dim s As Strng  (sはA30の変数)

Dim x As Strng  (xはK30の変数)

のように定義した変数 s x に

プログラムでセルを指定して、罫線を引くようにしたいのですけれど。

Strng とは文字列のことでしょうか?

文字列であるならば、結局のところ、
 Dim s As String = "A30"
 Dim x As String = "K30"
 Dim xlRange As Excel.Range = xlSheet.Range(s & ":" & x)
という意味になっちゃいますけど、そんなことがしたいわけではないですよね?

それと、

VB.net(2003)で

と書いてありますが、Excel へのアクセスは何で行っているんでしょうか?
COM Interop (Microsoft Excel xx.x Object Library) の場合、

xlSheet.Range("A30:K30").Borders(7).LineStyle = 1

このような書き方は危険です。
メモリリークを起こし、Excel のプロセスが解放されなくなります。

# これは、何度か書かせて頂いていることですので、詳細は検索すれば見つかると思います。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

回答ありがとうございます。
  MRComObject(xlSheet) 'xlSheet の解放
MRComObject(xlSheets) 'xlSheets の解放
MRComObject(xlBook) 'xlBook の解放
MRComObject(xlBooks) 'xlBooks の解放
MRComObject(xlApp) 'xlApp を解放
のような記述で解放はおこなっていますけれど、
  xlSheet.Range("A30:K30").Borders(7).LineStyle = 1
このような記述で罫線を引くのは危険なのでしょうか?
(検索をおこなったのですけれど、詳細がわからなかったので
 参照先等 教えてください)

また、
正しい罫線の引き方の参照先等 お手数ですけれど、教えてください。

投稿者:初心者です

編集 履歴 (0)

未記入さんの書き込み (2006-07-04 17:29) より:

xlSheet.Range("A30:K30").Borders(7).LineStyle = 1

このような記述で罫線を引くのは危険なのでしょうか?

COM オブジェクトなのですから、Excel.Worksheet だろうと、Excel.Range だろうと同じことです。

MRComObject(xlSheet) 'xlSheet の解放

MRComObject(xlSheets) 'xlSheets の解放

MRComObject(xlBook) 'xlBook の解放

MRComObject(xlBooks) 'xlBooks の解放

MRComObject(xlApp) 'xlApp を解放

これらと同様に、参照カウントをデクリメントしなければなりません。

# ところで、MRComObject というメソッドは、花ちゃんさんのサイトから引用したものですね?
# コメントがあるので、何をしているのか大体わかりますが...

正しい罫線の引き方の参照先等 お手数ですけれど、教えてください。

そういうわけで、他の COM オブジェクトと '同じ扱い' をするだけで良いです。
現状そうしているであろう、xlApp, xlBooks, xlBook, xlSheets, xlSheet のように、
参照を取り、System.Runtime.InteropServices.Marshal.ReleaseComObject メソッドで解放してください。

# 本題の、セルの位置指定の件は、あんなもので宜しかったのでしょうか...?

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

本題の、セルの位置指定の件は、アドバイスを参考にさせて頂き
出来るようになりました。
ありがとうございました。

投稿者:初心者です

編集 履歴 (0)

本題の方で、少し気になるところがありましたので投稿します。

salfさんの書き込み (2006-07-04 15:54) より:




    Range(Cells(RowIndex,ColumnIndex),Cells(RowIndex,ColumnIndex)

というふうに指定できますよ。

この方法は VBA 的な方法ですね。

質問者さんは VB7.1 から実装していますから、VSTO だとしてもコンパイル エラーになります。

今回は、COM Interop を使用していますから、
この方法で、コンパイル エラーを失くし、COM 参照の解放も加味すると、
かなり面倒臭い実装になってしまい、逆効果かもしれませんね。

Excel.Worksheet までの道のりはカットして、一部抜粋しますと、




    Dim xlCells As Excel.Range

    Try
        xlCells = xlWorksheet.Cells
        Dim xlCell1 As Excel.Range

        Try
            xlCell1 = xlCells(1, 1)
            Dim xlCell2 As Excel.Range

            Try
                xlCell2 = xlCells(5, 5)
                Dim xlRange As Excel.Range

                Try
                    xlRange = xlCells.Range(xlCell1, xlCell2)
                    xlRange.Select()
                Finally
                    If Not xlRange Is Nothing Then
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                    End If
                End Try
            Finally
                If Not xlCell2 Is Nothing Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCell2)
                End If
            End Try
        Finally
            If Not xlCell1 Is Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCell1)
            End If
        End Try
    Finally
        If Not xlCells Is Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells)
        End If
    End Try

このようになります。(;^-^)

これは、COM Interop だからという理由が大きいです。
つまり、反論ではなく参考までの投稿ということでお願いします。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

未記入さんの書き込み (2006-07-04 17:29) より:

(検索をおこなったのですけれど、詳細がわからなかったので参照先等 教えてください)

罫線を引くには、「Excel.Border」 あたりを使うことになるのはご存知かと思います。
この、「Excel.Border」 で検索すると、下記スレッドがヒットします。

  何度も出ているExcelプロセスの件です。

ここの、xlBorders 付近を見ると良いです。

ここから、Excel.Border を取得する場合は、Excel.Borders から参照を取る必要があります。
Excel.Border も Excel.Borders も、'使用した分' COM 参照のデクリメントをする必要があるからです。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。