エクセル出力世界最速の技だじょ | スヌーピーとジャンサン

スヌーピーとジャンサン

ある日突然、事務所にやってきたスヌーピーとジャンサンのブログです。
毎月一日には必ず吉備津神社にスヌーピーとお参りをしています。
22世紀にも吉備津神社を今と変わらず残したい・・・。

「スヌーピー」
【Japanese】
ぬぉぉぉー、おいらのあみ出したVB.NETからのExcel出力がけっこうすごかったみたいだから、
前回より改良してもう一度記事をUpしておくじょ。

VBからExcelへ出力すると、数値も文字列として認識されてしまうんだじょ。

例のセルを一回クリックすれば数値になるパターンだじょ。

しかし、これを1セルずつプログラムでしていくとデータ数が多い場合には、ものすごく時間が

かかってしまうじょ。

たいやきを食べながらでも待てない時間だじょ。

そこでおいらがあみだしたのがこの1行だじょ
 '1度貼り付けておいて
 xlRange.Value = iarData
再度その値を挿入するんだじょ。数字の文字列を数値にする多分世界最速の技だじょ
 xlRange.Value = xlRange.Value

【English】
I output to Excel from VB. , It is also recognized as a numeric string.
If you click on a numeric value once the cell.
However, when there are a large number of data, it takes a long time and we were terribly one cell to this program.

'Once I paste the data.
xlRange.Value = iarData
'I want to insert its value again.
xlRange.Value = xlRange.Value


''' <summary>
''' SnoopyExcelExport
''' </summary>
''' <param name="iTarget"></param>
''' <remarks></remarks> 
Private Sub ExcelExport()

    Dim dtTable As New DataTable
    dtTable.Clear()
    'ここで何んらかdtTableにデータを取得しておくこと

    'DataTableを二次元配列に格納する
    Dim sarData(dtTable.Rows.Count - 1, dtTable.Columns.Count - 1) As String
    For y As Integer = 0 To dtTable.Rows.Count - 1
        For x As Integer = 0 To dtTable.Columns.Count - 1
            sarData(y, x) = dtTable.Rows(y)(x).ToString()
        Next
    Next

    Dim xlApp As New Excel.ApplicationClass
    Dim xlBook As Excel.WorkbookClass
    Dim xlSheet As Excel.Worksheet
    Dim xlRange As Excel.Range = Nothing
    Dim xlRange1 As Excel.Range = Nothing
    Dim xlRange2 As Excel.Range = Nothing
    xlApp.Application.Visible = False 'Excelを非表示にする
    xlBook = xlApp.Workbooks.Add()
    xlSheet = xlBook.Worksheets(1)

    Try
        xlRange1 = DirectCast(irefSheet.Cells(1, 1), Excel.Range) '始点
        xlRange2 = DirectCast(irefSheet.Cells(1 + UBound(iarData), 1 + UBound(iarData, 2)), Excel.Range) '終点

        xlRange = irefSheet.Range(xlRange1, xlRange2) 'セル範囲
        xlRange.Value = sarData'貼り付け
        '数字の文字列を数値にする(多分世界最速の技)
        xlRange.Value = xlRange.Value

        '書式設定などはここでしておけば表示も大丈夫       
        xlRange = irefSheet.Columns("I:I")
        xlRange.NumberFormatLocal = "yyyy/mm/dd" '年月日
        xlRange = irefSheet.Columns("R:BE")
        xlRange.NumberFormatLocal = "#,##0;[赤]-#,##0" '通貨型
        xlRange = irefSheet.Columns("BB:BB")
        xlRange.NumberFormatLocal = "0.0%" 'パーセント

        'Excelを表示する
        xlApp.Application.Visible = True

    Catch ex As Exception

        'Throw
        MsgBox(Err.Description)

    Finally

        '使用したインスタンスは削除しておくこと
        SnoopyReleaseComObject(DirectCast(xlSheet, Object))
        SnoopyReleaseComObject(DirectCast(xlBook, Object))
        SnoopyReleaseComObject(DirectCast(xlApp, Object))
        SnoopyReleaseComObject(DirectCast(xlRange, Object))
        SnoopyReleaseComObject(DirectCast(xlRange1, Object))
        SnoopyReleaseComObject(DirectCast(xlRange2, Object))

    End Try

End Sub

''' <summary>
''' SnoopyReleaseComObject
''' </summary>
''' <param name="iTarget"></param>
''' <remarks></remarks>
Private Shared Sub SnoopyReleaseComObject(ByRef iTarget As Object)

    Try

        If Not iTarget Is Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(iTarget)
        End If

    Finally

        iTarget = Nothing

    End Try

End Sub