Excelのデータ入力例色々(12個) (SNo.063) 1.R1C1形式で個々のセルへの入力例 (個々のセルへ値を入力するためのプロシージャ) 2.R1C1形式で範囲を指定してセルへの入力例 3.R1ToA1関数を使って個別のセルに入力する場合 (A1形式のアドレスをR1C1形式に変換する関数) 4.Address プロパティを使っての入力例 5.Address プロパティを使って範囲入力 6.Rows / Columns プロパティの使用方法 |
|
.NETからExcelの基本的な操作方法 を見てからご覧下さい。 こちらでは、VB6.0の時のような入力をする場合に合わせて色々プロシージャや関数を使って試して見ました。 ご使用時は、ご自分の環境でテストしてからお使い下さい。 又、サンプル投稿用掲示板のVB2010からExcelを操作するためのワンポイントテクニック集(VB.NET) も参考にして下さい。 |
|
使用コントロール | Button1 〜 Button6 |
その他条件 | WindowsVista VB2010(VS2010 Pro) Framework 4 / ターゲットCPU:X86 Excel 2007/Excel
2010 [Option Compare Text] [Option Explicit On] [Option Infer On] [Option Strict On]で設定 プロジェクト→参照の追加→COM→Microsoft Excel 12.0(14.0) ObjectLibrary を参照設定しておいてください。 Excel の起動・終了のコードは、.NETからExcelの基本的な操作方法 のExcel の起動・終了に関する設定(実装用)のコードかExcel の起動・終了に関する設定(テスト環境用)のコードを使用して下さい。 |
※ 下記コードの表示は、自作の【Excel Com
オブジェクトの解放漏れチェックツール】の結果を自作のツールでリッチテキストをHTMLファイルに変換した結果を掲載しております。 標準のIDE上のコードのカラー化に加え、Excel Com オブジェクト等もカラー化しております。 |
|
1.R1C1形式で個々のセルへの入力例 Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '=================================================================================================== 'R1C1形式で個々のセルへの入力例 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") '動作確認の為、2秒間表示しておく System.Threading.Thread.Sleep(2000) '=================================================================================================== 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(テスト環境用の場合のみ追加して下さい) Call ProcessCheck() '正常に動作する事が確認できたらこの行は、コメントにして下さい。 End Sub Private Sub SetdataCell(ByVal r As Integer, ByVal c As Integer, ByVal d As Object) 'R1C1形式で個々のセルへ値を入力するためのプロシージャ Dim xlCells As Excel.Range Dim xlRange As Excel.Range xlCells = xlSheet.Cells xlRange = DirectCast(xlCells(r, c), Excel.Range) xlRange.Value = d MRComObject(xlCells) MRComObject(xlRange) End Sub |
|
2.R1C1形式で範囲を指定してセルへの入力例 Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '=================================================================================================== 'R1C1形式で範囲を指定してセルへの入力例 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) & ":" & R1ToA1(16, 2) & ")" '計算式 ' セル (B15,B17) xlRange = xlSheet.Range(R1ToA1(15, 2) & ":" & R1ToA1(17, 2)) 'データの入力セル範囲 xlRange.Value = strDat 'セルへデータの入力 MRComObject(xlRange) '動作確認の為、2秒間表示しておく System.Threading.Thread.Sleep(2000) '=================================================================================================== 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(テスト環境用の場合のみ追加して下さい) Call ProcessCheck() '正常に動作する事が確認できたらこの行は、コメントにして下さい。 End Sub Private Function R1ToA1(ByVal r1 As Integer, ByVal c1 As Integer) As String 'R1C1形式のアドレスをA1形式に変換する関数 Dim s As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Dim A1 As String = "" If c1 < 1 Or c1 > 16384 Then 'Excel のバージョンに合せて下さい。 MessageBox.Show("指定が間違っています。") A1 = "A1" Return A1 End If If c1 <= 26 Then A1 = s.Chars(c1 - 1) & CStr(r1) ElseIf c1 <= 702 Then A1 = s.Chars(((c1 - 1) \ 26) - 1) & s.Chars(((c1 - 1) Mod 26)) & CStr(r1) Else A1 = s.Chars(((c1 - 703) \ 676)) & s.Chars((((c1 - 703) \ 26) Mod 26)) & _ s.Chars(((c1 - 1) Mod 26)) & CStr(r1) End If Return A1 End Function |
|
3.R1ToA1関数を使って個別のセルに入力する場合 Private Sub Button3_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button3.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '=================================================================================================== 'R1ToA1関数を使って個別のセルに入力する場合 Dim i As Integer Dim xlRange As Excel.Range For i = 1 To 255 'A1 〜 IU1 の範囲に連番を入力 xlRange = xlSheet.Range(R1ToA1(1, i)) xlRange.Value = i MRComObject(xlRange) '使い終わった時点でデクリメントした方が無難です。 Next i '動作確認の為、2秒間表示しておく System.Threading.Thread.Sleep(2000) '=================================================================================================== 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(テスト環境用の場合のみ追加して下さい) Call ProcessCheck() '正常に動作する事が確認できたらこの行は、コメントにして下さい。 End Sub |
|
4.Address プロパティを使っての入力例 Private Sub Button4_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button4.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '=================================================================================================== 'Address プロパティと Cells プロパティを使って個別入力 ' Button3 と同じ事をしていてもコードが複雑になるだけ Dim i As Integer Dim xlRange As Excel.Range Dim xlCells As Excel.Range Dim xlRange1 As Excel.Range Dim Col As String For i = 1 To 255 'A2 〜 IU2 の範囲に連番を入力 xlCells = xlSheet.Cells xlRange1 = DirectCast(xlCells(2, i), Excel.Range) Col = xlRange1.Address() '引数を使用しない方が解放されやすい xlRange = xlSheet.Range(Col) xlRange.Value = i MRComObject(xlRange) '使い終わった時点又は、参照先が変わった時点で直ちに MRComObject(xlRange1) 'デクリメントを必ずして下さい。 MRComObject(xlCells) Next i '動作確認の為、2秒間表示しておく System.Threading.Thread.Sleep(2000) '=================================================================================================== 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(テスト環境用の場合のみ追加して下さい) Call ProcessCheck() '正常に動作する事が確認できたらこの行は、コメントにして下さい。 End Sub |
|
5.Address プロパティを使って範囲入力 Private Sub Button5_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button5.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '=================================================================================================== 'Address プロパティを使って範囲入力 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 = DirectCast(xlCells(4, 1), Excel.Range) 'A4 Col1 = xlRange1.Address() MRComObject(xlRange1) 'ここも使い終ったら直ぐデクリメントしておく事 'ここで新たに受けているので、それまでの xlRange1 は、使用済みとなる xlRange1 = DirectCast(xlCells(6, 1), Excel.Range) 'A6 Col2 = xlRange1.Address() 'A4 〜 A6 の範囲に入力 xlRange = xlSheet.Range(Col1 & ":" & Col2) xlRange.Value = strDat MRComObject(xlCells) MRComObject(xlRange1) MRComObject(xlRange) '動作確認の為、2秒間表示しておく System.Threading.Thread.Sleep(2000) '=================================================================================================== 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(テスト環境用の場合のみ追加して下さい) Call ProcessCheck() '正常に動作する事が確認できたらこの行は、コメントにして下さい。 End Sub |
|
6.Rows / Columns プロパティの使用方法 Private Sub Button6_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button6.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '=================================================================================================== ' xlSheet.Rows(6).Select() 'これではプロセスが終了しない '----------------------------------------------------------------- 'Excel をアクティブにする(エクセルにフォーカスを移す。) AppActivate(xlApp.Caption) '必要ありませんが、見た目にわかりやすくする為に Dim xlRange As Excel.Range Dim xlRows As Excel.Range 'Cellsプロパティと同様に一旦 Range に受ける必要がある xlRows = xlSheet.Rows xlRange = DirectCast(xlRows(6), Excel.Range) xlRange.Select() MRComObject(xlRows) MRComObject(xlRange) System.Threading.Thread.Sleep(1000) '----------------------------------------------------------------- ' xlSheet.Columns(6).Select() 'これではプロセスが終了しない '----------------------------------------------------------------- Dim xlRange1 As Excel.Range Dim xlColumns As Excel.Range 'Cellsプロパティと同様に一旦 Range に受ける必要がある xlColumns = xlSheet.Columns xlRange1 = DirectCast(xlColumns(6), Excel.Range) xlRange1.Select() MRComObject(xlColumns) MRComObject(xlRange1) System.Threading.Thread.Sleep(1000) '------------------------------------------------------------------------------ 'xlSheet.Rows(1). 'この時点で候補がでてこない 'xlSheet.Rows.Select() 'これなら候補も表示されるがプロセスは終了しない '-------------------------------------------------------------------------------- Dim xlRows2 As Excel.Range Dim xlRange2 As Excel.Range xlRows2 = xlSheet.Rows xlRange2 = DirectCast(xlRows2(1), Excel.Range) xlRange2.Select() MRComObject(xlRange2) MRComObject(xlRows2) System.Threading.Thread.Sleep(1000) '上記よりも直接Rangeオブジェクトを使って下記のようにした方が解放されやすく簡単かと。 Dim xlRange3 As Excel.Range xlRange3 = xlSheet.Range("4:10") '4行目から10行目までを選択 xlRange3.Select() MRComObject(xlRange3) '動作確認の為、2秒間表示しておく System.Threading.Thread.Sleep(2000) '=================================================================================================== 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(テスト環境用の場合のみ追加して下さい) Call ProcessCheck() '正常に動作する事が確認できたらこの行は、コメントにして下さい。 End Sub |