none
Excel2000で文字列の下線 RRS feed

  • 全般的な情報交換

  • お世話になります。

    VisualBasic2005から以下のようなExcelを参照するプログラムを作っています
    下線の付いた文字列を出力したいのですがExcel2003では問題無く動作するのですが
    Excel2000では書き込まれはするのですがExcelのプロセスが開放されなくなってしまいます。
        objFont.Underline = xlUnderlineStyleSingle
    の一行を外せばプロセスは開放されるのですが。
    どうしても下線を表示したい場合、どのように記述したら宜しいのでしょうか?

    Borderオブジェクトを参照してもプロセスが開放されなくなります。
    罫線も出力したいです。

    何方か御指導下さいますよう、よろしくお願いいたします。

        Dim objSheet As Object
        Dim objCell As Object
        Dim objFont As Object

        objCell = objSheet.Cells(4, 27)
        objCell.FormulaR1C1 = "文字列:"
        objFont = objCell.Font
        objFont.Underline = xlUnderlineStyleSingle       '←
        objFont.Size = 13
        System.Runtime.InteropServices.Marshal.ReleaseComObject(objCell)
        objFont = Nothing
        System.Runtime.InteropServices.Marshal.ReleaseComObject(objFont)
        objCell = Nothing

    2009年3月26日 11:36

すべての返信

  •     objFont = Nothing
        System.Runtime.InteropServices.Marshal.ReleaseComObject(objFont)


    ここで ReleaseComObject を呼び出す前に Nothing を代入しているので、参照カウントがデクリメントされていないと思います。
    2009年3月26日 12:41
  • 大変申し訳ありませんでした
    記述ミスです。実際のコードは以下です
      System.Runtime.InteropServices.Marshal.ReleaseComObject(objFont)
      objFont = Nothing
      System.Runtime.InteropServices.Marshal.ReleaseComObject(objCell)
      objCell = Nothing

    しかし、下線だ罫線だでは無く
    ただテキストを書き出すだけでも量が多くなるとプロセスが開放されなくなっているようです
    回避策はありませんでしょうか?
    2009年3月27日 0:48
  • あるサイトでCellオブジェクトではなくRangeを使うべきだとの記述を見かけたので
    Rangeを使うようにしてみたら。Cellを使っていたときよりは多く出力出来るように
    なったのですが。
    それでも有る程度の量を出力すると、Excelプロセスが開放されなくなってしまいます。
    何故なのでしょう?

    2009年3月29日 12:59
  • Excel2000で試してみましたが問題なく開放されました。

    Dim objSheet As Object
    Dim objCell As Object
    Dim objFont As Object
    Dim objBorders As Object
    Dim objBorder As Object
    
    For r As Integer = 1 To 1000
        For c As Integer = 1 To 100
            objCell = objSheet.Cells(r, c)
            objCell.Value = r * c
            objFont = objCell.Font
            objFont.Underline = 2
            objFont.Size = 13
    
            objBorders = objCell.Borders
    
            objBorder = objBorders(7)
            objBorder.LineStyle = 1
            System.Runtime.InteropServices.Marshal.ReleaseComObject(objBorder)
    
            objBorder = objBorders(8)
            objBorder.LineStyle = 4
            System.Runtime.InteropServices.Marshal.ReleaseComObject(objBorder)
    
            System.Runtime.InteropServices.Marshal.ReleaseComObject(objBorders)
    
            System.Runtime.InteropServices.Marshal.ReleaseComObject(objFont)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(objCell)
    
            objBorder = Nothing
            objBorders = Nothing
            objFont = Nothing
            objCell = Nothing
        Next c
    Next r
    罫線無しテストでは100列×10000行でも開放できました。
    罫線有りテストでは100列×1000行でも開放できました。
    ある程度の量というのはどれくらいなのか・・・もっと多くの操作をしないと再現しませんか?
    2009年3月30日 10:40
  • 皆様
    お騒がせして申し訳ございません

    gekka様には、わざわざ実証までしていただき申し訳ございません
    全く当方のミスでした、このスレッド自体消したいです。
    2009年4月1日 9:12
  • こんにちは、フォーラムオペレータ大久保です。

    エリック さん、フォーラムのご利用ありがとうございます。
    何やらミスであったということなので、このスレッドは「コメント」に変更させていただきました。
    (せっかくの情報ですので、投稿自体は消しません)

    また何かありましたら、遠慮なくフォーラムをご利用ください!おまちしております。
    マイクロソフト株式会社 フォーラム オペレータ 大久保 直美
    2009年4月7日 6:36