| Excelのデータ入力例色々(12個) (SNo.063) 1.R1C1形式で個々のセルへの入力例 (個々のセルへ値を入力するためのプロシージャ) 2.R1C1形式で範囲を指定してセルへの入力例 3.R1ToA1関数を使って個別のセルに入力する場合 (A1形式のアドレスをR1C1形式に変換する関数) 4.Address プロパティを使っての入力例 5.Address プロパティを使って範囲入力 6.Rows / Columns プロパティの使用方法 7.ExcelをPrivateな変数で宣言しての起動処理 8.Excelファイルを上書き保存して終了処理 |
|
| .NETからExcelの基本的な操作方法 を見てからご覧下さい。 こちらでは、VB6.0の時のような入力をする場合に合わせて色々プロシージャや関数を使って試して見ました。 ご使用時は、ご自分の環境でテストしてからお使い下さい。又、このコードを使ってExcelのプロセスが終了しないかどうかのテストをされるのもいいかと思います。 私は、Excel の起動 → Commandボタンクリック→Excelの終了→プロセスが終了しているか確認 を繰り返してテストしております。 |
|
| 使用コントロール | Button1 〜 Button8 |
| その他条件 | WindowsXP(Vista) Visual Basic 2005(VB2008) 参照の追加でMicrosoft Excel **.* Object Library を追加しておいて下さい。 |
| 1.R1C1形式で個々のセルへの入力例 Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click 'R1C1形式で個々のセルへの入力例 xlApp.Visible = True Dim i, j As Integer For i = 5 To 12 '5行目〜12行目 For j = 3 To 8 'C列 〜 H列 Call SetdataCell(i, j, i + j) Next j Next i 'C13 に合計を表示 Call SetdataCell(13, 3, "=SUM(C5:C12") End Sub Private Sub SetdataCell(ByVal r As Integer, ByVal c As Integer, ByVal d As Object) '個々のセルへ値を入力するためのプロシージャ Dim xlCells1 As Excel.Range Dim xlRange1 As Excel.Range xlCells1 = xlSheet.Cells xlRange1 = xlCells1(r, c) xlRange1.Value = d MRComObject(xlCells1) MRComObject(xlRange1) End Sub |
|
| 2.R1C1形式で範囲を指定してセルへの入力例 Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click 'R1C1形式で範囲を指定してセルへの入力例 xlApp.Visible = True Dim xlRange As Excel.Range Dim strDat(2, 0) As Object strDat(0, 0) = "10" 'データの作成 strDat(1, 0) = "20" ' セル (B15,B16) strDat(2, 0) = "=SUM(" & R1ToA1(15, 2, 16, 2) & ")" '計算式 ' セル (B15,B17) xlRange = xlSheet.Range(R1ToA1(15, 2, 17, 2)) 'データの入力セル範囲 xlRange.Value = strDat 'セルへデータの入力 MRComObject(xlRange) End Sub Private Function R1ToA1(ByVal r1 As Integer, ByVal c1 As Integer, _ ByVal r2 As Integer, ByVal c2 As Integer) As String 'R1C1形式のアドレスをA1形式に変換する関数 Dim i1, i2 As Integer Dim d1, d2 As String i1 = Math.Floor((c1 - 1) \ 26) d1 = IIf(c1 > 26, Strings.Chr(64 + i1), "") i1 = c1 - 26 * i1 d1 &= Strings.Chr(64 + i1) & CStr(r1) i2 = Math.Floor((c2 - 1) \ 26) d2 = IIf(c2 > 26, Strings.Chr(64 + i2), "") i2 = c2 - 26 * i2 d2 &= Strings.Chr(64 + i2) & CStr(r2) Return d1 & ":" & d2 End Function 注意 上記関数は、Excel 2007 で703列以上を指定すると正しい値を返さないようです。 Excel 2007 以前は、列数が255列までに制限されているので問題ありません。 サンプル投稿用掲示板の方に新しい関数が投稿してありますので、そちらをご使用下さい。 |
|
| 3.R1ToA1関数を使って個別のセルに入力する場合 Private Sub Button3_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button3.Click 'R1ToA1関数を使って個別のセルに入力する場合 Dim i As Integer Dim xlRange As Excel.Range For i = 1 To 255 'A1 〜 IU1 の範囲に連番を入力 xlRange = xlSheet.Range(R1ToA1(1, i, 1, i)) xlRange.Value = i MRComObject(xlRange) Next i xlApp.Visible = True End Sub Private Function R1ToA1(ByVal r1 As Integer, ByVal c1 As Integer, _ ByVal r2 As Integer, ByVal c2 As Integer) As String 'R1C1形式のアドレスをA1形式に変換する関数 Dim i1, i2 As Integer Dim d1, d2 As String i1 = Math.Floor((c1 - 1) \ 26) d1 = IIf(c1 > 26, Strings.Chr(64 + i1), "") i1 = c1 - 26 * i1 d1 &= Strings.Chr(64 + i1) & CStr(r1) i2 = Math.Floor((c2 - 1) \ 26) d2 = IIf(c2 > 26, Strings.Chr(64 + i2), "") i2 = c2 - 26 * i2 d2 &= Strings.Chr(64 + i2) & CStr(r2) Return d1 & ":" & d2 End Function 注意 上記関数は、Excel 2007 で703列以上を指定すると正しい値を返さないようです。 Excel 2007 以前は、列数が255列までに制限されているので問題ありません。 サンプル投稿用掲示板の方に新しい関数が投稿してありますので、そちらをご使用下さい。 |
|
| 4.Address プロパティを使っての入力例 Private Sub Button4_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button4.Click 'Address プロパティを使って個別入力 Dim i As Integer Dim xlRange As Excel.Range Dim xlCells As Excel.Range Dim xlRange1 As Excel.Range xlCells = xlSheet.Cells Dim Col As String For i = 1 To 255 'A2 〜 IU2 の範囲に連番を入力 xlRange1 = xlCells(2, i) Col = xlRange1.Address(False, False) xlRange = xlSheet.Range(Col) xlRange.Value = i MRComObject(xlRange1) MRComObject(xlRange) Next i MRComObject(xlCells) xlApp.Visible = True End Sub |
|
| 5.Address プロパティを使って範囲入力 Private Sub Button5_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button5.Click 'Address プロパティを使って範囲入力 xlApp.Visible = True Dim xlRange As Excel.Range Dim strDat(2, 0) As Object strDat(0, 0) = "10" strDat(1, 0) = "20" strDat(2, 0) = "=SUM(A4:A5)" Dim Col1, Col2 As String Dim xlCells As Excel.Range Dim xlRange1 As Excel.Range xlCells = xlSheet.Cells xlRange1 = xlCells(4, 1) 'A4 Col1 = xlRange1.Address(False, False) MRComObject(xlRange1) xlRange1 = xlCells(6, 1) 'A6 Col2 = xlRange1.Address(False, False) 'A4 〜 A6 の範囲に入力 xlRange = xlSheet.Range(Col1 & ":" & Col2) xlRange.Value = strDat MRComObject(xlCells) MRComObject(xlRange1) MRComObject(xlRange) End Sub |
|
| 6.Rows / Columns プロパティの使用方法 Private Sub Button6_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button6.Click ' xlSheet.Rows(6).Select() 'これではプロセスが終了しない '----------------------------------------------------------------- Dim xlRange As Excel.Range Dim xlRows As Excel.Range xlRows = xlSheet.Rows xlRange = xlRows(6) xlRange.Select() MRComObject(xlRows) MRComObject(xlRange) '----------------------------------------------------------------- ' xlSheet.Columns(6).Select() 'これではプロセスが終了しない '----------------------------------------------------------------- Dim xlRange1 As Excel.Range Dim xlColumns As Excel.Range xlColumns = xlSheet.Columns xlRange1 = xlColumns(6) xlRange1.Select() MRComObject(xlColumns) MRComObject(xlRange1) '------------------------------------------------------------------------------ 'xlSheet.Rows(1). 'この時点で候補がでてこない 'xlSheet.Rows.Select() 'これなら候補も表示されるがプロセスは終了しない '-------------------------------------------------------------------------------- Dim xlRows2 As Excel.Range xlRows2 = xlSheet.Rows xlRows2.Select() MRComObject(xlRows2) End Sub |
|
| 7.ExcelをPrivateな変数で宣言しての起動処理 '---------- Private な変数の宣言 -----------------------------------
Private xlApp As Excel.Application Private xlBooks As Excel.Workbooks Private xlBook As Excel.Workbook Private xlSheets As Excel.Sheets Private xlSheet As Excel.Worksheet '---------- Excel ファイルの Open 処理 ------------------------------ Private Sub Button7_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button7.Click 'Excelの既存ファイルのオープン Call ExcelOpen(IO.Path.GetFullPath("..\..\Test.xls"), "Sheet1") End Sub Private Sub ExcelOpen(ByVal FilePath As String, ByVal SheetName As String) '既存のファイルのオープン処理用プロシージャ xlApp = New Excel.Application xlBooks = xlApp.Workbooks xlBook = xlBooks.Open(FilePath) xlSheets = xlBook.Worksheets xlSheet = xlSheets(SheetName) xlApp.Visible = True End Sub |
|
| 8.Excelファイルを上書き保存して終了処理 '---------- Excel ファイルの終了時の処理 ------------------------------ Private Sub Button8_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button8.Click 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath("..\..\Test.xls"), False) 'False の場合保存しないで終了 End Sub Private Sub ExcelClose(ByVal FilePath As String, Optional ByVal CancelSave As Boolean = True) 'Excelファイルを上書き保存して終了処理用プロシージャ xlApp.DisplayAlerts = False '保存時の問合せのダイアログを非表示に設定 If CancelSave Then xlSheet.SaveAs(FilePath) 'ファイルに保存 End If MRComObject(xlSheet) 'xlSheet の解放 MRComObject(xlSheets) 'xlSheets の解放 xlBook.Close() 'xlBook を閉じる MRComObject(xlBook) 'xlBook の解放 MRComObject(xlBooks) 'xlBooks の解放 xlApp.Quit() 'Excelを閉じる MRComObject(xlApp) 'xlApp を解放 End Sub '今まで使っていた方法では、Option Strict On の時にエラーとなったので、下記の '魔界の仮面弁士さんの投稿を使用させて頂きました。詳しくは、下記リンク参照願います。 'デクリメントするだけが目的なら、その場で、ReleaseComObject だけを実施して下さい。 'http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=6370#6374 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 Dim count As Integer = System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom) If count <> 0 Then 'この部分は、動作確認用コードです。(実使用では必要ありません) MessageBox.Show("COM オブジェクトが解放されていません。") End If Else Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom) If count <> 0 Then 'この部分は、動作確認用コードです。(実使用では必要ありません) MessageBox.Show("COM オブジェクトが解放されていません。") End If '0 になる事を期待(使い終った)していたなら、force = True で試して見て下さい。 End If End If Finally objCom = Nothing End Try End Sub Private Sub Form1_Closed(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Closed 'Excel が終了していない場合は Excel を終了 If Not xlApp Is Nothing Then Call ExcelClose(IO.Path.GetFullPath("..\..\Test.xls"), False) End If End Sub |
|
| あまりにも掲示板に質問が多いので、ReleaseComObject 処理の仕方やセルへのデータ入力方法のテスト結果を載せておきます。 各自の使用条件にあった方法でご利用下さい。 |
|