tagCANDY CGI VBレスキュー(花ちゃん) - VB2010からExcelを操作するためのワンポイントテクニック集(VB.NET) - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VB2010からExcelを操作するためのワンポイントテクニック集(VB.NET)
元に戻る スレッド一覧へ 記事閲覧
このページ内の検索ができます。(AND 検索や OR 検索のような複数のキーワードによる検索はできません。)

VB2010からExcelを操作するためのワンポイントテクニック集(VB.NET) [No.319の個別表示]
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2013/02/14 10:06
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:VBA,Excel2007,Excel2010,エクセル,サンプル,Tips,VBからExcelを操作    *
* キーワード:VB2010 から Excel を操作,VB.NET から Excel VBA を操作,マクロ,VB.NET *
***********************************************************************************
 VB2010 から Excel 2007/Excel 2010 を操作する為の基本的な方法を
 色々紹介していきたいと思います。
 下記サンプルをご利用される場合は、>>2 の注意事項をご覧になってからできる限り、
 表示順にご覧下さい。

 ※ 表示項目等が多いので、最上部の[検索ボックス]にキーワードを入力して検索して
   調べて見て下さい。

===================================================================================
参考
  1.エクセル−バージョン別新機能については、下記サイトに詳しく掲載されています。
     http://www.civil-design.net/free/data/excel/new/00.html

  2.自作ツールの【Excel Com オブジェクトの解放漏れチェックツール(480)】(有料サンプル集に付属)
     http://www.hanatyan.sakura.ne.jp/dotnet/excelcom.htm

===================================================================================


     ----------------------- 目  次 --------------------------
>>1 Excel の起動・終了に関する設定(このサンプルを試す場合は必須です。)
   1. Excel のオープン処理用プロシージャ
    ・新規のファイルを開いて Excel を起動する場合
    ・既存のファイルを開いて Excel を起動する場合
   2. Excel ファイルの保存及び終了処理用プロシージャ
    ・保存時の問合せのダイアログを非表示に設定する方法
    ・上書き保存する方法
    ・ファイル名を付けて保存する方法
    ・保存ファイルの拡張子に合せて、Excelの保存形式を変更
    ・使用した Book や Excel を閉じる
   3. ComObject の解放処理用プロシージャ
    ・魔界の仮面弁士 さんの投稿サンプルを使用させて頂いて、テスト環境用に
     解放状況をメッセージボックスに表示するように設定しております。
   4. タスクマネージャに、Excel.exe が残っていないか確認するプロシージャ
      5. タスクマネージャに、残っている Excel.exe を強制終了する(テスト環境でのみ使用可)
   6. Excel のイベントを VB2010 上で取得する
   7. VB2010 から Excel を操作中は、ユーザーが勝手に EXcel を閉じれないように設定

>>2 VB2010からExcelを操作(サンプル集含む)するための注意事項

>>3 VB2010 から Excel へのデータの入力処理及び起動・終了処理例
   1. Excel のオープン処理用プロシージャ の使用例
    ・新規のファイルを開いて Excel を起動する
   2. 単純なデータの入力と計算式の入力例
   3. 2次元配列データの入力例
   4. 1次元配列データの入力(For Each...Next ステートメントを使った)例
    ・2次元配列データを1次元配列に格納
   5. 1次元配列データを指定セル位置に入力
   6. Excel の終了処理用プロシージャの使用例
 
>>4 VB2010 から Excel 上のデータをコピー&ペースト
   1. Excel の指定のセルの値をクリップボード上にコピーする
   2. クリップボード上のデータをExcel の指定のセルにペーストする

>>5 VB2010 から Excel のセルの背景色を設定
   1. 塗りつぶしのパターンと色を設定する
   2. 塗りつぶしのパターンと色を現在のカラー パレットのインデックス番号または定数で設定
   3. 塗りつぶし等のカラーを設定法色々
   4. Excel のカラーインデックス値の一覧表
   5. セルの色(内部色)を標準にする
   6. せるの色を明るく、または暗くする
   7. 網掛けパターンに濃淡を設定する

>>6 VB2010 から Excel のセルにグラデーションを設定
   1. Excel のオブジェクトの型が不明の時に型を調べる方法

>>7 VB2010 から Excel のセルの文字色を設定
   1. 指定セル内の文字をすべて指定の色に設定する場合
   2. 指定セル内の指定の文字だけを指定の色に設定する場合

>>8 VB2010 から Excel のセルのフォントの設定
   1. 指定セル内の文字をすべて指定のフォントに設定する場合
   2. 指定セル内の指定の文字だけを指定のフォントに設定する場合
   3. 指定セル内の指定の文字のフォント名を変更する
   4. 指定セル内の指定の文字のフォントスタイルを変更する
   5. 指定セル内の指定の文字のフォントを上付き文字に設定する
   6. 指定セル内の指定の文字のフォントを下付き文字に設定する
   7. 指定セル内の指定の文字のフォントをアウトライン フォントに設定する
   8. 指定セル内の指定の文字のフォントを影付きフォントに設定する
   9. 指定セル内の指定の文字のフォントをテーマのフォントに設定する

>>9 VB2010 から Excel のセルの表示形式を設定
   1. セルの書式設定の表示形式を文字列に設定する
   2. セルの書式設定の表示形式を数値にし桁区切りに設定する
   3. セルの書式設定の表示形式を日付に設定する

>>10 VB2010 から Excel のセル上に画像を表示及び拡大・縮小
   1. Pictureオブジェクト(隠しオブジェクト)を使っての表示
   2. Web 上の画像を指定して、Pictureオブジェクト(隠しオブジェクト)を使っての表示
   3. Web 上の画像を指定して、Shapes.Add メソッドを使っての表示
     (図がリンク オブジェクトとして挿入されるのを回避)
   4. 画像をクリップボード経由で指定セル位置へ貼付け
   5. セル上の画像を拡大表示(1.25 = 拡大率(1.25倍)で指定)
   6. セル上の画像を縮小表示

>>11 VB2010 から Excel の指定位置に図形(オートシェイプ等)の描画及び削除
   1. Worksheet 上に雲形吹き出しを描画
   2. Worksheet 上にブロック矢印を描画
   3. Worksheet 上に終端が三角形の矢印を描画
   4. Worksheet 上に図形を個別に削除する場合
   5. Worksheet 上の全て図形を削除する場合
   6. オートシェイプ(ブロック矢印)の背景色と前景色を設定する

>>12 複数のCSVファイルを1つのBook内の複数のWorksheet上に読み込む

>>13 VB2010 から Excel の Worksheet の列幅を取得・列幅を設定
   1. Worksheet の指定の列幅を文字数単位で取得
   2. Worksheet の指定の列幅をポイント単位で取得
   3. Worksheet の指定の列(A列〜X列)の列幅を5(文字)に設定
   4. セル内の文字列長に合せて列幅を自動調整

>>14 VB2010 から Excel の Worksheet の行の高さを設定・行の高さを自動調整
   1. Worksheet の行の高さをポイント単位で設定
   2. Worksheet の行の高さを文字の高さに合せて自動調整

>>15 VB2010 から Excel の Worksheet の使用済みのセル範囲を取得
   1. 指定のセル位置を含む空白行と空白列に囲まれた最小のセル範囲を取得
   2. Activateなセル("A1")があるActivateセル領域を選択
   3. Address プロパティで選択範囲を A1 形式で取得
   4. Worksheet 上の使用済みのセル範囲を取得

>>16 R1C1形式をA1形式に変換する関数及びその使用例
   1. 整数で指定した列番号を英字の列番号に変換する(10,1378)→("AZZ10")
   2. MessageBox がエクセルの裏に隠れるのを防止する

>>17 A1形式をR1C1形式に変換する関数及びその使用例
   1. A1形式をR1C1形式に変換する関数(計算式で求める方法) "AZZ200" → (200 , 1378)
   2. A1形式をR1C1形式に変換する関数(Address 関数を使った方法) "A2:AZZ200" → (2,1,200,1378)

>>18 VB2010 から Excel の Worksheet 上で行・列・セルの挿入及び削除
   1. R1ToA1 関数を使ってのデーターの入力例
   2. 4行目と5行の間に1行挿入します。4方法
   3. 4列目と5列の間に1列挿入します。3方法
   4. C列の5行目にセルを挿入
   5. C列の3行目のセルの右に挿入
   6. 5行目を削除
   7. 5列目を削除
   8. C列の5行目のセルを削除

>>19 指定のセルが指定の範囲内(共有セル範囲内)にあるか、どうかを調査

>>20 Excel のシート数・シート名の取得及びシートの追加・削除
   1. シート(Worksheet)数の取得
   2. 新規にシート(Worksheet)を追加
   3. シート(Worksheet)の名前を取得
   4. シート(Worksheet)の名前を変更
   5. シート(Worksheet)を削除
   6. シート(Worksheet)名の一覧を取得
   7. 新規にBook を開いた時に表示したいシート(Worksheet)数を設定

>>21 VB2010 から Excel のワークシート関数を使用する
   1. 指定セル範囲内のデータの個数を取得
   2. 指定セル範囲内のデータの最小値を取得
   3. 指定セル範囲内のデータの最大値を取得
   4. 指定セル範囲内のデータの合計を取得
   5. 指定セル範囲内のデータの平均値を取得

>>22 VB2010 から Excel の表の縦横の合計を求める
   1. セル領域のアドレス(A1:E6)を取得しR1C1 形式のアドレス(1,1,6,5)に変換
   2. 行(列)の合計を求めるセル位置を求める
   3. 行(列)の合計(計算式)を求める
   4. 計算式をコピーする範囲を求める

>>23 Excel の指定列のデータから重複しないデータを抽出
   1. データリストからオートフィルターを使って重複したものを除いたリストだけを抽出
   2. 抽出したデータ件数を取得
   3. 抽出したデータを個別に取得

>>24 VB2010 から Excel の並べ替え(ソート)を実行する
   1. セル領域のアドレス(A1:E6)を取得しR1C1 形式のアドレス(1,1,6,5)に変換
    ・選択範囲の開始位置を整数で求める   A1 → 1,1
    ・選択範囲の終了位置を整数で求める E6 → 6,5
   2. 該当セル内で見つかったら、セル内に複数存在するか調べる
   3. 見つかった文字列の位置を取得する
   4. 見つかった文字列を赤色で太字で表示する

>>25 VB2010 から Excel の選択範囲内で指定文字を連続検索
   1. 1 〜 100 までのランダムなデーターを作成
   2. Range オブジェクトの Sort メソッド を使っての並べ替え
    ・セル範囲 "A1:J20" を B 列をキー(列単位)に降順の並べ替え
   3. Excel 2007 〜 の Sort オブジェクト を使っての並べ替え
        ・B 列を基準に、値 を基準に、昇順で、テキストを数値データとして並べ替えます。

>>26 VB2010 から Excel のシートの指定の範囲のデータを取得
   1. Count プロパティで指定範囲のセルの個数を取得
   2. 指定範囲内のセルの値を1次元配列に確保
   3. 取得したデータを VB2010 のリストボックスに表示する
   4. 取得したデータを VB2010 のテキストボックスに表示する
   5. 選択範囲内のデータをクリップボード経由でVB2010 のテキストボックスに表示する

>>27 VB2010 から Excel の既存のファイルを印刷
   1. 既存のファイルをオープンして、Excel を起動
   2. ページ設定ダイアログボックスを表示
   3. 印刷プレビューを表示
   4. シートの印刷設定
    ・用紙サイズを設定
    ・印刷の向きを設定
    ・各余白をセンチ(Cm)単位で設定
    ・印刷部数を設定

>>28 VB2010 から Excel のシートの指定範囲を印刷する
   1. 指定範囲を格子で罫線を引く
     罫線を引く場合は、下記を参照して下さい。
     http://www.hanatyan.sakura.ne.jp/dotnet/Excel06.htm#no3 
   2. PageSetup.PrintArea プロパティを使って指定範囲を設定して印刷

>>29 VB2010 から Excel の印刷プレビューの画面を閉じる
   1.  現在表示している Excel のタイトルを取得する
   2.  指定ミリ秒後にバックグラウンド操作の実行を開始
   3.  印刷プレビューを表示する
   4.  タイトル名を指定して Excel のウィンドウハンドルを取得
   5.  現在使用している Excel をアクティブにする
   6.  Excel に Excel のショートカットキーを送り、印刷プレビューを閉じる

>>30 Excel 2010 で印刷中のダイアログを非表示にして印刷(テスト版)

>>31 Excel 2010 で行列を入れ替え及び型式を指定して保存
   1. セル A1 を含むデータ入力範囲をコピー
   2. コピーしたデータを Sheet2 のセル A1 に行と列を入れ替えて貼り付け
    ・Sheet1 のデータを Sheet2 に形式を指定して貼り付け
   3. xls 形式で名前をつけて保存(Excel 97〜2003 ブック形式
   4. xlsx 形式で名前をつけて保存(Excel 2007〜ブック形式)
   5. xlsm 形式で名前をつけて保存(Excel 2007〜マクロ有効ブック形式)
   6. csv 形式で名前をつけて保存(CSV (カンマ区切り) 形式)    

>>32 VB2010 から Excel のセルに関する操作、1行 Tips 集その1
   1.単一セルを参照する場合(セル A1 に値を書き込む)
   2.離れた単一セルを参照する場合(セル A3 と D1 と C2 に値を書き込む)
   3.セル範囲を参照する場合(セル A1 〜 C3 の範囲を選択します)
   4.離れたセル範囲を参照する場合(セル A1〜C3 と A6〜C9 と E〜H4 の範囲を選択します)
   5.1列全体を参照する場合(C 列全体を選択します)
   6.複数列全体を参照する場合(C列 〜 D列まで と F列 と H列 をそれぞれ選択します)
   7.1行全体を参照する場合(2行目全体を選択します)
   8.複数行全体を参照する場合(4行目〜6行目と9行目〜6行目と12行目を選択します)
   9.Worksheet.Cells プロパティを使って全セルを参照する
   10.Range.Cells プロパティを使ってセルを参照する
   11.セルに値を設定する
   12.セルの値を取得する
   13.セルに数式を設定する
   14.セルの数式を取得する
      15.AutoFill メソッドを使ってセルに連続してデータを入力する

>>33 VB2010 から Excelのセルに関する操作(Addressプロパティの使用例)
   1.セル(範囲)のアドレスを取得する
   2.セルのアドレスを A1 形式で取得する
   3.セルのアドレスを R1C1 形式で取得する
   4.セルのアドレスを絶対参照で取得する
   5.セルのアドレスを相対参照で取得する
   6.セルのアドレスを自作メソッドを使って取得する

>>34 VB2010 から Excel のセルに関する操作、1行 Tips 集その2
   2.アクティブ セル領域(空白行と空白列で囲まれたセル範囲)を取得
    ・CurrentRegion プロパティの使用例

   3.現在のセルに対して相対的な位置を指定・取得
    ・Offset プロパティの使用例

   4.対象となるセルが含まれる領域の終端のセルを取得
         (End + 方向キー (↑、↓、←、→のいずれか) に相当します。)
    ・セル範囲 A1:E6 に対するセル位置 D3 からの左端のセル位置取得
    ・セル範囲 A1:E6 に対するセル位置 D3 からの右端のセル位置取得
    ・セル範囲 A1:E6 に対するセル位置 D3 からの上端のセル位置取得
    ・セル範囲 A1:E6 に対するセル位置 D3 からの下端のセル位置取得
    ・指定のセルが含まれる指定領域内の終端セルを取得する自作メソッド
    ・Range.End プロパティの使用例

   5.指定されたワークシートで使われたセル範囲を取得
    ・指定されたワークシートで使われたセル範囲を取得する自作メソッド
    ・UsedRange プロパティ

   6.指定のセル範囲から指定した列数、行数分のセル範囲にサイズ変更する、変更されたセル範囲を取得
    ・CurrentRegion プロパティの使用例
    ・Range.Resize プロパティの使用例
    ・指定セル範囲の行数を取得する(Rows.Count)
    ・指定セル範囲の列数を取得する(Columns.Count)
    ・MergeArea プロパティの使用例

   7.セルを結合(マージ)する
    ・Merge メソッドの使用例

   8.指定のセル位置の結合セル範囲を取得する
    ・指定のセル位置の結合セル範囲を取得する
    ・MergeArea プロパティの使用例

   9.指定のセル範囲に結合セルが含まれているかどうかを調べる
    ・MergeCells プロパティの使用例
    10.使用されたセル範囲内の最後のセルを取得
    ・指定のシート内での使用済みの最後のセル位置を取得する
    ・表示形式が設定されているセル位置を取得する
    ・条件の設定が含まれているセル位置を取得する
    ・コメントが含まれているセル位置を取得する
    ・定数が含まれているセル位置を取得する  
    ・数式が含まれているセル位置を取得する
    ・同じ表示形式が設定されているセル位置を取得する
    ・同じ条件の設定が含まれているセル位置を取得する
    ・すべての可視セル位置を取得する
    ・SpecialCells メソッドの使用例

   11.指定のセル範囲内の空白のセルに、0 を代入する。
    ・指定範囲内の空白のセルの個数を取得する

>>35 VB2010 から Excel のセルに関する操作、1行 Tips 集その3
   1.Range オブジェクトの色々な、Clear メソッドを試す
    ・Range.Clear メソッド (オブジェクト全体をクリアします。)
    ・Range.ClearContents メソッド(選択範囲から数式と文字を削除します。)
    ・Range.ClearFormats メソッド(オブジェクトの書式設定を削除します。)

   2.セル(セル範囲)をコピー及び貼り付ける
   3.セル(表全体)をコピー及び貼り付ける
   4.セル(セル範囲)を移動する
   5.セル(表全体)をを移動する
   6.形式を選択して貼り付け
   7.セルのエラー値を取得する

>>36 VB2010 から Excel のセルにコメントを挿入及びコメント操作色々
   1.Excel のセルにコメントを挿入及びコメント操作色々
    ・Range.AddComment メソッド を使って、範囲にコメントを追加
    ・Range.NoteText メソッド を使って、Range オブジェクトの左上隅のセルに
     関連付けられているコメントを設定
    ・指定のコメントを表示
    ・すべてのコメントを表示
    ・セル範囲を指定してコメントを削除
    ・記入しているコメントを全て削除

>>37 VB2010 から Excel の表示処理速度を向上及び検索
   1.画面の更新を停止して表示処理速度を向上させる   
   2.Excel 上での一般的な検索処理

>>38 VB2010から Excel のマクロを作成し実行する
   1.VB2010 から Excel の標準モジュールにマクロのコードを書き込む
   2.VB2010 から Excel のマクロを実行する
   3.VB2010 から Excel の標準モジュール内のマクロのコードを削除する


  使用コントロール類と配置図(画像をクリックすると元のサイズで見る事ができます。)
メンテ

Page: 1 |

Excel の起動・終了に関する設定(VB.NET)  (No.1の個別表示) [スレッド一覧へ]
日時: 2012/06/13 08:36
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:VBA,Excel,Comオブジェクト,解放処理,起動,エクセル,終了,既存ファイル  *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.05
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel の起動・終了に関する設定色々
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

動作確認:WindowsVista / Windows 7 /  Excel 2007/2010   VB2010 / Framework 4 / ターゲットCPU:X86
[Option Compare Text] [Option Explicit On] [Option Infer On] [Option Strict On]で設定
プロジェクト→参照の追加→COM→Microsoft Excel 12.0(14.0) ObjectLibrary を参照設定しておいてください。
'---------------------------------------------------------------------------------------------------

'下記でエラーの波線が表示されたなら、プロジェクト→参照の追加→.NETタブ→から参照追加して下さい。
'下記の部分もバージョンに注意して下さい。(Excel 2007 〜用になっています。)
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Core
Imports System.Runtime.InteropServices
'Imports Microsoft.Vbe.Interop

Public Class Form1

#Region "Form1_Load 時の設定"

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
   'Form を右下の邪魔にならない位置に表示(お好みで設定して下さい)
   Dim w As Integer = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width
   Dim h As Integer = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height
   Me.Top = h - Me.Height - 35
   Me.Left = w - Me.Width - 25
   'メッセージボックス等がExcelの裏に隠れないようにする為に
   Me.TopMost = True
End Sub

#End Region

#Region "Excel の起動・終了に関する設定"

'---------- 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

Private Sub ExcelOpen(ByVal FilePath As String, ByVal SheetName As String)
'Excel のオープン処理用プロシージャ
   xlClose = False   '起動中は、ユーザが Excel を閉じれないように
   xlApp = New Excel.Application
   'Excel の WorkbookBeforeClose イベントを取得
   AddHandler xlApp.WorkbookBeforeClose, AddressOf xlApp_WorkbookBeforeClose

   xlBooks = xlApp.Workbooks
   If FilePath.Length = 0 Then
      '新規のファイルを開く場合
      xlBook = xlBooks.Add
      xlSheets = xlBook.Worksheets
      xlSheet = DirectCast(xlSheets.Item(1), Excel.Worksheet)
   Else
      '既存のファイルを開く場合
      xlBook = xlBooks.Open(FilePath)
      xlSheets = xlBook.Worksheets
      xlSheet = DirectCast(xlSheets(SheetName), Excel.Worksheet)
   End If
   xlApp.Visible = True
End Sub

Private xlClose As Boolean    'ユーザが Excel を閉じようとしたかのフラグ

Private Sub xlApp_WorkbookBeforeClose(ByVal Wb As Excel.Workbook, ByRef Cancel As Boolean)
'VB2010 から Excel の WorkbookBeforeClose イベントを監視してユーザが Excel を閉じれないようにする
   If xlClose = False Then
      Cancel = True        'ユーザが Excel を閉じれないように
   Else
      Cancel = False    'プログラム上から指定の場合は、閉じる
   End If
End Sub

Private Sub ExcelClose(ByVal FilePath As String, Optional ByVal CancelSave As Boolean = True)
'Excelファイルを上書き保存して終了処理用プロシージャ
   xlClose = True                'プログラムからExcel を閉じた時のフラグ
   xlApp.DisplayAlerts = False   '保存時の問合せのダイアログを非表示に設定
   If CancelSave Then
      Dim kts As String = System.IO.Path.GetExtension(FilePath).ToLower()
      Dim fm As Excel.XlFileFormat
      '拡張子に合せて保存形式を変更(使用する Excel のバージョンに注意)
      Select Case kts
         Case ".csv"    'CSV (カンマ区切り) 形式
            fm = Excel.XlFileFormat.xlCSV
         Case ".xls"    'Excel 97〜2003 ブック形式
            fm = Excel.XlFileFormat.xlExcel8
         Case ".xlsx"   'Excel 2007〜ブック形式
            fm = Excel.XlFileFormat.xlOpenXMLWorkbook
         Case ".xlsm"   'Excel 2007〜マクロ有効ブック形式
            fm = Excel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled
         Case Else      '必要なものは、追加して下さい。
            fm = Excel.XlFileFormat.xlWorkbookDefault
            MessageBox.Show("ファイルの保存形式を確認して下さい。")
      End Select
      Try
         xlBook.SaveAs(Filename:=FilePath, FileFormat:=fm)    'ファイルに保存
      Catch ex As Exception
         MessageBox.Show(ex.Message)
      End Try
   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

Private Sub ProcessCheck()
'タスクマネージャに、Excel.exe が残っていないか確認(テスト環境でのみ使用の事)
   Dim st As Integer = System.Environment.TickCount
   '以前は、Loop しながら5秒間程繰り返し確認していたのだが、その間に解放される場合が
   'ある事が判明したので、下記のように1回きりの確認でもデクリメント処理がキチンと
   '行われていたら解放される事が解ったので下記のように厳密に判定する事にしました。
   System.Threading.Thread.Sleep(500)
   Application.DoEvents()
   If Process.GetProcessesByName("Excel").Length = 0 Then
      '先にフォームを閉じるとエラーが発生するので
      '必要により表示するなりコメントにして下さい。
      MessageBox.Show(Me, "Excel.EXE は解放されました。")
      Exit Sub
   End If
   If Process.GetProcessesByName("Excel").Length >= 1 Then
      Dim ret As DialogResult
      ret = MessageBox.Show(Me, "まだ Excel.EXE が起動しています。強制終了しますか?", _
                                                      "確認", MessageBoxButtons.YesNo)
      If ret = Windows.Forms.DialogResult.Yes Then
         Dim localByName As Process() = Process.GetProcessesByName("Excel")
         Dim p As Process
         '起動中のExcelを取得
         For Each p In localByName
            'Windou の無い(表示していない)Excel があれば強制終了させる
            '画面に表示している Excel は、終了させないので必要なら手動で終了して下さい。
            If System.String.Compare(p.MainWindowTitle, "", True) = 0 Then
               'Excel.EXE のプロセスを削除
               p.Kill()
            End If
         Next
      End If
   End If
End Sub

Public Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False)
   Dim IDEEnvironment As Boolean = False  'メッセージボックスを表示させたい場合は、True に設定
   If objCom Is Nothing Then
      If IDEEnvironment = True Then
         'テスト環境の場合は下記を実施し、後は、コメントにしておいて下さい。
         MessageBox.Show(Me, "Nothing です。")
      End If
      Return
   End If
   Try
      If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
         Dim count As Integer
         If force Then
            count = System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
         Else
            count = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
         End If
         If IDEEnvironment = True AndAlso count <> 0 Then
            Try
               'テスト環境の場合は下記を実施し、後は、コメントにしておいて下さい。
               MessageBox.Show(Me, TypeName(objCom) & " 要調査! デクリメントされていません。")
            Catch ex As Exception
               MessageBox.Show(Me, " 要調査! デクリメントされていません。")
            End Try
         End If
      Else
         If IDEEnvironment = True Then
            'テスト環境の場合は下記を実施し、後は、コメントにしておいて下さい。
            MessageBox.Show(Me, "ComObject ではありませんので、解放処理の必要はありません。")
         End If
      End If
   Finally
      objCom = Nothing
   End Try
End Sub

#End Region

End Class
メンテ
VB2010からExcelを操作(サンプル集)するための注意事項(VB.NET)  (No.2の個別表示) [スレッド一覧へ]
日時: 2013/02/14 10:04
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:VBA,Excel,Comオブジェクト,解放処理,エクセル,定数,タスクマネージャ   *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.05
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010からExcelを操作(サンプル集含む)するための注意事項
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

※ 気が付いたことを逐次、追加書き込みしておりますので、順不同となっており見難いかとは思いますが
  ご了承願い、[このページの検索]等の検索機能を活用して見て下さい。

1.VB2010からExcelを操作するためのワンポイントテクニック集 に掲載されているサンプルを
  操作(試す)する場合は、必ず、 >>1 の Excel の起動・終了に関する設定 のコードを
  使用して下さい。
  ※ 終了時の処理の中のテスト環境のコードは絶対に実装しないで下さい。
  実装される場合は、下記のコードを使って下さい。
  http://www.hanatyan.sakura.ne.jp/dotnet/Excel01.htm
  
2.基本的な事は、http://www.hanatyan.sakura.ne.jp/dotnet/Excel08.htm 等にかいておりますので、
  必ずご覧になってから、これらのサンプルをご利用願います。

3.開発環境は、VB2010 / Excel 2007 /Excel 2010 で作成し、動作確認を行っておりますので、ご使用の
  バージョンによっては、エラーが表示するかもしれませんので、その節は、ご使用のバージョンに合わせて
  変更願います。

4.未掲載の操作方法等について調べる場合は、Excel 上でマクロの記録ができるものは、マクロの記録を
  取ってそのコードを見て下さい。

5.VBA での操作例のサンプルや VB6.0 から Excel を操作するためのサンプルは、Net 上に多く掲載されて
  いるのでそれらを参考にして下さい。

6.解らない事は、VBA のヘルプ使って調べて下さい。
  Excel を起動して、メニューの【開発】→【Visual Basic】をクリックすると VBA の IDE の画面が
  表示されますので、質問欄に記入して検索するか、【ヘルプ】をクリックして調べて下さい。
  ※ 同じ名前の、メソッドやプロパティであっても、使用するオブジェクトによって、引数が違ったり
    定数が違ったりする場合がありますので、その辺もよく確認するようにして下さい。
  例、Workbook.SaveAs メソッド 、Worksheet.SaveAs メソッド 、SaveAs メソッド 等のようなもの

  又、上記ヘルプは、下記のようにすれば、単独で使用できますので便利かと思います。
  http://www.hanatyan.sakura.ne.jp/dotnet/vbahelp.htm

7.Excel の定数を調べるには、下記の【★ Excelの定数の調べ方】をご覧下さい。
  http://www.hanatyan.sakura.ne.jp/dotnet/Excel03.htm#teisuu
  VBA での定数名が解っている場合は、オブジェクトブラウザから定数名を検索すれば簡単に探せます。
  (VB2010 の IDE 上の画面から【F2】キーを押すとオブジェクトブラウザが表示されますので、検索
  ボックスに定数名を入力して検索して見て下さい。)

8・解放処理の確認は、Excel 2007 以上で VB2010(Framework 4) が条件となります。
  VB2008 や VB2005 では、ReleaseComObject の仕様が変更されているので、各自ご自分の環境上で
  確認して下さい。
    又、下記のようなツールを作成してチェックすると一目瞭然で、解放漏れや問題個所が判別できます。
  
 ★自作ツールの【Excel Com オブジェクトの解放漏れチェックツール(480)】(有料サンプル集に付属)
  http://www.hanatyan.sakura.ne.jp/dotnet/excelcom.htm

    上記ツールのテスト用のコードですが、これを見ればどのようなコードが問題かも解ります。
  http://www.hanatyan.sakura.ne.jp/dotnet/comtest.htm

9.このサンプルは、実行時バインディング(レイトバインディング)では、使用しないで下さい。
  Excel が解放されなくなります。
  又、このサンプルを参考にしたり、掲示板で質問されるレベルの方は、参照設定を外して Excel を操作
  されると、Excel が解放されなくなり、原因もご自分で判断できない事になりますので、せめて動作確認中は、
  事前バインディング(アーリーバインディング)で操作するようにして下さい。


10.VBA のサンプルを掲載している主なサイト
  インストラクターのネタ帳 → Excel 2003 の仕様・制限値
  http://www.relief.jp/itnote/archives/000579.php

  Excel2007図解説明 → Excel 2007 ワークシートとブックの仕様と制限
  http://www.excel-img.com/system01.html
  
  moug モーグ → Excel VBA テクニック (テクニック数 728)
  http://www.moug.net/tech/exvba/

  ミコの黄色いおうち
  http://park11.wakwak.com/~miko/miko.htm

  Excelでお仕事!「VBA基本」メニュー
  http://www.asahi-net.or.jp/~ef2o-inue/menu/menu04.html
  Excelでお仕事!「VBA応用」メニュー
  http://www.asahi-net.or.jp/~ef2o-inue/menu/menu05.html

  【Excel VBA サンプル集】- ExcelVBA@Workshop
  http://excel.style-mods.net/tips_vba/index.htm

  Tips箪笥 VBA Tips
  http://www.geocities.co.jp/SiliconValley/4805/vbatips/vbatips000.htm

  後は、[VBA サンプル] 等をキーワードにして検索してみて下さい。

11.当サイト内でのExcel 関係のサンプルの掲載ページ
  トップページ   http://www.hanatyan.sakura.ne.jp/index.html の左のフレーム内のメニューの
  VB2005〜関係専用 http://www.hanatyan.sakura.ne.jp/dotnet/index.html のメニューの
  Excel・Word・他 をクリックして下さい。

  トップページ   http://www.hanatyan.sakura.ne.jp/index.html の左のフレーム内のメニューの
  VB6.0関係専用   http://www.hanatyan.sakura.ne.jp/vbhlp/index.html のメニューの
  Excel & Word関係 をクリックして下さい。

  エクセルVBAキーワードリファレンス集
  http://www.hanatyan.sakura.ne.jp/vbhlp/excel10.htm

    このサンプル投稿用掲示板にも色々投稿してありますので、カテゴリ別表示 内から探して下さい。

12.事前バインディング(アーリーバインディング)で操作していると変数の型を指定する必要があるが
  変数の型が解らない場合は、下記のようにして調べて下さい。

  Excel2007のShape.TextFrame2.TextRangeの型が分かりません の 魔界の仮面弁士 さんの回答
  http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=9387#9390

13.掲載サンプルは、修正・追加等を逐次行っておりますので、最新のものをご覧下さい。
メンテ
VB2010 から Excel へのデータの入力処理例(VB.NET)  (No.3の個別表示) [スレッド一覧へ]
日時: 2012/06/09 15:38
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel.Range,配列データ,エクセル,エクセルシートに入力    *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.05
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel へのデータの入力処理及び起動・終了処理例
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '========================== データの入力処理 =================================

   '-------------------- マクロの記録を取った場合 ----------------------------
   'ActiveCell.FormulaR1C1 = "10"
   'Range("A2").Select()
   'ActiveCell.FormulaR1C1 = "20"
   'Range("A3").Select()
   'ActiveCell.FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)"
   'Range("A4").Select()
   '--------------------------------------------------------------------------
   '1.単純なデータの入力と計算式の入力例
   Dim xlRange As Excel.Range
   Dim strDat(2, 0) As Object
   xlRange = xlSheet.Range("A1:A3")    'データの入力セル範囲
   strDat(0, 0) = "10"                 'データの作成
   strDat(1, 0) = "20"
   strDat(2, 0) = "=Sum(A1:A2)"        '計算式
   xlRange.Value = strDat              'セルへデータの入力
   MRComObject(xlRange)

   '上記の他、下記のリンク先のサンプルを参考にして下さい。
   'http://www.hanatyan.sakura.ne.jp/dotnet/Excel01.htm
   'http://www.hanatyan.sakura.ne.jp/dotnet/Excel07.htm

   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '--------------------------------------------------------------------------
   '2.2次元配列データの入力例
   Dim xlRange1 As Excel.Range = Nothing
   Dim dat(20, 4) As String
   For r As Integer = 0 To 20
      For c As Integer = 0 To 4
         dat(r, c) = Str(r + 1) & "," & Str(c + 1)
      Next
   Next
   xlRange1 = xlSheet.Range("A1:D20")
   xlRange1.Value = dat
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)
   '入力したデータを削除
   xlRange1.Value = ""
   MRComObject(xlRange1)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '--------------------------------------------------------------------------
   '3.1次元配列データの入力(For Each...Next ステートメントを使った)例
   Dim xlRange2 As Excel.Range = Nothing
   Dim xlElement As Excel.Range = Nothing
   Dim dat1(0) As String
   Dim n As Integer = -1
   '2次元配列データを1次元配列に格納
   For r As Integer = 1 To 20
      For c As Integer = 1 To 4
         n += 1
         ReDim Preserve dat1(n)
         dat1(n) = Str(r) & "," & Str(c)
      Next
   Next
   xlRange2 = xlSheet.Range("A1:D20")
   Dim no As Integer = -1
   'For Each...Next ステートメントを使って、1次元配列を2次元配列に表示
   For Each xlElement In xlRange2
      no += 1
      xlElement.Value = dat1(no)    '仮データを表示(順番にも注目)
      'xlElement の参照先が変更されたのだからデクリメントする必要がある
      MRComObject(xlElement)
   Next
   MRComObject(xlRange2)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '4.1次元配列データを指定位置に入力
   Dim xlRange3 As Excel.Range = Nothing
   xlRange3 = xlSheet.Range("G1:G20")
   no = -4
   For Each xlElement In xlRange3
      no += 4
      xlElement.Value = dat1(no)    '仮データを表示(順番にも注目)
      MRComObject(xlElement)        'ここも同様に直ちにデクリメントを
   Next
   MRComObject(xlRange3)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()  '正常に動作する事が確認できたらこの行は、コメントにして下さい。
End Sub


実行結果、【Excel.EXE は解放されました。】とメッセージボックスが表示されたら、OK です。
 それ以外のメッセージボックスが表示された場合は、コードを確認して下さい。
(この事は各サンプル共通で今後この事は記入しません。)
メンテ
VB2010からExcel上のデータをコピー&ペースト(VB.NET)  (No.4の個別表示) [スレッド一覧へ]
日時: 2012/06/06 18:54
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel.Range,マクロ,エクセル,コピー,ペースト,貼り付け    *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.05
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel 上のデータをコピー&ペースト
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '========================== Excel 上でコピー&ペースト =======================

   '-------------------- マクロの記録を取った場合 ----------------------------
   'ActiveCell.FormulaR1C1 = "あいうえお"
   'Range("A1").Select
   'Selection.Copy
   'Range("D1").Select
   'ActiveSheet.Paste
   '--------------------------------------------------------------------------
   '上記マクロは、下記のように書き換えます。
   'ActiveCell とか Selection とか ActiveSheet のような不特定のオブジェクトを
   '指しているものは、VB からは使用しないようにして下さい。(トラブルの元になります。)
   Dim xlRange As Excel.Range
   xlRange = xlSheet.Range("A1")
   xlRange.Value = "あいうえお"
   '指定のセルのデータをクリップボードへコピーする
   xlRange.Copy()
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   'クリップボードの内容を指定のシートの指定のセルに貼り付ける
   'xlSheet.Paste(xlSheet.Range("D1"))     'これは、間違った使用例です。(解放されなくなる)
   '確認のために、1秒間表示しておく
   'System.Threading.Thread.Sleep(1000)

   '正しくは、
   Dim xlPasteRange As Excel.Range = xlSheet.Range("D2")
   xlSheet.Paste(xlPasteRange)
   MRComObject(xlPasteRange)
   'のように一度変数に受けて下さい。
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()  '正常に動作する事が確認できたらこの行は、コメントにして下さい。
End Sub
メンテ
VB2010からExcelのセルの背景色を設定(VB.NET)  (No.5の個別表示) [スレッド一覧へ]
日時: 2012/05/29 09:06
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:網掛けパターン,エクセル,セルの背景色,塗りつぶし,カラーインデックス  *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.05
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel のセルの背景色を設定
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '========================== セルの背景色を設定 ===============================

   '-------------------- マクロの記録を取った場合 ----------------------------
   'ActiveCell.FormulaR1C1 = "あいうえお"
   'Range("B2").Select()
   'With Selection.Interior
   '   .Pattern = xlSolid
   '   .PatternColorIndex = xlAutomatic
   '   .Color = 65535
   '   .TintAndShade = 0
   '   .PatternTintAndShade = 0
   'End With
   '--------------------------------------------------------------------------
   'Excel の定数を調べるには、>>2 の5.Excel の定数を調べるには の項をご覧下さい。
   Dim xlRange As Excel.Range
   xlRange = xlSheet.Range("B2")
   xlRange.Value = "あいうえお"    '仮データの表示
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   Dim xlInterior As Excel.Interior
   xlInterior = xlRange.Interior
   With xlInterior
      '塗りつぶしのパターンと色を表す、xlPattern クラスの定数を設定
      '検索キーワード [MSDN XlPattern 列挙型]  http://tinyurl.com/7bwazhr
      .Pattern = Excel.XlPattern.xlPatternSolid
      '塗りつぶしのパターンと色を現在のカラー パレットのインデックス番号または定数で設定
      'XlColorIndex クラスの xlColorIndexAutomatic または xlColorIndexNone です
      .PatternColorIndex = Excel.Constants.xlAutomatic
      '塗りつぶし等のカラーを設定下記のどの方法でも可
      '.Color = 65535            '明るい黄色
      '.Color = QBColor(14)      '明るい黄色
      .Color = RGB(255, 255, 0)  '明るい黄色
      '.Color = Color.Yellow     '明るい黄色
      ' カラーインデックス値の一覧表
      ' http://hanatyan.sakura.ne.jp/samplepic/excel-1-1.gif
      '.ColorIndex = 6           '明るい黄色
      '.ColorIndex = Excel.XlColorIndex.xlColorIndexNone  'セルの色(内部色)を標準にする
      '色を明るく、または暗くする単精度浮動小数点型 (-1 〜 + 1 の範囲の Single) の値を設定
      .TintAndShade = 0
      '網掛けパターンに濃淡を設定(TintAndShade と同様の設定値)塗りつぶしの場合は無視される
      '.PatternTintAndShade = 0
   End With
   MRComObject(xlInterior)
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010 から Excel のセルにグラデーションを設定(VB.NET)  (No.6の個別表示) [スレッド一覧へ]
日時: 2012/06/06 18:57
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel.Range,マクロ,エクセル,セルにグラデーション,背景色   *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.05
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel のセルにグラデーションを設定
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '======================== セルにグラデーションを設定 =========================

   Dim xlRange As Excel.Range
   xlRange = xlSheet.Range("B2")
   xlRange.Value = "あいうえお"
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   Dim xlInterior As Excel.Interior
   xlInterior = xlRange.Interior
   Dim xlLinearGradient As Excel.LinearGradient
   Dim xlColorStops As Excel.ColorStops
   '塗りつぶしのパターンと色を表す、xlPattern クラスの定数を設定
   '検索キーワード [MSDN XlPattern 列挙型]  http://tinyurl.com/7bwazhr
   xlInterior.Pattern = Excel.XlPattern.xlPatternLinearGradient
   '型が不明の時は、下記のようにして調べる
   'Debug.Print(TypeName(.Gradient))    ' LinearGradient
   xlLinearGradient = DirectCast(xlInterior.Gradient, Excel.LinearGradient)
   xlColorStops = xlLinearGradient.ColorStops
   'グラデーションの塗りつぶしにおける直線の角度(0〜360の範囲)
   '左→右にグラデーション
   xlLinearGradient.Degree = 0
   Dim xlColorStop1 As Excel.ColorStop
   Dim xlColorStop2 As Excel.ColorStop
   xlColorStops.Clear()
   xlColorStop1 = xlColorStops.Add(0)
   xlColorStop2 = xlColorStops.Add(1)
   xlColorStop1.Color = Color.Red      '開始時の色
   xlColorStop2.Color = Color.Yellow   '終了時の色
   'このようにここまで掘り下げて変数に受けてデクリメントしないと解放されない
   MRComObject(xlColorStop2)
   MRComObject(xlColorStop1)
   MRComObject(xlColorStops)
   MRComObject(xlLinearGradient)
   MRComObject(xlInterior)
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)
   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub

上記サンプルの実行結果の図
http://www.hanatyan.sakura.ne.jp/samplepic/excelbut4_1.png
メンテ
VB2010からExcelのセルの文字色を設定(VB.NET)  (No.7の個別表示) [スレッド一覧へ]
日時: 2012/06/06 18:59
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel.Range,マクロ,エクセル,セルの文字色を設定,前景色     *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.05
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel のセルの文字色を設定
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '========================== セルの文字色を設定 ===============================

   '-------------------- マクロの記録を取った場合 ----------------------------
      '同じ色の場合
      'ActiveCell.FormulaR1C1 = "あいうえお"
      'Range("C2").Select()
      'With Selection.Font
      '   .Color = -16776961
      '   .TintAndShade = 0
      'End With

      '個別に指定する場合
      'Range("E2").Select()
      'ActiveCell.FormulaR1C1 = "あいうえお"
      'With ActiveCell.Characters(Start:=3, Length:=1).Font
      '   .Color = -16776961
      'End With
   '--------------------------------------------------------------------------

   '指定セル内の文字色を全て赤色に設定
   Dim xlRange As Excel.Range
   Dim xlFont As Excel.Font
   xlRange = xlSheet.Range("B2")
   xlRange.Value = "あいうえお"
   xlFont = xlRange.Font
   xlFont.Color = Color.Red
   MRComObject(xlFont)
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '指定セル内の左から3文字目を赤色に設定
   xlRange = xlSheet.Range("D2")
   xlRange.Value = "あいうえお"
  ' Debug.Print(TypeName(xlRange.Characters(Start:=3, Length:=1)))    'Characters 
   'Characters で s がついてはいるがデフォルトのプロパティがないので
   Dim xlCharacters As Excel.Characters
   xlCharacters = xlRange.Characters(Start:=3, Length:=1)
   xlFont = xlCharacters.Font
   xlFont.Color = Color.Red
   MRComObject(xlFont)
   MRComObject(xlCharacters)
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010からExcelのセルのフォントを設定(VB.NET)  (No.8の個別表示) [スレッド一覧へ]
日時: 2012/05/29 09:25
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel 2010,フォントスタイル,エクセル,セルのフォントを設定 *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.05
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel のセルのフォントの設定
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button6_Click(sender As System.Object, e As System.EventArgs) Handles Button6.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '========================== セルのフォントの設定 =============================

   '-------------------- マクロの記録を取った場合 ----------------------------
      'Range("C2").Select()
      'ActiveCell.FormulaR1C1 = "あいうえお"
      'With ActiveCell.Characters(Start:=3, Length:=1).Font
      '   .Name = "MS 明朝"
      '   .FontStyle = "太字"
      '   .Size = 15
      '   .Strikethrough = False  
      '   .Superscript = False  
      '   .Subscript = False
      '   .OutlineFont = False  
      '   .Shadow = False    、
      '   .Underline = xlUnderlineStyleNone
      '   .ThemeColor = xlThemeColorLight1
      '   .TintAndShade = 0
      '   .ThemeFont = xlThemeFontNone
      'End With
   '--------------------------------------------------------------------------

   Dim xlRange As Excel.Range
   xlRange = xlSheet.Range("C2")
   xlRange.Value = "あいうえお"
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   Dim xlCharacters As Excel.Characters
   xlCharacters = xlRange.Characters(Start:=2, Length:=3)
   Dim xlFont As Excel.Font
   xlFont = xlCharacters.Font
   With xlFont
      .Name = "MS 明朝"
      'フォント スタイルを設定(文字列型 (String) の値を使用)
      .FontStyle = "太字 斜体"
      .Size = 15
      .Strikethrough = True      '取り消し線
      .Superscript = False       'True の場合、対象となるフォントが上付き文字になります
      .Subscript = False         'True の場合、対象となるフォントは下付き文字になります
      .OutlineFont = False       'True の場合、フォントをアウトライン フォントにします
      .Shadow = True             'True の場合、フォントを影付きフォントに、
      'フォントに付いている下線の種類を設定()
      .Underline = Excel.XlUnderlineStyle.xlUnderlineStyleSingle
      '指定されたオブジェクトに適用する配色のテーマ(カラーを設定)
      .ThemeColor = Excel.XlThemeColor.xlThemeColorAccent2
      '色を明るく、または暗くする
      .TintAndShade = 0
      '指定されたオブジェクトに適用するテーマのフォントを設定()
      .ThemeFont = Excel.XlThemeFont.xlThemeFontNone
   End With
   MRComObject(xlFont)
   MRComObject(xlCharacters)
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010からExcelのセルの表示形式を設定(VB.NET)  (No.9の個別表示) [スレッド一覧へ]
日時: 2012/05/29 09:27
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel 2010,桁区切り,エクセル,セルの表示形式,フォーマット  *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.05
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel のセルの表示形式を設定
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button7_Click(sender As System.Object, e As System.EventArgs) Handles Button7.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '========================= セルの表示形式を設定 ==============================

   '-------------------- マクロの記録を取った場合 ----------------------------
      'Columns("A:A").Select()
      'Selection.NumberFormatLocal = "@"

      'Columns("B:B").Select()
      'Selection.NumberFormatLocal = "#,##0.0"

      'Columns("C:C").Select()
      'Selection.NumberFormatLocal = "yyyy/mm/dd"
   '--------------------------------------------------------------------------
   Dim xlRange As Excel.Range
   xlRange = xlSheet.Range("A:A")
   xlRange.Select()
   xlRange.NumberFormatLocal = "@"
   MRComObject(xlRange)

   xlRange = xlSheet.Range("A2")
   xlRange.Value = "123456.78"
   MRComObject(xlRange)

   xlRange = xlSheet.Range("B:B")
   xlRange.Select()
   xlRange.NumberFormatLocal = "#,##0.0"
   MRComObject(xlRange)

   xlRange = xlSheet.Range("B2")
   xlRange.Value = "123456.78"
   MRComObject(xlRange)

   xlRange = xlSheet.Range("C:C")
   xlRange.Select()
   xlRange.NumberFormatLocal = "yyyy/mm/dd"
   MRComObject(xlRange)

   xlRange = xlSheet.Range("C2")
   xlRange.Value = "4/8"
   MRComObject(xlRange)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010からExcelのセル上に画像を表示及び拡大・縮小(VB.NET)  (No.10の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:02
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,画像を表示,拡大,縮小,Pictureオブジェクト        *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.05
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel のセル上に画像を表示及び拡大・縮小
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button8_Click(sender As System.Object, e As System.EventArgs) Handles Button8.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '==================== セル上に画像を表示及び拡大・縮小 =======================

   '-------------------- 下記のVB6.0用コードを移植 ---------------------------
   ' http://hanatyan.sakura.ne.jp/vbhlp/Excel12.htm
      '1.Pictureオブジェクトを使って表示
      'xlSheet.Range("B2").Select()
      'xlSheet.Pictures.Insert(MyPath).Select()

      '2.クリップボード経由での貼付け
      'xlSheet.Range("H2").Select()
      'xlSheet.Paste()
   '--------------------------------------------------------------------------

   '1.Pictureオブジェクト(隠しオブジェクト)を使っての表示
   Dim myPath As String = System.IO.Path.GetFullPath(".\Test.gif")
   Dim xlRange As Excel.Range
   xlRange = xlSheet.Range("B2")
   Dim xlPictures As Excel.Pictures
   Dim xlPicture As Excel.Picture
   'Debug.Print(TypeName(xlSheet.Pictures))    'Pictures 
   '面倒でも下記のように変数に受けないと解放されない
   xlPictures = DirectCast(xlSheet.Pictures, Excel.Pictures)
   xlPicture = xlPictures.Insert(myPath)
   'Excel 2007では画像の挿入位置指定が下記のようにしないと指定できません。
   With xlPicture
      .Top = CDbl(xlRange.Top)
      .Left = CDbl(xlRange.Left)
   End With
   MRComObject(xlPicture)
   MRComObject(xlPictures)
   MRComObject(xlRange)
   'テストの為1秒間表示
   System.Threading.Thread.Sleep(1000)

    ''2.Web 上の画像を指定して、Pictureオブジェクト(隠しオブジェクト)を使っての表示
   myPath = "http://www.hanatyan.sakura.ne.jp/toppicture.gif"
   xlRange = xlSheet.Range("I2")
   xlPictures = DirectCast(xlSheet.Pictures, Excel.Pictures)
   xlPicture = xlPictures.Insert(myPath)
   With xlPicture
      .Top = CDbl(xlRange.Top)
      .Left = CDbl(xlRange.Left)
   End With
   MRComObject(xlPicture)
   MRComObject(xlPictures)
   MRComObject(xlRange)
   'テストの為1秒間表示
   System.Threading.Thread.Sleep(1000)

   '3.Web 上の画像を指定して、Shapes.Add メソッドを使っての表示
   'Excel 2010 で Pictures.Insert メソッドを使用して図をワークシートに挿入すると
   '図がリンクオブジェクトとして挿入される
   'http://support.microsoft.com/kb/2396509/ja
   myPath = "http://www.hanatyan.sakura.ne.jp/toppicture.gif"
   Dim xlShapes As Excel.Shapes
   xlRange = xlSheet.Range("I15")
   xlShapes = xlSheet.Shapes
   Dim xlShape As Excel.Shape
   '画像のサイズが前もって解らない場合は、適当なサイズで仮取得(縦横共 100ピクセルで)
   xlShape = xlShapes.AddPicture(Filename:=myPath, _
      LinkToFile:=MsoTriState.msoFalse, SaveWithDocument:=MsoTriState.msoTrue, _
      Left:=CSng(xlRange.Left), Top:=CSng(xlRange.Top), Width:=CSng(100), Height:=CSng(100))
   '図のサイズを元のサイズに戻します
   With xlShape
      .ScaleHeight(1.0!, MsoTriState.msoTrue)
      .ScaleWidth(1.0!, MsoTriState.msoTrue)
   End With
   MRComObject(xlShape)
   MRComObject(xlShapes)
   MRComObject(xlRange)
   'テストの為1秒間表示
   System.Threading.Thread.Sleep(1000)

   '4.クリップボード経由での貼付け
   '下記のリンクの画像をクリップボードにコピーしておいてから実行して下さい。
   'http://www.hanatyan.sakura.ne.jp/toppicture.gif
    Dim iData As IDataObject = Clipboard.GetDataObject()
    'クリップボードにBMPファイルがあれば
   If iData.GetDataPresent(DataFormats.Bitmap) = False Then
      'Excel の裏に隠れたりしますので、オーナーウィンドウ(Me)を指定下さい。
      MessageBox.Show(Me, "クリップボード上に画像がありませんので、すぐにコピーして下さい。")
   End If
   xlRange = xlSheet.Range("M2")
   xlRange.Select()
   xlSheet.Paste()
   MRComObject(xlRange)
   'テストの為1秒間表示
   System.Threading.Thread.Sleep(1000)

  '5.拡大表示(1.25 = 拡大率(1.25倍)で指定)
   xlShapes = xlSheet.Shapes
   xlShape = xlShapes.Item(1)
   xlShape.Select()
   xlShape.ScaleWidth(1.25, MsoTriState.msoFalse, MsoScaleFrom.msoScaleFromTopLeft)
   xlShape.ScaleHeight(1.25, MsoTriState.msoFalse, MsoScaleFrom.msoScaleFromTopLeft)
   MRComObject(xlShape)
   MRComObject(xlShapes)
   'テストの為1秒間表示
   System.Threading.Thread.Sleep(1000)

   '6.縮小表示
   xlShapes = xlSheet.Shapes
   xlShape = xlShapes.Item(2)
   xlShape.Select()
   xlShape.ScaleWidth(0.75, MsoTriState.msoFalse, MsoScaleFrom.msoScaleFromTopLeft)
   xlShape.ScaleHeight(0.75, MsoTriState.msoFalse, MsoScaleFrom.msoScaleFromTopLeft)
   MRComObject(xlShape)
   MRComObject(xlShapes)
   'テストの為1秒間表示
   System.Threading.Thread.Sleep(1000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010からExcel上に図形(オートシェイプ等)の描画及び削除(VB.NET)  (No.11の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:03
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,雲形吹き出し,オートシェイプ,図形の描画,削除     *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.05
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel の指定位置に図形(オートシェイプ等)の描画及び削除
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button9_Click(sender As System.Object, e As System.EventArgs) Handles Button9.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '=================== 図形(オートシェイプ等)の描画及び削除 ====================

   '-------------------- 下記のVB6.0用コードを移植 ---------------------------
   ' http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=128&no=17
   '--------------------------------------------------------------------------

   Dim xlShapes As Excel.Shapes
   Dim xlShape As Excel.Shape
   xlShapes = xlSheet.Shapes
   '雲形吹き出しを描画
   xlShape = xlShapes.AddShape(MsoAutoShapeType.msoShapeCloudCallout, 100, 30, 100, 40)
   MRComObject(xlShape)
   MRComObject(xlShapes)
   '1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   'ブロック矢印を描画
   xlShapes = xlSheet.Shapes
   xlShape = xlShapes.AddShape(MsoAutoShapeType.msoShapeRightArrow, 100, 100, 50, 50)
   '1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   'オートシェイプ(ブロック矢印)の背景色と前景色を設定する
   Dim xlFillFormat As Excel.FillFormat
   xlFillFormat = xlShape.Fill
   With xlFillFormat
      .BackColor.RGB = RGB(255, 0, 255)
      .ForeColor.RGB = RGB(255, 215, 0)
   End With
   MRComObject(xlFillFormat)
   MRComObject(xlShape)
   MRComObject(xlShapes)
   '1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '終端が三角形の矢印を描画
   xlShapes = xlSheet.Shapes
   xlShape = xlShapes.AddLine(100, 200, 250, 200)
   Dim xlLineFormat As Excel.LineFormat
   xlLineFormat = xlShape.Line
   'ここまで分解して取得しないと後で、ハマる事になるので。
   With xlLineFormat
      .EndArrowheadLength = MsoArrowheadLength.msoArrowheadLong
      .EndArrowheadStyle = MsoArrowheadStyle.msoArrowheadTriangle
      .EndArrowheadWidth = MsoArrowheadWidth.msoArrowheadWide
      .Weight = 5.0#
   End With
   MRComObject(xlLineFormat)
   MRComObject(xlShape)
   MRComObject(xlShapes)
   '1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '図形を個別に削除する場合
   xlShapes = xlSheet.Shapes
   xlShape = xlShapes.Item(1)
   xlShape.Delete()
   MRComObject(xlShape)
   MRComObject(xlShapes)
   '1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '全てを削除する場合(Selection.Delete が使用できないので)
   xlShapes = xlSheet.Shapes
   For Each xlShape In xlShapes
      xlShape.Delete()
      MRComObject(xlShape)
   Next
   MRComObject(xlShapes)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
複数のCSVファイルを1つのBook内の複数のSheet上に読込む(VB.NET)  (No.12の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:05
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,CSVファイル,複数の,全ての列を文字列型に,列数    *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.05
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:複数のCSVファイルを1つのBook内の複数のWorksheet上に読み込む
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button10_Click(sender As System.Object, e As System.EventArgs) Handles Button10.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '================ 複数のCSVファイルを1つのBookに読み込む ====================

   '-------------------- 下記のVB6.0用コードを移植 ---------------------------
   ' http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=128&no=12
   '--------------------------------------------------------------------------

   '保存するファイルは、各自ご用意下さい。
   Dim CSVFile(4) As String
   CSVFile(0) = System.IO.Path.GetFullPath("..\..\..\data\Chart3.csv")
   CSVFile(1) = System.IO.Path.GetFullPath("..\..\..\data\Chart4.csv")
   CSVFile(2) = System.IO.Path.GetFullPath("..\..\..\data\Chart5.csv")
   CSVFile(3) = System.IO.Path.GetFullPath("..\..\..\data\Chart6.csv")
   CSVFile(4) = System.IO.Path.GetFullPath("..\..\..\data\Chart7.csv")
   'Excel 2007 〜 は、列数の Max が 1,048,576 行、16,384 列
   '必要な場合は、変更して下さい。
   Dim AllTextFormat(255) As Integer
   Dim i As Integer
   For i = 0 To 255
      AllTextFormat(i) = 2    '全ての列を文字列型にする為の配列
   Next i

   Dim xlQueryTables As Excel.QueryTables = Nothing
   Dim xlQueryTable As Excel.QueryTable = Nothing
   Dim xlRange As Excel.Range = Nothing
   Dim xlSheet1 As Excel.Worksheet = Nothing
   For i = 0 To CSVFile.GetUpperBound(0)
      'ファイル数分シートがあるかを調査
      If xlSheets.Count >= i + 1 Then
         xlSheet1 = DirectCast(xlSheets.Item(i + 1), Excel.Worksheet)
      Else
         '無ければシートを追加
         xlSheet1 = DirectCast(xlSheets.Add, Excel.Worksheet)
      End If
      xlRange = xlSheet1.Range("A1")
      xlQueryTables = xlSheet1.QueryTables
      xlQueryTable = xlQueryTables.Add(Connection:="TEXT;" & CSVFile(i), Destination:=xlRange)

      With xlQueryTable
         .TextFilePlatform = 932    'Excel 2000 の場合は、xlWindows で
         .TextFileCommaDelimiter = True
         '全ての列をテキスト型に設定(無難なので)
         .TextFileColumnDataTypes = AllTextFormat
         .Refresh()
      End With
      MRComObject(xlQueryTable)
      MRComObject(xlQueryTables)
      MRComObject(xlRange)
      MRComObject(xlSheet1)

      '確認のために、1秒間表示しておく
      System.Threading.Thread.Sleep(1000)
   Next i

   'ファイルを保存するようにしましたので、確認して見て下さい。

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), True)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010からExcelのWorksheetの列幅を取得・列幅を設定(VB.NET)  (No.13の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:06
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,列幅を取得,列幅を設定,文字列に合せ列幅を自動調整*
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.05
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel の Worksheet の列幅を取得・列幅を設定
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button11_Click(sender As System.Object, e As System.EventArgs) Handles Button11.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '========================= 列幅を取得・列幅を設定 ============================

   '-------------------- 下記のVB6.0用コードを移植 ---------------------------
   ' http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=128&no=6
   '--------------------------------------------------------------------------
   'Excel 操作部分(列幅を取得・列幅を設定・セルの文字列長に合せて列幅を設定する)
   '列幅を取得(列幅の単位は、標準スタイルの 1 文字分の幅に相当します。
   Dim xlRange As Excel.Range
   xlRange = xlSheet.Range("A:X")

   'プロポーショナル フォントでは、数字の 0 の幅が列幅の単位になります)
   MessageBox.Show(Me, xlRange.ColumnWidth.ToString())    '8.38(72ピクセル)

   '列幅を取得(ポイント単位)
   MessageBox.Show(Me, xlRange.Width.ToString())          '1296

   'A列〜X列までの列幅を5に設定
   xlRange.ColumnWidth = 5
   'ここも下記行で、xlRange の参照先を変更するのでその前にデクリメントを
   'しておかないと Range("A:X") の参照先がなくなり破棄できなくなる
   MRComObject(xlRange)

   '仮データを入力
   xlRange = xlSheet.Range("B1:D1")
   xlRange.Value = "あいうえおかきくけこ"
   'データの文字列長に合せて列幅を自動調整
   Dim xlColumns As Excel.Range
   xlColumns = xlRange.Columns   'この場合は、引数を指定しないので、これでOK
   xlColumns.AutoFit()
   MRComObject(xlColumns)
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010からExcelのWorksheetの行の高さを設定(VB.NET)  (No.14の個別表示) [スレッド一覧へ]
日時: 2012/05/29 11:12
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,行の高さを設定,行の高さを自動調整        *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel の Worksheet の行の高さを設定・行の高さを自動調整
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button12_Click(sender As System.Object, e As System.EventArgs) Handles Button12.Click
   'テスト用の適当なファイルを用意しておいて下さい。
   '既存のファイルをオープンして、Excel を起動
   Call ExcelOpen(System.IO.Path.GetFullPath("..\..\..\data\DBTest.xls"), "Sheet1")
   '==================== 行の高さを設定・行の高さを自動調整 =====================
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   Dim xlRange As Excel.Range
   xlRange = xlSheet.Range("3:10")
   '行の高さを25 ポイント(25/72 インチ)に設定
   xlRange.RowHeight = 25
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '行の高さを文字の高さに合せて自動調整
   Dim xlRows As Excel.Range
   xlRows = xlRange.Rows
   xlRows.AutoFit()
   MRComObject(xlRows)
   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
メンテ
VB2010からExcelのWorksheetの使用済みのセル範囲を取得(VB.NET)  (No.15の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:08
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,使用済みのセル範囲,Activateセル領域,A1 形式   *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel の Worksheet の使用済みのセル範囲を取得
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button13_Click(sender As System.Object, e As System.EventArgs) Handles Button13.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '======================== 使用済みのセル範囲を取得 ===========================

   '-------------------- 下記のVB6.0用コードを移植 ---------------------------
   ' http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=128&no=8
   '--------------------------------------------------------------------------
   Dim xlRange As Excel.Range
   Dim Dat(2, 5) As Object
   Dat(0, 0) = 4 : Dat(0, 1) = 4 : Dat(0, 2) = 5 : Dat(0, 3) = 8 : Dat(0, 4) = 9 : Dat(0, 5) = ""
   Dat(1, 0) = 3 : Dat(1, 1) = 3 : Dat(1, 2) = 5 : Dat(1, 3) = 9 : Dat(1, 4) = "" : Dat(1, 5) = ""
   Dat(2, 0) = 1 : Dat(2, 1) = 7 : Dat(2, 2) = 1 : Dat(2, 3) = 6 : Dat(2, 4) = 4 : Dat(2, 5) = 3
   xlRange = xlSheet.Range("A1:F3")    'データの入力セル範囲
   xlRange.Value = Dat                                   'セルへデータの入力
   '1秒間表示しておく
   MRComObject(xlRange)
   System.Threading.Thread.Sleep(1000)

   'データの入力範囲の取得
   '指定のセル位置を含む空白行と空白列に囲まれた最小のセル範囲を取得
   'Activateなセル("A1")があるActivateセル領域を選択します。
   xlRange = xlSheet.Range("A1")
   xlRange.Activate()
   Dim xlCurrentRegion As Excel.Range
   xlCurrentRegion = xlRange.CurrentRegion
   xlCurrentRegion.Select()
   '----------------------------------------------
   'Address プロパティでその範囲を A1 形式で取得。
   Dim xlRange1 As Excel.Range
   xlRange1 = xlSheet.Range("A5")  '又は、xlRange1 = xlSheet.Range(R1ToA1(5, 1))
   xlRange1.Value = "セル A1 があるActivateセル領域は " & _
         xlCurrentRegion.Address(False, False, Excel.XlReferenceStyle.xlA1) & " の範囲です。"
   MRComObject(xlRange1)
   MRComObject(xlRange)
   MRComObject(xlCurrentRegion)
   '1秒間表示しておく
   System.Threading.Thread.Sleep(1000)
   '----------------------------------------------

  'xlSheet 上の使用済みのセル範囲を取得
   Dim xlCells As Excel.Range
   xlCells = xlSheet.Cells
   xlRange1 = DirectCast(xlCells(6, 1), Excel.Range)
   Dim xlUsedRange As Excel.Range
   xlUsedRange = xlSheet.UsedRange
   xlRange1.Value = "使用済みセル領域は " & _
         xlUsedRange.Address(False, False, Excel.XlReferenceStyle.xlA1) & " です。"
   MRComObject(xlUsedRange)
   MRComObject(xlCells)
   MRComObject(xlRange1)
   '1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
R1C1形式をA1形式に変換する関数及びその使用例(VB.NET)  (No.16の個別表示) [スレッド一覧へ]
日時: 2012/05/29 11:22
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,R1C1形式,A1形式,セル番地,行番,列番,列数,行数   *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:R1C1形式をA1形式に変換する関数及びその使用例
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0
同様の関数は今までも作っていたのですが、Excel 2007 以降は、列数の Max が 255 →16,384 列 に
変更されたのに伴い、今まで使っていた関数では、702 列("ZZ")までしか対応できませんので、作り
直しました。  旧の関数 http://www.hanatyan.sakura.ne.jp/dotnet/Excel07.htm#no3
但し、18,278 列 ZZZ までの対応となっております。
  
'--------------------------------------------------------------------------------------------------
Private Sub Button14_Click(sender As System.Object, e As System.EventArgs) Handles Button14.Click
'R1C1形式をA1形式に変換する関数の使用例
   Dim R1 As Integer = 10     '行番
   Dim C1 As Integer = 1378   '列番
   'Excel の裏に隠れたりしますので、オーナーウィンドウ(Me)を指定下さい。
  '結果 (10,1378) → ("AZZ10")
   MessageBox.Show(R1.ToString() & " , " & C1.ToString() & " = " & R1ToA1(R1, C1) & " です。")
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
      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
メンテ
A1形式をR1C1形式に変換する関数及びその使用例(VB.NET)  (No.17の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:12
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,R1C1形式,A1形式,セル番地,行番,列番,列数,行数   *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:A1形式をR1C1形式に変換する関数及びその使用例
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0
>>16 R1C1形式をA1形式に変換する関数及びその使用例 の逆に変換する関数です。
仕様等は、上記同様ですので、上記関数の説明文等もご覧下さい。

初め、計算式で求める方法で作ったのですが、複雑になり、範囲指定の場合まで対応できず、Excel の
Address 関数を使った方法で、"A2:AZZ200" のような指定もできるようにも作ってみました。
使用する場面に合せるなり、改造するなりして使って見て下さい。
'--------------------------------------------------------------------------------------------------

Private Sub Button15_Click(sender As System.Object, e As System.EventArgs) Handles Button15.Click

   '=================== A1形式をR1C1形式に変換する関数 ==========================
   Dim A1 As String = "AZZ200"   '行番
   'Excel の裏に隠れたりしますので、オーナーウィンドウ(Me)を指定下さい。
   Dim r1a1() As Integer = A1ToR1(A1)
   '結果 AZZ200 = 200,1378 です。
   MessageBox.Show(A1 & " = " & r1a1(0).ToString() & "," & r1a1(1).ToString() & " です。")

   '=============================================================================

   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   xlApp.Visible = False
   '--------------------------------------------------------------------------
   'Excel の Address 関数を使った方が簡単かも
   Dim xlRange As Excel.Range
   xlRange = xlSheet.Range("AZZ200")
   Dim Col() As String = xlRange.Address(True, True, _
                          Excel.XlReferenceStyle.xlR1C1).Replace("R", "").Split("C"c)
   MessageBox.Show("AZZ200 = " & Col(0) & " , " & Col(1) & " です。")
   MRComObject(xlRange)


   Dim r1c1() As Integer = A1ToR1C1("A2:AZZ200")
   '結果 [A2:AZZ200] = 2,1,200,1378 です。
   MessageBox.Show("[A2:AZZ200] = " & r1c1(0).ToString() & "," & r1c1(1).ToString() & _
               " , " & r1c1(2).ToString() & "," & r1c1(3).ToString() & " です。")

   '=============================================================================

   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub


Private Function A1ToR1C1(ByVal A1 As String) As Integer()
'A1形式をR1C1形式に変換する関数(Excel の Address 関数を使った方法)
   Dim adr1 As String = "A1"
   Dim adr2 As String = "A1"
   Dim r1c1(3) As Integer
   If A1.IndexOf(":") > 0 Then
      Dim wrk() As String = A1.Split(":"c)
      adr1 = wrk(0)
      adr2 = wrk(1)
   Else
      adr1 = A1
      adr2 = "A1"
   End If
   Dim xlRange As Excel.Range
   xlRange = xlSheet.Range(adr1)
   Dim Col() As String = xlRange.Address(True, True, _
                     Excel.XlReferenceStyle.xlR1C1).Replace("R", "").Split("C"c)
   MRComObject(xlRange)    'ここも参照先が変わるので

   r1c1(0) = CInt(Col(0))
   r1c1(1) = CInt(Col(1))
   xlRange = xlSheet.Range(adr2)
   Dim Col1() As String = xlRange.Address(True, True, _
                     Excel.XlReferenceStyle.xlR1C1).Replace("R", "").Split("C"c)
   r1c1(2) = CInt(Col1(0))
   r1c1(3) = CInt(Col1(1))
   MRComObject(xlRange)
   Return r1c1
End Function

Private Function A1ToR1(ByVal A1 As String) As Integer()
'A1形式をR1C1形式に変換する関数(計算式で求める方法)
   Dim R1A1(1) As Integer
   R1A1(0) = 0
   R1A1(1) = 0
   A1.ToUpper()
   Dim nLen As Integer = A1.Length
   Dim strColum As String = ""
   Dim strRow As String = ""

   For i As Integer = 0 To nLen - 1
      Dim wrk As String = A1.Substring(i, 1)
      If AscW(wrk) >= 64 And AscW(wrk) <= 90 Then
         strColum &= wrk
      ElseIf AscW(wrk) >= 48 And AscW(wrk) <= 57 Then
         strRow &= wrk
      Else
         MessageBox.Show("指定が間違っています。")
         Return R1A1
      End If
   Next
   Debug.Print(strColum & " :  " & strRow)
   A1 = strColum
   Dim s As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
   Dim B1 As String = A1.ToUpper
   Dim A2 As String = ""
   Dim n As Integer = B1.Length
   If n > 3 Then n = 3
   For i As Integer = 0 To n - 1
      If s.IndexOf(B1.Substring(i, 1)) >= 0 Then
         A2 &= B1.Substring(i, 1)
      End If
   Next
   n = A2.Length
   Dim C1 As Integer = 0
   If n = 1 Then
      C1 = s.IndexOf(A2) + 1
   ElseIf n = 2 Then
      C1 = (s.IndexOf(A2.Substring(0, 1)) + 1) * 26
      C1 += s.IndexOf(A2.Substring(1, 1)) + 1
   Else
      C1 = ((s.IndexOf(A2.Substring(0, 1)) + 1) * 676)
      C1 += (s.IndexOf(A2.Substring(1, 1)) + 1) * 26
      C1 += s.IndexOf(A2.Substring(2, 1)) + 1
   End If
   R1A1(0) = CInt(strRow)
   R1A1(1) = C1
   Return R1A1
End Function

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
      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
メンテ
VB2010からExcelのWorksheet上で行・列・セルの挿入及び削除(VB.NET)  (No.18の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:14
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,行の挿入,列の挿入,セルの挿入,行の削除,列の削除  *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel の Worksheet 上で行・列・セルの挿入及び削除
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button16_Click(sender As System.Object, e As System.EventArgs) Handles Button16.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '===================== 行・列・セルの挿入及び削除 ============================

   '-------------------- 下記のVB6.0用コードを移植 ---------------------------
   ' http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=128&no=11
   '--------------------------------------------------------------------------

   '何も記入していないと解らないので仮データを記入(R1ToA1 関数の使用例もかねて)
   Dim xlRange As Excel.Range = Nothing
   For c As Integer = 1 To 10
      For r As Integer = 1 To 20
         xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c))
         xlRange.Value = r + c
         MRComObject(xlRange)    'ここも直ちにデクリメントの事
      Next r
   Next c
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '---------------------------------------------------------
   '4行目と5行の間に1行挿入します。
   Dim xlRows As Excel.Range
   Dim xlRow As Excel.Range
   xlRows = xlSheet.Rows
   xlRow = DirectCast(xlRows.Item(5), Excel.Range)
   xlRow.Insert()
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)
   xlRow.Insert(Shift:=Excel.XlInsertShiftDirection.xlShiftDown)  '上記と同じ
   MRComObject(xlRow)
   MRComObject(xlRows)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '4行目と5行の間に1行挿入します。
   '下記の場合は、"A1" のように指定するとセルの挿入になる
   xlRange = xlSheet.Range("5:5")
   xlRange.Insert()
   MRComObject(xlRange)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '下記の場合は、"B5" として行の挿入になる
   xlRange = xlSheet.Range("B5")
   Dim xlEntireRow As Excel.Range
   xlEntireRow = xlRange.EntireRow
   xlEntireRow.Insert()
   MRComObject(xlEntireRow)
   MRComObject(xlRange)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '------------------ 以上 4行挿入 ---------------------

   '4列目と5列の間に1列挿入します。
   Dim xlColumns As Excel.Range
   Dim xlColumn As Excel.Range
   xlColumns = xlSheet.Columns
   xlColumn = DirectCast(xlColumns.Item(5), Excel.Range)
   xlColumn.Insert()
   MRComObject(xlColumn)
   MRComObject(xlColumns)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   xlRange = xlSheet.Range("E:E")
   xlRange.Insert()
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   Dim xlEntireColumn As Excel.Range
   xlEntireColumn = xlRange.EntireColumn
   xlEntireColumn.Insert()
   MRComObject(xlEntireColumn)
   MRComObject(xlRange)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '------------------ 以上 3列挿入 ---------------------

   'C列の5行目にセルを挿入します。
   xlRange = xlSheet.Range("C5")
   xlRange.Insert()
   MRComObject(xlRange)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   'C列の3行目のセルを右に挿入します。
   xlRange = xlSheet.Range("C3")
   xlRange.Insert(Shift:=Excel.XlInsertShiftDirection.xlShiftToRight)
   MRComObject(xlRange)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '5行目を削除します。
   xlRows = xlSheet.Rows
   xlRow = DirectCast(xlRows.Item(5), Excel.Range)
   xlRow.Delete()
   MRComObject(xlRow)
   MRComObject(xlRows)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   xlRange = xlSheet.Range("5:5")
   xlRange.Delete()
   MRComObject(xlRange)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   xlRange = xlSheet.Range("A5")
   xlEntireRow = xlRange.EntireRow
   xlEntireRow.Delete()
   MRComObject(xlRange)
   MRComObject(xlEntireRow)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   'C列の3行目のセルを左に削除します。
   xlRange = xlSheet.Range("C3")
   xlRange.Delete(Shift:=Excel.XlDeleteShiftDirection.xlShiftToLeft)
   MRComObject(xlRange)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '5列目を削除します。
   xlColumns = xlSheet.Columns
   xlColumn = DirectCast(xlColumns.Item(5), Excel.Range)
   xlColumn.Delete()
   MRComObject(xlColumn)
   MRComObject(xlColumns)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   xlRange = xlSheet.Range("A5")
   xlEntireRow = xlRange.EntireRow
   xlEntireRow.Delete()
   MRComObject(xlRange)
   MRComObject(xlEntireRow)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   xlRange = xlSheet.Range("E:E")
   xlRange.Delete()
   MRComObject(xlRange)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   xlRange = xlSheet.Range("E:E")   '再度指定しないと削除済みなのでエラーとなります。
   xlEntireColumn = xlRange.EntireColumn
   xlEntireColumn.Delete()
   MRComObject(xlRange)
   MRComObject(xlEntireColumn)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   'C列の5行目のセルを削除します。
   xlRange = xlSheet.Range("C5")
   xlRange.Delete()
   MRComObject(xlRange)
   '動作確認の為に1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
指定のセルが指定の範囲内にあるか、どうかを調査(VB.NET)  (No.19の個別表示) [スレッド一覧へ]
日時: 2012/05/29 11:31
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,指定の範囲内にあるか,共有セル範囲,指定のセル    *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:指定のセルが指定の範囲内にあるか、どうかを調査
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button17_Click(sender As System.Object, e As System.EventArgs) Handles Button17.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '==================== 指定のセルが指定の範囲内にあるか =======================

   '---------------- MS サポート技術情報(文書番号: 259137) -------------------
      'Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
      '    If Not Intersect(Target, Range("MyDefinedRange")) Is Nothing Then
      '        MsgBox(Target.Address & " is in MyDefinedRange.")
      '    Else
      '        MsgBox(Target.Address & " is NOT in MyDefinedRange.")
      '    End If
      'End Sub
   '--------------------------------------------------------------------------

   '指定のセルが、指定のセル範囲内にあるか、どうかを調べる
   Dim xlRange As Excel.Range
   Dim xlTargetRange As Excel.Range
   xlRange = xlSheet.Range("A1:H20")         '指定のセル範囲内
   xlTargetRange = xlSheet.Range("G15")      '指定のセル位置

   'Application.Intersect メソッド : 複数のセル範囲の共有セル範囲を
   '表す Range オブジェクトを返します。
   '共有セル範囲を調べているので、xlTRange と xlRange は入れ替えても同じです。
   Dim xlIntersect As Excel.Range
   xlIntersect = xlApp.Intersect(xlTargetRange, xlRange)
   If Not xlIntersect Is Nothing Then
      'Range.Address プロパティを使って、A1 形式のアドレスを取得
      MessageBox.Show(Me, " セル[" & xlTargetRange.Address(False, False) & "]は、セル[" & _
                                    xlRange.Address(False, False) & "]の範囲内にあります。")
   Else
      MessageBox.Show(Me, " セル[" & xlTargetRange.Address(False, False) & "]は、セル[" & _
                              xlRange.Address(False, False) & "]の範囲内には、ありません。")
   End If
   MRComObject(xlTargetRange)
   MRComObject(xlIntersect)
   MRComObject(xlRange)

   xlTargetRange = xlSheet.Range("A1:G21")
   xlRange = xlSheet.Range("A1:H20")
   xlIntersect = xlApp.Intersect(xlTargetRange, xlRange)
   If Not xlIntersect Is Nothing Then
      'Excel の裏に隠れたりしますので、オーナーウィンドウ(Me)を指定下さい。
      MessageBox.Show(Me, " セル[" & xlTargetRange.Address(False, False) & "]は、セル[" & _
                                    xlRange.Address(False, False) & "]の範囲内にあります。")
   Else
      MessageBox.Show(Me, " セル[" & xlTargetRange.Address(False, False) & "]は、セル[" & _
                              xlRange.Address(False, False) & "]の範囲内には、ありません。")
   End If
   MRComObject(xlTargetRange)
   MRComObject(xlIntersect)
   MRComObject(xlRange)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
Excel のシート数・シート名の取得及びシートの追加・削除(VB.NET)  (No.20の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:16
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,シート数,シート名,シートの追加,シートの削除     *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:Excel のシート数・シート名の取得及びシートの追加・削除
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button18_Click(sender As System.Object, e As System.EventArgs) Handles Button18.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '============== シート数・シート名の取得及びシートの追加・削除 ===============

   '-------------------- 下記のVB6.0用コードを移植 ---------------------------
   ' http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=128&no=7
   '--------------------------------------------------------------------------

   'シート(Worksheet)数の取得
   Dim sheetCount As Integer
   sheetCount = xlSheets.Count
   'Excel の裏に隠れたりしますので、オーナーウィンドウ(Me)を指定下さい。
   MessageBox.Show(Me, "現在のシート(Worksheet)数 = " & sheetCount & " です。")

   '新規にシートを追加
   Dim xlSheet2 As Excel.Worksheet
   xlSheet2 = DirectCast(xlSheets.Add, Excel.Worksheet)
   MRComObject(xlSheet2)

   sheetCount = xlSheets.Count
   MessageBox.Show(Me, "シートを1個追加したので、Worksheet 数 = " & sheetCount & " です。")

   '追加したシートの名前を取得
   Dim xlSheet1 As Excel.Worksheet
   xlSheet1 = DirectCast(xlSheets.Item(sheetCount), Excel.Worksheet)
   MessageBox.Show(Me, "追加したシート名 = " & xlSheet1.Name & " です。")

   '追加したシートの名前を変更
   xlSheet1.Name = "Test1"

   '変更したシート名を取得(確認)
   MessageBox.Show(Me, "シート名を " & xlSheet1.Name & " に変更しました。")

   '追加したシートを削除
   xlSheet1.Delete()
   sheetCount = xlSheets.Count
   MRComObject(xlSheet1)
   MessageBox.Show(Me, "追加したシートを削除したので、Worksheet 数 = " & sheetCount & " です。")

   'シート名の取得
   Dim xlElement As Excel.Worksheet = Nothing
   For Each xlElement In xlSheets
      Debug.Print(xlElement.Name)
      MRComObject(xlElement)
   Next

   '-----------------------------------------------------------------------
   '新規にBook を開いた時に表示したいシート数を設定する場合
   'Excelのツール→オプション→全般→新しいブックのシート数 の設定と同じ

   'xlApp.SheetsInNewWorkbook = 1

   'Book をオープンする前に書いて下さい。
   '-----------------------------------------------------------------------

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010 から Excel のワークシート関数を使用する(VB.NET)  (No.21の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:17
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,ワークシート関数,Excel の関数,エクセルの関数    *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel のワークシート関数を使用する
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0
下記では、代表的な関数について試していますが、その他の関数についても同様操作で実行
できるはずですので、試して見て下さい。
'--------------------------------------------------------------------------------------------------

Private Sub Button19_Click(sender As System.Object, e As System.EventArgs) Handles Button19.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動

   '===================== VB2010 からExcel の関数を使用する =====================

   '-------------------- 下記のVB6.0用コードを移植 ---------------------------
   ' http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=128&no=8
   '--------------------------------------------------------------------------

   '仮データの入力
   Dim xlRange As Excel.Range = Nothing
   Dim retValue As Double = 0
   For c As Integer = 1 To 10
      For r As Integer = 1 To 10
         xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c))
         retValue += 1
         xlRange.Value = retValue
         MRComObject(xlRange)    'ここも直ちにデクリメントして下さい。
      Next r
   Next c

   xlRange = xlSheet.Range("B3:D10")
   'Visual Basic から Excel のワークシート関数を使用する
   Dim xlFunction As Excel.WorksheetFunction = xlApp.WorksheetFunction

   '指定セル範囲内のデータの個数を取得
   retValue = xlFunction.Count(xlRange)
   'Excel の裏に隠れたりしますので、オーナーウィンドウ(Me)を指定下さい。
   MessageBox.Show(Me, "[A1:j10]の範囲内のデータの個数 = " & retValue & " です。")

   '指定セル範囲内のデータの最小値を取得
   retValue = xlFunction.Min(xlRange)
   MessageBox.Show(Me, "[A1:j10]の範囲内のデータの最小値 = " & retValue & " です。")

   '指定セル範囲内のデータの最大値を取得
   retValue = xlFunction.Max(xlRange)
   MessageBox.Show(Me, "[A1:j10]の範囲内のデータの最大値 = " & retValue & " です。")

   '指定セル範囲内のデータの合計を取得
   retValue = xlFunction.Sum(xlRange)
   MessageBox.Show(Me, "[A1:j10]の範囲内のデータの合計 = " & retValue & " です。")

   '指定セル範囲内のデータの平均値を取得
   retValue = xlFunction.Average(xlRange)
   MessageBox.Show(Me, "[A1:j10]の範囲内のデータの平均値 = " & retValue & " です。")

   MRComObject(xlRange)
   MRComObject(xlFunction)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010 から Excel の表の縦横の合計を求める(VB.NET)  (No.22の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:19
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,合計を求める,SUM 関数,計算式をコピー            *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel の表の縦横の合計を求める
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button20_Click(sender As System.Object, e As System.EventArgs) Handles Button20.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動

   '========================== 表の縦横の合計を求める ===========================

   '-------------------- 下記のVB6.0用コードを移植 ---------------------------
   ' http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=128&no=10
   '--------------------------------------------------------------------------

   '仮データの入力
   Dim xlRange As Excel.Range = Nothing
   Dim retValue As Double = 0
   '範囲を変えて試して見て下さい。(セル C3 を含む範囲内で)
   For c As Integer = 1 To 5
      For r As Integer = 1 To 6
         xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c))
         retValue += 1
         xlRange.Value = retValue
         MRComObject(xlRange)
      Next r
   Next c
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   'Activateなセル("C1")があるActivateセル領域を選択します。
   '必ず、表内のセルを指定して下さい。
   xlRange = xlSheet.Range("C3")
   xlRange.Activate()
   Dim xlCurrentRegion As Excel.Range
   xlCurrentRegion = xlRange.CurrentRegion
   xlCurrentRegion.Select()
   'セル領域のアドレス(A1:E6)を取得しR1C1 形式のアドレス(1,1,6,5)に変換  
   'A1ToR1C1 関数の実使用例
   Dim r1c1() As Integer = A1ToR1C1(xlCurrentRegion.Address( _
                              False, False, Excel.XlReferenceStyle.xlA1))
   MRComObject(xlCurrentRegion)    '直ちに解放しておく事
   MRComObject(xlRange)

   '範囲の開始位置を整数で求める   A1 → 1,1
   Dim r1 As Integer = r1c1(0)    '1 行
   Dim C1 As Integer = r1c1(1)    '1 列
   '範囲の終了位置を整数で求める E6 → 6,5
   Dim r2 As Integer = r1c1(2)    '6 行
   Dim C2 As Integer = r1c1(3)    '5 列

   '行の合計を求めるセル位置を設定 1,5+1 → F1
   xlRange = xlSheet.Range(R1ToA1(r1, C2 + 1))
   '行の合計を求める
   xlRange.FormulaR1C1 = "=SUM(RC[-" & CInt(C2 - C1 + 1) & "]:RC[-1])"

   Dim xlRange1 As Excel.Range
   '計算式をコピーする範囲を求める(必ず、別の Range で受けて下さい。)
   xlRange1 = xlSheet.Range(R1ToA1(r1, C2 + 1) & ":" & R1ToA1(r2, C2 + 1))
   '計算式を下方向にコピー(xlRange と xlRange1 の使い分けに注目)
   xlRange.AutoFill(Destination:=xlRange1, Type:=Excel.XlAutoFillType.xlFillDefault)
   MRComObject(xlRange1)
   MRComObject(xlRange)

   '列の合計を求めるセル位置を設定 
   xlRange = xlSheet.Range(R1ToA1(r2 + 1, C1))
   '列の合計を求める
   xlRange.Formula = "=SUM(R[-" & CInt(r2 - r1 + 1) & "]C:R[-1]C)"
   '計算式をコピーする範囲を求める(必ず、別の Range で受けて下さい。)
   xlRange1 = xlSheet.Range(R1ToA1(r2 + 1, C1) & ":" & R1ToA1(r2 + 1, C2 + 1))
   '計算式を下方向にコピー(xlRange と xlRange1 の使い分けに注目)
   xlRange.AutoFill(Destination:=xlRange1, Type:=Excel.XlAutoFillType.xlFillDefault)
   MRComObject(xlRange)
   MRComObject(xlRange1)
   '確認のために、2秒間表示しておく
   System.Threading.Thread.Sleep(2000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
Excel の指定列のデータから重複しないデータを抽出(VB.NET)  (No.23の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:20
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,オートフィルター,データリスト,重複しないデータ  *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:Excel の指定列のデータから重複しないデータを抽出
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button21_Click(sender As System.Object, e As System.EventArgs) Handles Button21.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '================ 指定列のデータから重複しないデータを抽出 ===================

   '-------------------- 下記のVB6.0用コードを移植 ---------------------------
   ' http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=128&no=13
   '--------------------------------------------------------------------------

   '仮データの書込み
   Dim Dat(9, 0) As Object
   Dat(0, 0) = "品 名" : Dat(1, 0) = "みかん" : Dat(2, 0) = "トマト"
   Dat(3, 0) = "いちご" : Dat(4, 0) = "みかん" : Dat(5, 0) = "トマト"
   Dat(6, 0) = "いちご" : Dat(7, 0) = "みかん" : Dat(8, 0) = "トマト"
   Dat(9, 0) = "いちご"
   Dim xlRange As Excel.Range
   xlRange = xlSheet.Range("B2:B11")
   xlRange.Value = Dat
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)
   '--------------------------------------------------------------------------

   'B列のデータリストからオートフィルターを使って重複したものを除いたリストだけを抽出
   xlRange = xlSheet.Range("B2:B11")
   Dim xlRange1 As Excel.Range
   xlRange1 = xlSheet.Range("B2")
   xlRange.AdvancedFilter(Excel.XlFilterAction.xlFilterInPlace, xlRange1, , True)
   MRComObject(xlRange)

   '抽出したデータ件数を取得
   xlRange = xlSheet.Range("B2")
   Dim xlEndRange As Excel.Range
   xlEndRange = xlRange1.End(Excel.XlDirection.xlDown)
   Dim Count, i As Integer
   Count = xlEndRange.Row
   MRComObject(xlEndRange)
   MRComObject(xlRange1)
   MRComObject(xlRange)

   ListBox1.Items.Clear()
   For i = 3 To Count
      xlRange = xlSheet.Range(R1ToA1(i, 2))
      If CInt(xlRange.RowHeight) > 0 Then
         '抽出したデータを取得
         ListBox1.Items.Add(xlRange.Value.ToString)
      End If
      MRComObject(xlRange)
   Next i
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010 から Excel の選択範囲内で指定文字を連続検索(VB.NET)  (No.24の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:21
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,連続検索,置き換え,文字色,見つかった位置,再検索  *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel の選択範囲内で指定文字を連続検索
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button22_Click(sender As System.Object, e As System.EventArgs) Handles Button22.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '====================== 選択範囲内で指定文字を連続検索 =======================

   '-------------------- 下記のVB6.0用コードを移植 ---------------------------
   ' http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=128&no=24
   '--------------------------------------------------------------------------
   '仮データの入力
   Dim xlRange As Excel.Range = Nothing
   Dim retValue As Double = 0
   '範囲を変えて試して見て下さい。(セル C3 を含む範囲内で)
   For c As Integer = 1 To 5
      For r As Integer = 1 To 6
         xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c))
         retValue += 1
         Dim s1 As String = CStr(ChrW(65 + r + c)) & CStr(ChrW(70 + r + c))
         xlRange.Value = s1 & " " & Str(retValue) & " " & s1
         MRComObject(xlRange)
      Next r
   Next c

   xlRange = xlSheet.Range("C3")
   xlRange.Activate()
   '指定のセル位置を含む空白行と空白列に囲まれた最小のセル範囲を取得
   Dim xlCurrentRegion As Excel.Range
   xlCurrentRegion = xlRange.CurrentRegion
   xlCurrentRegion.Select()
   'セル領域のアドレス(A1:E6)を取得しR1C1 形式のアドレス(1,1,6,5)に変換  
   'A1ToR1C1 関数の実使用例
   Dim r1c1() As Integer = A1ToR1C1(xlCurrentRegion.Address( _
                                 False, False, Excel.XlReferenceStyle.xlA1))
   MRComObject(xlCurrentRegion)
   MRComObject(xlRange)

   '範囲の開始位置を整数で求める   A1 → 1,1
   Dim r1 As Integer = r1c1(0)    '1 行
   Dim C1 As Integer = r1c1(1)    '1 列
   '範囲の終了位置を整数で求める E6 → 6,5
   Dim r2 As Integer = r1c1(2)    '6 行
   Dim C2 As Integer = r1c1(3)    '5 列
   Dim nCount As Integer = 0
   Dim N As Integer = 0
   Dim target As String = "GL"
   Dim xlCharacters As Excel.Characters = Nothing
   For c As Integer = C1 To C2         'C1 列 〜 C2 列までを調べる
      For r As Integer = r1 To r2      'R1 行 〜 R2 行までを調べる
         xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c))
         Dim myText As String = xlRange.Value.ToString()
         '該当セル内で見つかったら、セル内に複数存在するか調べる
         N = InStr(1, myText, target)
         While N <> 0
            '見つかった文字列の位置
            xlCharacters = xlRange.Characters(Start:=N, Length:=target.Length)
            '見つかった文字列を赤色で太字で表示
            Dim xlFont As Excel.Font
            xlFont = xlCharacters.Font
            With xlFont
               .Color = Color.Red
               .Bold = True
            End With
            MRComObject(xlFont)
            MRComObject(xlCharacters)
            nCount += 1    '見つかった文字列の個数をカウント
            '見つかった位置から再度検索を繰り返す。
            N = InStr(N + 1, myText, target)
         End While
         MRComObject(xlRange)
      Next r
   Next c
   MessageBox.Show(Me, "[" & target & "]は、" & nCount.ToString() & " 回見つかりました。")

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010 から Excel の並べ替えを実行する(VB.NET)  (No.25の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:22
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,並べ替え,ソート,Sort,              *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel の並べ替え(ソート)を実行する
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button23_Click(sender As System.Object, e As System.EventArgs) Handles Button23.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '============================= 並べ替え(ソート) ==============================

   '--------------------------------------------------------------------------
   '何も記入していないと解らないので仮データを記入(R1ToA1 関数の使用例もかねて)
   Dim xlRange As Excel.Range = Nothing
   Dim nRnd As New System.Random()
   For c As Integer = 1 To 10
      For r As Integer = 1 To 20
         xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c))
         '1 〜 100 までのランダムなデータを作成
         xlRange.Value = nRnd.Next(1, 100)  ' CInt(100 * Rnd())
         MRComObject(xlRange)
      Next r
   Next c
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)
   '---------------------------------------------------------

   'Range オブジェクトの Sort メソッド を使っての並べ替え
   '-------------------- 下記のVB6.0用コードを移植 ---------------------------
   ' http://www.hanatyan.sakura.ne.jp/vbhlp/excel09.htm#xl_1
   '--------------------------------------------------------------------------
   Dim xlRange1 As Excel.Range
   xlRange1 = xlSheet.Range("B1")
   xlRange = xlSheet.Range("A1:J20")
   'セル範囲 "A1:J20" を B 列をキー(列単位)に降順の並べ替え
   xlRange.Sort(Key1:=xlRange1, Order1:=Excel.XlSortOrder.xlDescending, _
                                Orientation:=Excel.XlSortOrientation.xlSortColumns)
   MRComObject(xlRange1)
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)
   '--------------------------------------------------------------------------

   ' Excel 2007 〜 の Sort オブジェクト を使っての並べ替え
   '   --------------------- マクロの記録を取った場合 ---------------------------
      '    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
      '    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("B1:B20") _
      '        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
      '    With ActiveWorkbook.Worksheets("Sheet1").Sort
      '        .SetRange Range("A1:J20")
      '        .Header = xlGuess
      '        .MatchCase = False
      '        .Orientation = xlTopToBottom
      '        .SortMethod = xlPinYin
      '        .Apply
      '    End With
   '--------------------------------------------------------------------------
   xlRange1 = xlSheet.Range("B1")
   xlRange = xlSheet.Range("A1:J20")
   Dim xlSort As Excel.Sort
   Dim xlSortFields As Excel.SortFields
      xlSort = xlSheet.Sort

   xlSortFields = xlSort.SortFields
   Dim xlSortFields1 As Excel.SortField = Nothing
   With xlSortFields
      .Clear()  'SortFields オブジェクトをすべてクリアします
      '新しい並べ替えの条件を作成
      'Key:並べ替える基準のセル SortOn:並べ替えの基準(値・セルの色等)
      'Order: 並べ替えの順序(昇順・降順)   CustomOrder:ユーザー定義の並べ替えの順序
      'DataOption:数値とテキストの並べ替えの選択

      'B 列を基準に、値 を基準に、昇順で、テキストを数値データとして並べ替えます。
      'SortFields.Add メソッド は、新しい並べ替えフィールドを作成し、SortFields オブジェクトを返すので
      '変数に受けて解放してやらないとプロセスが終了しません。(ただ、このような使い方が正しいのかは、疑問)
      xlSortFields1 = .Add(Key:=xlRange1, SortOn:=Excel.XlSortOn.xlSortOnValues, _
                     Order:=Excel.XlSortOrder.xlAscending, _
                        DataOption:=Excel.XlSortDataOption.xlSortTextAsNumbers)
      'Sort オブジェクトの開始位置と終了位置を設定します
      xlSort.SetRange(xlRange)
      '最初の行にヘッダー情報が含まれるかどうかを指定します
      xlSort.Header = Excel.XlYesNoGuess.xlNo    '範囲全体が並べ替えの対象になります。
      '大文字と小文字を区別して検索するには、True に設定します
      xlSort.MatchCase = False
      '並べ替え方向を指定します
      xlSort.Orientation = Excel.XlSortOrientation.xlSortColumns  '列単位で並べ替え
      '中国語の並べ替え方法を指定します
      xlSort.SortMethod = Excel.XlSortMethod.xlPinYin  '中国語の発音表記の順で並べ替え
     'コピーした並べ替え書式を適用します。
      xlSort.Apply()
   End With
   MRComObject(xlRange)
   MRComObject(xlSortFields1)
   MRComObject(xlSortFields)
   MRComObject(xlSort)
   MRComObject(xlRange1)
   '確認のために、3秒間表示しておく
   System.Threading.Thread.Sleep(3000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010 から Excel のシートの指定の範囲のデータを取得(VB.NET)  (No.26の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:24
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,クリップボード,セルの個数を取得,1次元配列に確保*
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel のシートの指定の範囲のデータを取得
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button24_Click(sender As System.Object, e As System.EventArgs) Handles Button24.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '===================== シートの指定の範囲のデータを取得 ======================
   '--------------------------------------------------------------------------
   '仮データの入力
   Dim xlRange As Excel.Range = Nothing
   For r As Integer = 1 To 20
      For c As Integer = 1 To 10
         xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c))
         xlRange.Value = Str(r) & "," & Str(c)
         MRComObject(xlRange)
      Next
   Next

   'データを取得したい範囲を設定
   xlRange = xlSheet.Range("B3:D10")
   'クリップボードにコピーする場合
   xlRange.Copy()
   'Count プロパティでセルの個数を取得
   Dim xlCells As Excel.Range
   xlCells = xlRange.Cells
   Dim n As Integer = xlCells.Count
   MRComObject(xlCells)

   Dim dat(n - 1) As String
   Dim no As Integer = -1
   Dim xlElement As Excel.Range = Nothing
   For Each xlElement In xlRange
      no += 1
      '指定範囲内のセルの値を1次元配列に確保
      dat(no) = xlElement.Value.ToString()
      MRComObject(xlElement)
   Next
   MRComObject(xlRange)

   '取得したデータを表示
   'VB のリストボックスに表示する場合
   ListBox1.Items.AddRange(dat)

   'Debug.Print で表示
   For i As Integer = 0 To n - 1
      Debug.Print(dat(i))
   Next

   'VB のテキストボックスに表示
   Dim iData As IDataObject = Clipboard.GetDataObject()
   'クリップボードにテキストデータがあれば
   If iData.GetDataPresent(DataFormats.Text) Then
      TextBox1.Text = DirectCast(iData.GetData(DataFormats.UnicodeText), String)
   End If
   '確認のために、2秒間表示しておく
   System.Threading.Thread.Sleep(2000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010 から Excel の既存のファイルを印刷(VB.NET)  (No.27の個別表示) [スレッド一覧へ]
日時: 2012/05/29 13:58
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,印刷,用紙サイズ,印刷の向き,余白を設定,部数      *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel の既存のファイルを印刷
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button25_Click(sender As System.Object, e As System.EventArgs) Handles Button25.Click
   'テスト用の適当なファイルを用意しておいて下さい。
   '既存のファイルをオープンして、Excel を起動
   Call ExcelOpen(System.IO.Path.GetFullPath("..\..\..\data\DBTest.xls"), "Sheet1")
   '========================== 既存のファイルを印刷 =============================

   '[ページ設定]ダイアログボックスを表示(参考)
   'xlApp.Dialogs(Excel.XlBuiltInDialog.xlDialogPageSetup).Show()

   '印刷プレビューを表示(参考までに)
   'System.Threading.Thread.Sleep(3000)

   'シートの印刷設定
   Dim xlPageSetup As Excel.PageSetup
   xlPageSetup = xlSheet.PageSetup
   With xlPageSetup
      .PaperSize = Excel.XlPaperSize.xlPaperA4    '用紙サイズをA4
      '印刷の向き 横=xlLandscape   縦 = xlPortrait
      .Orientation = Excel.XlPageOrientation.xlPortrait
      '各余白をセンチ(Cm)単位で設
      '    ↓Application でも参照できるが解放されない
      .LeftMargin = xlApp.CentimetersToPoints(2)      '左余白を 20 mm に設定
      .RightMargin = xlApp.CentimetersToPoints(2)     '右余白を 20 mm に設定
      .TopMargin = xlApp.CentimetersToPoints(2.5)     '上余白を 25 mm に設定
      .BottomMargin = xlApp.CentimetersToPoints(2.5)  '上余白を 25 mm に設定
      .HeaderMargin = xlApp.CentimetersToPoints(1)    'ヘッダーの余白を 10 mm に設定
      .FooterMargin = xlApp.CentimetersToPoints(1)    'フッターの余白を 10 mm に設定
   End With

   'シートを印刷     2部印刷
   'PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, _
   '                             Collate, PrToFileName, IgnorePrintAreas)
   'PrintOut と同様 Excel 2007 の VBA のヘルプでは見当たらないので、MSDN で調べて下さい。
   xlSheet.PrintOutEx(, , 2)
   MRComObject(xlPageSetup)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010 から Excel のシートの指定範囲を印刷する(VB.NET)  (No.28の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:25
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,印刷,印刷する範囲を指定                         *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel のシートの指定範囲を印刷する
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button26_Click(sender As System.Object, e As System.EventArgs) Handles Button26.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '=========================== 指定範囲を印刷する ==============================
   '--------------------------------------------------------------------------
   '仮データの入力
   Dim xlRange As Excel.Range = Nothing
   For r As Integer = 1 To 80
      For c As Integer = 1 To 15
         xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c))
         xlRange.Value = Str(r) & "," & Str(c)
         MRComObject(xlRange)
      Next
   Next

   '指定範囲を格子で罫線を引く(指定範囲を印刷する事とは関係ありません)
   ' 罫線を引く場合は、下記を参照して下さい。
   ' http://www.hanatyan.sakura.ne.jp/dotnet/Excel06.htm#no3 
   Call SetLine(1, 1, 40, 8, Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, 0)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   Dim xlPageSetup As Excel.PageSetup
   xlPageSetup = xlSheet.PageSetup
   xlPageSetup.PrintArea = "A1:H40"
   xlSheet.PrintOutEx()
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)
   MRComObject(xlPageSetup)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010 から Excel の印刷プレビューの画面を閉じる(VB.NET)  (No.29の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:27
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,印刷,印刷する範囲を指定                         *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel の印刷プレビューの画面を閉じる
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button27_Click(sender As System.Object, e As System.EventArgs) Handles Button27.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '======================= 印刷プレビューの画面を閉じる ========================
   '仮データの入力
   Dim xlRange As Excel.Range = Nothing
   For r As Integer = 1 To 80
      For c As Integer = 1 To 15
         xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c))
         xlRange.Value = Str(r) & "," & Str(c)
         MRComObject(xlRange)
      Next
   Next
   '--------------------------------------------------------------------------
   '現在表示している Excel のタイトルを取得する
   title = xlApp.Caption
   sleepTime = 3000     '指定ミリ秒後に BackgroundWorker を実行する
   'バックグラウンド操作の実行を開始
   '指定時間後に別スレッドから印刷プレビューの画面を閉じる
   Me.BackgroundWorker1.RunWorkerAsync()
   '印刷プレビューを表示する
   xlSheet.PrintPreview()

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub

'別途、ツールボックスから BackgroundWorker1 を貼り付けておいて下さい。
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As  _
            System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
   '指定時間操作の開始を待つ(別スレッド内なので問題ないかと)
   System.Threading.Thread.Sleep(sleepTime)

   Dim hwnd As IntPtr
   'タイトル名を指定して Excel のウィンドウハンドルを取得
   hwnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, vbNullString, title)
   'AppActivate(title)   '前面に表示するでもいいが、後の事も考えて
   '現在使用している Excel をアクティブにする
   SetForegroundWindow(hwnd)

   'Excel に Excel のショートカットキーを送る
   '簡便的に SendKeys を使って
   SendKeys.SendWait("{ESC}")

   'できれば、下記の SendInput 関数を使った方法でキーを送信して下さい。
   ' http://hanatyan.sakura.ne.jp/patio/read.cgi?no=245

   'Dim ki As New SendInput.Helper()
   'ki.KyeReSet()                       'キー操作の初期化
   ''閉じる場合(ESC キーを押す 又は、Ctr + C でも同じ)
   'ki.KeyDown(Keys.Escape)             'ESC キーを押す
   'ki.KeyUP(Keys.Escape)               'ESC キーを放す
   'ki.KeyStroke()                      '上記一連のキー操作を実行
End Sub

#Region "Win32 API 関数の宣言及び変数の宣言"

''' <summary>
''' 指定のウィンドウをZオーダーのトップ位置に移動しアクティブにする(P99)
''' </summary>
''' <param name="hWnd">フォアグラウンドにするウィンドウのハンドルを指定</param>
''' <returns>正常終了の場合=0 以外  エラーの時= 0</returns>
<DllImport("USER32.DLL", CharSet:=CharSet.Auto)> _
Private Shared Function SetForegroundWindow( _
   ByVal hWnd As IntPtr) As IntPtr
End Function

''' <summary>
''' クラス名又はキャプションタイトルを与えてウインドウのハンドルを取得
''' </summary>
''' <param name="hWnd1">
''' 検索する子ウィンドウの親ウィンドウのハンドルを指定、
''' NULLを指定すると、デスクトップウィンドウが親ウインドウとして使われ
''' デスクトップの子ウィンドウが探されます
''' </param>
''' <param name="hWnd2">子ウィンドウのハンドルを指定</param>
''' <param name="lpsz1">クラス名又は、クラス名を指定するグローバルアトム</param>
''' <param name="lpsz2">ウィンドウのタイトルでNULLを指定するとクラス名のみで検索する</param>
''' <returns>関数が成功すると、指定したクラスとウィンドウ名を持つウィンドウのハンドルが返り
'''      関数が失敗すると、NULL が返ります</returns>
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function FindWindowEx( _
   ByVal hWnd1 As IntPtr, _
   ByVal hWnd2 As IntPtr, _
   ByVal lpsz1 As String, _
   ByVal lpsz2 As String) As IntPtr
End Function

Private title As String    'Excel のタイトル名
Private sleepTime As Integer   '待ち時間を指定するための変数

#End Region
メンテ
Excel 2010 で印刷中のダイアログを非表示にして印刷(VB.NET)  (No.30の個別表示) [スレッド一覧へ]
日時: 2012/05/29 14:06
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,印刷中のダイアログ,非表示,表示しない            *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:Excel 2010 で印刷中のダイアログを非表示にして印刷
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

以前のバージョン等では、下記の方法で印刷中のダイアログを非表示にして印刷できたのですが
ForegroundWindow の仕様が変更されてから(未確認)か、ダイアログの枠等が表示されたままに
なってしまい、ダイアログを閉じてみたり、色々試したが良い方法が見つかりません。
http://hanatyan.sakura.ne.jp/patio/read.cgi?no=220
色々、思考錯誤した結果下記の方法しか見つかりませんでした。
色んな環境で試したものでもないので場合によっては、非表示ならない等の問題が発生するかも知れません。

テストされましたら、結果等を[雑談用掲示板]の方にでも書いて頂けると幸いかと。

'--------------------------------------------------------------------------------------------------
Private Sub Button28_Click(sender As System.Object, e As System.EventArgs) Handles Button28.Click
   'テスト用の適当なファイル(印刷に時間がかかるような)を用意しておいて下さい。
   '既存のファイルをオープンして、Excel を起動
   Call ExcelOpen(System.IO.Path.GetFullPath("..\..\..\data\DBTest.xls"), "Sheet1")
   '===================== 印刷中のダイアログを非表示に設定 ======================
   '表示状態でも、非表示でも同じです。
   xlApp.Visible = False
   '確認のために、2秒間表示しておく
   System.Threading.Thread.Sleep(2000)

   'バックグラウンドで、印刷中のダイアログが表示されたら閉じる
   Me.BackgroundWorker2.RunWorkerAsync()
   '印刷開始 100 部(プリンターの電源を切ってから試すと用紙が無駄になりません。)
   xlSheet.PrintOutEx(, , 20)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub

'別途、ツールボックスから BackgroundWorker2 を貼り付けておいて下さい。
Private Sub BackgroundWorker2_DoWork(ByVal sender As Object, ByVal e As  _
            System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork
   Dim counter As Integer = 0
   Dim wid As Integer = Screen.PrimaryScreen.Bounds.Width \ 2
   Dim hei As Integer = Screen.PrimaryScreen.Bounds.Height \ 2
   Do While counter < 50      '指定の回数繰り返したら終了
      '画面の中心(ダイアログが表示される位置)にカーソルを移動する。
      '(ダイアログがカーソルの裏になって再描画されなくなる)
      Cursor.Position = New Point(wid, hei)

      '印刷中のダイアログのハンドルを取得
      Dim hwnd As IntPtr = FindWindowEx(IntPtr.Zero, IntPtr.Zero, vbNullString, "印刷中")
      If hwnd <> IntPtr.Zero Then
         MoveWindow(hwnd, 0, 0, 0, 0, False)
         Exit Do
      End If
      System.Threading.Thread.Sleep(1)
      counter += 1
   Loop
End Sub



'#Region "Win32 API 関数の宣言及び変数の宣言" のところへ下記 API を追加願います。

<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function MoveWindow( _
   ByVal hwnd As IntPtr, _
   ByVal x As Integer, _
   ByVal y As Integer, _
   ByVal nWidth As Integer, _
   ByVal nHeight As Integer, _
   ByVal bRepaint As Boolean) As Integer
End Function

メンテ
Excel 2010 で行列を入れ替え及び型式を指定して保存(VB.NET)  (No.31の個別表示) [スレッド一覧へ]
日時: 2012/06/01 22:06
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,行列入替,行と列,入れ替え,保存形式,CSV形式で保存 *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.07
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:Excel 2010 で行列を入れ替え及び型式を指定して保存
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

Private Sub Button29_Click(sender As System.Object, e As System.EventArgs) Handles Button29.Click
   '既存のファイルをオープンして、Excel を起動
   Call ExcelOpen(System.IO.Path.GetFullPath("..\..\..\data\dbtest.xls"), "Sheet1")
   '================== 行列を入れ替え及び型式を指定して保存 =====================

   Dim xlRange As Excel.Range
   Dim xlSheet2 As Excel.Worksheet = DirectCast(xlSheets.Item(2), Excel.Worksheet)
   xlRange = xlSheet.Range("A1")
   xlRange.Activate()
   Dim xlCurrentRegion As Excel.Range
   xlCurrentRegion = xlRange.CurrentRegion
   'セル A1 を含むデータ入力範囲をコピー
   xlCurrentRegion.Copy()
   MRComObject(xlCurrentRegion)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   'コピーしたデータを Sheet2 のセル A1 に行列を入れ替えて貼り付け
   xlSheet2.Select()
   Dim xlRange2 As Excel.Range
   xlRange2 = xlSheet2.Range("A1")
   xlRange2.Select()
   'Range(データ) をクリップボードから指定範囲に貼り付けます。
   xlRange2.PasteSpecial(Paste:=Excel.XlPasteType.xlPasteAll, _
         Operation:=Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, _
                                          SkipBlanks:=False, Transpose:=True)

   xlApp.DisplayAlerts = False   '保存時の問合せのダイアログを非表示に設定

   ' xls 形式で名前をつけて保存(Excel 97〜2003 ブック形式)
   xlBook.SaveAs(Filename:=IO.Path.GetFullPath(".\Test.xls"), _
                                 FileFormat:=Excel.XlFileFormat.xlExcel8)
   ' xlsx 形式で名前をつけて保存(Excel 2007〜ブック形式)
   xlBook.SaveAs(Filename:=IO.Path.GetFullPath(".\Test.xlsx"), _
                                    FileFormat:=Excel.XlFileFormat.xlOpenXMLWorkbook)
   ' xlsm 形式で名前をつけて保存(Excel 2007〜マクロ有効ブック形式)
   xlBook.SaveAs(Filename:=IO.Path.GetFullPath(".\Test.xlsm"), _
                        FileFormat:=Excel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled)
   ' csv 形式で名前をつけて保存(CSV (カンマ区切り) 形式)
   xlBook.SaveAs(Filename:=IO.Path.GetFullPath(".\Test.csv"), _
                                       FileFormat:=Excel.XlFileFormat.xlCSV)
   MRComObject(xlRange)
   MRComObject(xlRange2)
   MRComObject(xlSheet2)
   '確認のために、2秒間表示しておく
   System.Threading.Thread.Sleep(2000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xls"), False)   'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010 から Excel のセルに関する操作、1行 Tips 集その1(VB.NET)  (No.32の個別表示) [スレッド一覧へ]
日時: 2012/06/06 19:29
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,セルに関する操作,行と列,セル参照,セル操作,範囲  *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.11
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel のセルに関する操作、1行 Tips 集その1(VB.NET)
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0
本来なら最初の方に書くべき事ですが、前後の処理を省略して書くと、誤解されプロセスが
解放されない等のトラブルが発生し兼ねないので、ここに書く事にしました。
ここでは、単純な使用方法で紹介しておりますので、詳しい(目的に合った)使い方等は
ご自分で調べるなり、試すなりして下さい。
尚、この Tips を使用される場合は、Excel の Com オブジェクトの解放に関する処理を理解
されてから使用するようにして下さい。

Private Sub Button30_Click(sender As System.Object, e As System.EventArgs) Handles Button30.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '====================== セルに関する操作1行Tips集その1 =====================

   '1.単一セルを参照する場合
   'Worksheets("Sheet1").Range("A1").Value = 3.14159  'VBA の表記
   'xlSheet.Range("A1").Value = 3.14159   'VB6.0 用の表記(.NET 系では、使用しない事)

   '上記のコードだけなら.NET系でも解放はされますが、色々参照している内に
   '解放されない等トラブルを防ぐ意味でも下記のように一度、変数に受けて下さい。

   Dim xlRange As Excel.Range = xlSheet.Range("A1")      '.NET 系の表記
   xlRange.Value2 = 3.14159
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '2.離れた単一セルを参照する場合
   xlRange = xlSheet.Range("A3,D1,C2")
   xlRange.Value = 12345
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '3.セル範囲を参照する場合その1
   xlRange = xlSheet.Range("A1:C3")
   xlRange.Select()
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '下記でも同じ事です。
   xlRange = xlSheet.Range("A1", "D4")
   xlRange.Select()
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '4.離れたセル範囲を参照する場合その2
   xlRange = xlSheet.Range("A1:C3,A6:C9,E1:H4")
   xlRange.Select()
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '5.1列全体を参照する場合
   xlRange = xlSheet.Range("C:C")
   xlRange.Select()
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '6.複数列全体を参照する場合
   xlRange = xlSheet.Range("C:D, F:F, H:H")
   xlRange.Select()
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '7.1行全体を参照する場合
   xlRange = xlSheet.Range("2:2")
   xlRange.Select()
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '8.複数行全体を参照する場合
   xlRange = xlSheet.Range("4:6, 9:10, 12:12")
   xlRange.Select()
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '9.Worksheet.Cells プロパティを使って全セルを参照する
   Dim xlCells As Excel.Range = xlSheet.Cells()
   xlCells.Select()
   MRComObject(xlCells)

   '10.Range.Cells プロパティを使ってセルを参照する
   'Cells プロパティは、セルの指定方法が、Cells(行番号,列番号)のようになり、C5 等の通常の
   '指定方法と行と列の順序が逆になりますので注意して下さい。

   'シート 1 のセル範囲 A1:C5 のフォント スタイルを斜体に設定する VBA の使用例
   'Worksheets("Sheet1").Activate()                
   'Range(Cells(1, 1), Cells(5, 3)).Font.Italic = True
   '-------------------------------------------------------------------------------
   '上記操作をVB2010用に書き換えると
   '上記は、下記のようにした方が無難です。
   Dim xlRange1 As Excel.Range = xlSheet.Range(R1ToA1(1, 1) & ":" & R1ToA1(5, 3))
   'のようにして、Cellsプロパティを使わないようにして見て下さい。
   'xlRange1.Font.Italic = True  のような使い方は、しない事
   Dim xlFont As Excel.Font = xlRange1.Font
   xlFont.Italic = True
   MRComObject(xlFont)
   MRComObject(xlRange1)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '11.セルに値を設定する
   'Value プロパティとValue2 プロパティの違いは、通貨型及び日付型のデータを使用しない事です
   xlRange = xlSheet.Range("A1")
   xlRange.Value = System.DateTime.Now
   Dim xlOffsetRange As Excel.Range
   xlOffsetRange = xlRange.Offset(1)
   xlOffsetRange.Value2 = System.DateTime.Now
   MRComObject(xlOffsetRange)
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '12.セルの値を取得する
   xlRange = xlSheet.Range("A1")
   Debug.Print(xlRange.Value.ToString)             '2012/05/11 11:50:07
   xlOffsetRange = xlRange.Offset(1)
   xlOffsetRange.NumberFormatLocal = "yyyy/mm/dd hh:MM:ss"
   Debug.Print(xlOffsetRange.Value2.ToString)  '41040.4931328588
   Debug.Print(xlOffsetRange.Value.ToString)   '2012/05/11 11:50:06
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)
   MRComObject(xlOffsetRange)
   MRComObject(xlRange)

   '13.セルに数式を設定する
   'Range.Formula プロパティは、数式を、A1 参照形式で、取得、又は設定します。
   xlRange = xlSheet.Range("C1")
   xlRange.Value = 123
   xlOffsetRange = xlRange.Offset(ColumnOffset:=1)
   xlOffsetRange.Value = 321
   MRComObject(xlRange)          'ここも一旦デクリメントしておく事
   xlRange = xlSheet.Range("E1")
   xlRange.Formula = "=C1+D1"
   MRComObject(xlOffsetRange)
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '14.セルの数式を取得する
   xlRange = xlSheet.Range("E1")
   Debug.Print(xlRange.Value.ToString)             '444
   Debug.Print(xlRange.Formula.ToString)           '=C1+D1
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '15.AutoFill メソッドを使ってセルに連続してデータを入力する
   'AutoFill メソッド : 指定された対象セル範囲内のセルに対してオートフィルを実行します。
   xlRange = xlSheet.Range("A1")
   xlRange.Value = "1月"
   xlRange1 = xlSheet.Range("A1:L1")
   'セル A1 〜 L1 まで、1月 〜 12月 と入力します。
   '下記のように直接範囲(xlSheet.Range("A1:L1"))を指定しない事
   'xlRange.AutoFill(Destination:=xlSheet.Range("A1:L1"), Type:=Excel.XlAutoFill ...)
   xlRange.AutoFill(Destination:=xlRange1, Type:=Excel.XlAutoFillType.xlFillMonths)
   MRComObject(xlRange1)
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
Excelのセルに関する操作(Addressプロパティの使用例)(VB.NET)  (No.33の個別表示) [スレッド一覧へ]
日時: 2012/06/10 10:14
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,セルに関する操作,行と列,セル参照,セル操作,範囲  *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.11
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel のセルに関する操作(Address プロパティの使用例)(VB.NET)
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0
まずは、>>32 VB2010 から Excel のセルに関する操作、1行 Tips 集その1 をご覧になってから
こちらをご覧下さい。
尚、この Tips を使用される場合は、Excel の Com オブジェクトの解放に関する処理を理解
されてから使用するようにして下さい。
'-------------------------------------------------------------------------------

Private Sub Button35_Click(sender As System.Object, e As System.EventArgs) Handles Button35.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '========================= Address プロパティの使用例 ========================
   '-------------------------------------------------------------------------------
   '1.セル(範囲)のアドレスを取得する
   ' ここにきて、Address プロパティ を多用していて、Excel.exe が解放されなくなったので
   ' Tips 集を見直すにあたり、調べて解った事を書いておきます。
   ' Range.Address(プロパティ) をVBA のヘルプで見ると以下のようになっております。
   ' コード記述時の言語で参照範囲を表す文字列型 (String) の値を返します。
   ' 式.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo)
   ' 式   Range オブジェクトを表す変数です。

   ' 使用例()
    'mc = Worksheets("Sheet1").Cells(1, 1)
    'MsgBox(mc.Address())                              ' $A$1
    'MsgBox(mc.Address(RowAbsolute:=False))            ' $A1
    'MsgBox(mc.Address(ReferenceStyle:=xlR1C1))        ' R1C1
    'MsgBox(mc.Address(ReferenceStyle:=xlR1C1, RowAbsolute:=False, _
    '        ColumnAbsolute:=False, RelativeTo:=Worksheets(1).Cells(3, 3))) ' R[-2]C[-2]

    'となっており、VB2010 用に書きかえるのもそう難しいことでもないかと思います。

   '通常は、下記のように書きかえて使用すれば問題はないのですが...。
   Dim xlRange As Excel.Range = Nothing
   xlRange = xlSheet.Range("A1:D5")
   Dim adrs1, adrs2, adrs3, adrs4 As String
   adrs1 = xlRange.Address                         ' $A$1:$D$5
   adrs2 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False)     ' A1:D5
   adrs3 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False, _
                           ReferenceStyle:=Excel.XlReferenceStyle.xlA1)   ' A1:D5

   adrs4 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False, _
                           ReferenceStyle:=Excel.XlReferenceStyle.xlR1C1) ' RC:R[4]C[3]
   MRComObject(xlRange)
   MessageBox.Show(Me, String.Format( _
            "adrs1={0:} adrs2={1:} adrs3={2:} adrs4={3:}", adrs1, adrs2, adrs3, adrs4))

   '個々で使用する場合は、問題無いのですが、以下で紹介するコードと同じプロシージャ内で使用すると
   'Excel.exe が解放されず、プログラムを終了するまで、タスクマネージャに残ったままになったり
   'する場合があります。
   '-------------------------------------------------------------------------------

   'プロセスが解放され易くしたコード(逐次デクリメントを実施)
   xlRange = xlSheet.Range("B3:F7")
   adrs1 = xlRange.Address                         ' $B$3:$F$7
   MRComObject(xlRange)

   xlRange = xlSheet.Range("B3:F7")
   adrs2 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False)     ' B3:F7
   MRComObject(xlRange)

   xlRange = xlSheet.Range("B3:F7")
   adrs3 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False, _
                           ReferenceStyle:=Excel.XlReferenceStyle.xlA1)   ' B3*F7
   MRComObject(xlRange)

   xlRange = xlSheet.Range("B3:F7")
   adrs4 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False, _
                           ReferenceStyle:=Excel.XlReferenceStyle.xlR1C1) ' R[2]C[1]:R[6]C[5]
   MRComObject(xlRange)

   MessageBox.Show(Me, String.Format( _
            "adrs1={0:} adrs2={1:} adrs3={2:} adrs4={3:}", adrs1, adrs2, adrs3, adrs4))

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010 から Excel のセルに関する操作、1行 Tips 集その2(VB.NET)  (No.34の個別表示) [スレッド一覧へ]
日時: 2012/06/10 10:27
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,セルに関する操作,行と列,セル参照,セル操作,範囲  *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.11
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel のセルに関する操作1行Tips集その2(VB.NET)
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0
まずは、>>32 VB2010 から Excel のセルに関する操作、1行 Tips 集その1 をご覧になってから
こちらをご覧下さい。
尚、この Tips を使用される場合は、Excel の Com オブジェクトの解放に関する処理を理解
されてから使用するようにして下さい。
'-------------------------------------------------------------------------------

Private Sub Button31_Click(sender As System.Object, e As System.EventArgs) Handles Button31.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動

   '==================== セルに関する操作1行Tips集その2 =======================

   '1.アクティブ セル領域(空白行と空白列で囲まれたセル範囲)を取得
   Dim adrs1, adrs2 As String
   Dim msg As String = ""
   Dim xlRange As Excel.Range = Nothing
   'Worksheet.Range プロパティは、セルまたはセル範囲を表す Range オブジェクトを返します。
   xlRange = xlSheet.Range("A1:D5") 'xlSheet.Range プロパティが返す、Range オブジェクトを取得
   xlRange.Value = 123              '指定範囲内に仮データを入力
   MRComObject(xlRange)             '従って使い終わったら直ぐ、デクリメントする事。
   'ここで、違うセルを参照しているので(又は、変数名を別にするとか)
   xlRange = xlSheet.Range("F1:K5")
   xlRange.Value = "F1〜K5"
   MRComObject(xlRange)

   'セル "A1:D5" の範囲と"F1:K5" の範囲にデータが入っているものとして
   xlRange = xlSheet.Range("B2")
   Dim xlCurrentRegion As Excel.Range = Nothing
   'Range.CurrentRegion プロパティは、アクティブ セル領域(Range オブジェクト)を返します。
   xlCurrentRegion = xlRange.CurrentRegion
   adrs1 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   adrs2 = xlCurrentRegion.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   MRComObject(xlCurrentRegion)
   MRComObject(xlRange)
   msg = "No.1 セル [{0:}] のアクティブ セル領域は、[{1:}] です。"
   MessageBox.Show(Me, String.Format(msg, adrs1, adrs2))

   xlRange = xlSheet.Range("H3")
   xlCurrentRegion = xlRange.CurrentRegion
   adrs1 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   adrs2 = xlCurrentRegion.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   MRComObject(xlRange)
   MRComObject(xlCurrentRegion)
   MessageBox.Show(Me, String.Format(msg, adrs1, adrs2))
   '-------------------------------------------------------------------------------
   xlRange = xlSheet.Range("A1:L20")
   xlRange.Value = Nothing
   MRComObject(xlRange)
   MessageBox.Show(Me, "一旦データを削除しました。")
   '-------------------------------------------------------------------------------
   '2.現在のセルに対して相対的な位置を指定・取得
   xlRange = xlSheet.Range("A1:D5")
   xlRange.Value = "A1〜D5"
   Dim xlOffsetRange As Excel.Range = Nothing
   'Range.Offset プロパティは、指定された範囲からのオフセットの範囲を表す Range オブジェクトを返す
   xlOffsetRange = xlRange.Offset(RowOffset:=2, ColumnOffset:=6)
   xlOffsetRange.Value = "Offset"
   adrs1 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   MRComObject(xlRange)
   adrs2 = xlOffsetRange.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   MRComObject(xlOffsetRange)
   msg = "No.2 セル[{0:}]の Offset(RowOffset:=2, ColumnOffset:=6) の領域は、[{1:}]です。"
   MessageBox.Show(Me, String.Format(msg, adrs1, adrs2))
   'Offset プロパティの使用例は、VB2010からExcelを操作するためのワンポイントテクニック集内でも
   '幾つか使っていますので、最上部の[このページ内の検索ができます。]の所の検索ボックスに
   '[Offset]をキーにして検索して見て下さい。
   '-------------------------------------------------------------------------------
   '3.対象となるセルが含まれる領域の終端のセルを取得
   'End + 方向キー (↑、↓、←、→のいずれか) に相当します。
   xlRange = xlSheet.Range("A1:E6")    'A1:E6 の範囲に仮データを入力
   xlRange.Value = "A1〜E6"
   MRComObject(xlRange)

   Dim xlRangeEnd As Excel.Range
   xlRange = xlSheet.Range("D3")
   'Range.End プロパティは,対象となるセルが含まれる領域の終端のセルを示すRangeオブジェクトを返す
   xlRangeEnd = xlRange.End(Excel.XlDirection.xlToLeft)
   adrs1 = xlRangeEnd.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   MRComObject(xlRangeEnd)
   MRComObject(xlRange)
   msg = "No.3 セル範囲 A1:E6 に対するセル位置 D3 からの左端のセル位置は、"
   MessageBox.Show(Me, msg & adrs1 & " です。")

   xlRange = xlSheet.Range("D3")
   xlRangeEnd = xlRange.End(Excel.XlDirection.xlToRight)
   adrs1 = xlRangeEnd.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   MRComObject(xlRangeEnd)
   MRComObject(xlRange)
   msg = "No.3 セル範囲 A1:E6 に対するセル位置 D3 からの右端のセル位置は、"
   MessageBox.Show(Me, msg & adrs1 & " です。")

   xlRange = xlSheet.Range("D3")
   xlRangeEnd = xlRange.End(Excel.XlDirection.xlUp)
   adrs1 = xlRangeEnd.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   MRComObject(xlRangeEnd)
   MRComObject(xlRange)
   msg = "No.3 セル範囲 A1:E6 に対するセル位置 D3 からの上端のセル位置は、"
   MessageBox.Show(Me, msg & adrs1 & " です。")

   xlRange = xlSheet.Range("D3")
   xlRangeEnd = xlRange.End(Excel.XlDirection.xlDown)
   adrs1 = xlRangeEnd.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   MRComObject(xlRangeEnd)
   MRComObject(xlRange)
   msg = "No.3 セル範囲 A1:E6 に対するセル位置 D3 からの下端のセル位置は、"
   MessageBox.Show(Me, msg & adrs1 & " です。")

   '-------------------------------------------------------------------------------
   '4.指定されたワークシートで使われたセル範囲を取得
   'Worksheet.UsedRange プロパティは、指定されたワークシートで使われた
   'セル範囲(Range オブジェクト)を返します。
   xlRange = xlSheet.UsedRange
   adrs1 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   MRComObject(xlRange)
   msg = "No.4 指定のシート内での使用済みセル範囲は、[ "
   MessageBox.Show(Me, msg & adrs1 & " ]です。")
   '-------------------------------------------------------------------------------
   '5.指定のセル範囲から指定した列数、行数分のセル範囲にサイズ変更し変更されたセル範囲を取得
   'Range.Rows プロパティは、指定されたセル範囲の行を表す Range オブジェクトを返します。
    xlRange = xlSheet.Range("B3")
   xlCurrentRegion = xlRange.CurrentRegion  'A1:E6
   Dim xlResize As Excel.Range = Nothing
   Dim rowsCount, columnsCount As Integer
   Dim xlRows As Excel.Range = Nothing
   Dim xlColumns As Excel.Range = Nothing
   xlRows = xlCurrentRegion.Rows

   rowsCount = xlRows.Count
   'Range.Columns プロパティは、指定されたセル範囲の列を表す Range オブジェクトを返します。
   xlColumns = xlCurrentRegion.Columns
   columnsCount = xlColumns.Count
   xlResize = xlCurrentRegion.Resize(rowsCount + 1, columnsCount + 1)
   MRComObject(xlColumns)
   MRComObject(xlRows)

   'Excel をアクティブにする(エクセルにフォーカスを移す。)
   AppActivate(xlApp.Caption)    '必要ありませんが、見た目に解り易くする為に
   xlResize.Select()             'サイズ変更した範囲を選択

   adrs1 = xlResize.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   MRComObject(xlResize)
   MRComObject(xlCurrentRegion)
   MRComObject(xlRange)
   msg = "No.5 セルB3に対するセル範囲[A1:E6]に対して、行・列 +1 したセル位置は、"
   MessageBox.Show(Me, msg & adrs1 & " です。")
   '-------------------------------------------------------------------------------
   '-------------------------------------------------------------------------------
   '6.セルを結合(マージ)する
   Dim xlMergeRange As Excel.Range
   xlMergeRange = xlSheet.Range("B10:D10")
   'Range.Merge メソッドは、Range オブジェクト内のセルを結合して 1 つのセルにします。
   xlMergeRange.Merge()
   xlMergeRange.Value = "セル [B10:D10] を結合しました"
   MRComObject(xlMergeRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)
   '-------------------------------------------------------------------------------
   '7.指定のセル位置の結合セル範囲を取得する
   '指定のセルが結合セル範囲にある場合
   'Range.MergeArea プロパティは、指定されたセルがある結合セル範囲を表すRangeオブジェクトを返す
   xlMergeRange = xlSheet.Range("C10")
   Dim xlMergeArea As Excel.Range
   xlMergeArea = xlMergeRange.MergeArea
   adrs1 = xlMergeArea.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   MessageBox.Show(Me, "No.7 C10 の xlMergeArea セル位置は、" & adrs1 & " です。")
   MRComObject(xlMergeArea)
   MRComObject(xlMergeRange)

   '指定のセルが結合セル範囲にない場合は、指定したセル位置が返る
   xlMergeRange = xlSheet.Range("A10")
   xlMergeArea = xlMergeRange.MergeArea
   adrs1 = xlMergeArea.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   MessageBox.Show(Me, "No.7 A10 の xlMergeArea セル位置は、" & adrs1 & " です。")
   MRComObject(xlMergeArea)
   MRComObject(xlMergeRange)

   '-------------------------------------------------------------------------------
   '8.指定のセル範囲に結合セルが含まれているかどうかを調べる
   'Range.MergeCells プロパティは、セル範囲に結合セルが含まれている場合は、True を返します。
   xlRange = xlSheet.Range("C10")
   If CBool(xlRange.MergeCells) = True Then
      MessageBox.Show(Me, "No.8 セル範囲(""C10"")には、結合セルが含まれます")
   End If
   MRComObject(xlRange)

   xlRange = xlSheet.Range("A10")
   If CBool(xlRange.MergeCells) = True Then
      MessageBox.Show(Me, "No.8 セル範囲(""A10"")には、結合セルが含まれます")
   Else
      MessageBox.Show(Me, "No.8 セル範囲(""A10"")には、結合セルが含まれていません")
   End If
   MRComObject(xlRange)
   '-------------------------------------------------------------------------------
   '9.使用されたセル範囲内の最後のセルを取得
   'Range.SpecialCells メソッドは、指定された条件を満たしているすべてのセルを返します。
   Dim xlSpCells As Excel.Range
   Dim xlRange2 As Excel.Range      'この場合、変数名を別にしないと解放されない。
   xlSpCells = xlSheet.Cells
   xlRange2 = xlSpCells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell)
   xlRange2.Activate()
   adrs1 = xlRange2.Address(RowAbsolute:=False, ColumnAbsolute:=False)
   MRComObject(xlRange2)
   MRComObject(xlSpCells)
   MessageBox.Show(Me, "No.9 指定のシート内での使用済みの最後のセルは、[ " & adrs1 & " ]です。")
   '-------------------------------------------------------------------------------
   '11.指定のセル範囲内の空白のセルに、0 を代入する。
   xlRange = xlSheet.Range("A1:D5")
   xlRange.Activate()
   xlRange.Value = ""     '空白のセルを作成する
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   'セル "B2:C4" の範囲に仮のデータを表示
   xlRange = xlSheet.Range("B2:C4")
   xlRange.Value = "1234"
   MRComObject(xlRange)

   Dim xlBlanksRange As Excel.Range = Nothing
   Dim nn As Integer = 0
   Dim xlRange1 As Excel.Range        'この場合、変数名を別にしないと解放されない。
   xlRange1 = xlSheet.Range("A1:D5")
   '※ SpecialCells メソッドは、指定した範囲に該当のセルが見つからない場合エラーとなります。
   Try
      '空白のセルを取得
      xlBlanksRange = xlRange1.SpecialCells(Excel.XlCellType.xlCellTypeBlanks)
      '見つかった、空白のセルに指定のデータを入力
      xlBlanksRange.Value = "0"  '※ 数字(String)でないとエラーとなります。
      '見つかった、空白のセル数を取得する
      nn = xlBlanksRange.Count
      MRComObject(xlRange1)
      MRComObject(xlBlanksRange)
   Catch ex As Exception
      nn = 0
   End Try
   If nn = 0 Then
      msg = "No.10 セル範囲[A1:D5]のは空白のセルが見つかりませんでした。"
      MessageBox.Show(Me, msg)
   Else
      msg = "No.10 セル範囲[A1:D5]の空白のセル(" & nn.ToString & " 個)に 0 を代入しました。"
      MessageBox.Show(Me, msg)
   End If
   '-------------------------------------------------------------------------------
   '上記の他、SpecialCells メソッドの XlCellType 定数を指定する事で下記のようなセルを取得できます。
   'xlCellTypeAllFormatConditions(表示形式が設定されているセル)
   'xlCellTypeAllValidation(条件の設定が含まれているセル)
   'xlCellTypeBlanks(空の文字列)
   'xlCellTypeComments(コメントが含まれているセル)
   'xlCellTypeConstants(定数が含まれているセル)
   'xlCellTypeFormulas(数式が含まれているセル)
   'xlCellTypeLastCell(使われたセル範囲内の最後のセル)
   'xlCellTypeSameFormatConditions(同じ表示形式が設定されているセル)
   'xlCellTypeSameValidation(同じ条件の設定が含まれているセル)
   'xlCellTypeVisible(すべての可視セル)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010 から Excel のセルに関する操作1行Tips集その3(VB.NET)  (No.35の個別表示) [スレッド一覧へ]
日時: 2012/06/10 10:45
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,セルに関する操作,行と列,セル参照,セル操作,範囲  *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.06.10
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel のセルに関する操作1行Tips集その3(VB.NET)
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0
まずは、>>32 VB2010 から Excel のセルに関する操作、1行 Tips 集その1及び2をご覧になってから
こちらをご覧下さい。
尚、この Tips を使用される場合は、Excel の Com オブジェクトの解放に関する処理を理解
されてから使用するようにして下さい。
'-------------------------------------------------------------------------------

Private Sub Button32_Click(sender As System.Object, e As System.EventArgs) Handles Button32.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '==================== セルに関する操作1行Tips集その3 =======================
   '-------------------------------------------------------------------------------

   '1.Range オブジェクトの色々な、Clear メソッドを試す
   '・Range.Clear メソッド (オブジェクト全体をクリアします。)
   '指定のシートの指定のセル範囲のデータと数式と書式設定を削除します。

   MessageBox.Show(Me, "セル A1 〜 A4 の範囲に(Range.Clear)を試したいデータ" & _
                                          "(数式・書式・文字)等を入力して下さい。")
   Dim xlRange As Excel.Range = xlSheet.Range("A1:A4")
   xlRange.Clear()
   MRComObject(xlRange)

   '・Range.ClearContents メソッド(選択範囲から数式と文字を削除します。)
   '指定のシートの指定のセル範囲の書式設定を残して、数式と文字を削除します。
   MessageBox.Show(Me, "セル A1 〜 A4 の範囲に(ClearContents)を" & _
                              "試したいデータ(数式・書式・文字)等を入力して下さい。")
   xlRange = xlSheet.Range("A1:A4")
   xlRange.ClearContents()
   MRComObject(xlRange)

   '・Range.ClearFormats メソッド(オブジェクトの書式設定を削除します。)
   '指定のシートの指定のセル範囲のすべての書式設定を削除します。(数式やデータは削除されません。)
   MessageBox.Show(Me, "セル A1 〜 A4 の範囲に(ClearFormats)を" & _
                              "試したいデータ(数式・書式・文字)等を入力して下さい。")
   xlRange = xlSheet.Range("A1:A4")
   xlRange.ClearFormats()
   MRComObject(xlRange)

   '上記の他、下記のようなメソッドも用意されています。(別の項で紹介予定)
   '・Range.ClearComments メソッド(指定されたセル範囲からすべてのコメントを消去します。)
   '・Range.ClearNotes メソッド(指定されたセル範囲内のすべてのセルからコメントを削除します。)
   '・Range.ClearOutline メソッド(指定した範囲のアウトラインを消去します。)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '仮データの入力
   Dim xlRangeDat As Excel.Range = Nothing
   Dim n As Integer = 0
   For r As Integer = 1 To 10
      For c As Integer = 1 To 5
         n += 1
         xlRangeDat = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c))
         xlRangeDat.Value = n
         MRComObject(xlRangeDat)
      Next
   Next
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '2.セル(セル範囲)をコピー及び貼り付ける
   Dim xlCopyRange As Excel.Range = xlSheet.Range("B2")
   Dim xlDestRange As Excel.Range = xlSheet.Range("G2")
   xlCopyRange.Copy(Destination:=xlDestRange)
   MRComObject(xlCopyRange)
   MRComObject(xlDestRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '3.セル(表全体)をコピー及び貼り付ける
   Dim xlCurrentRegion As Excel.Range
   xlCopyRange = xlSheet.Range("B2")
   xlCurrentRegion = xlCopyRange.CurrentRegion
   xlDestRange = xlSheet.Range("A15")
   xlCurrentRegion.Copy(Destination:=xlDestRange)
   MRComObject(xlCurrentRegion)
   MRComObject(xlCopyRange)
   MRComObject(xlDestRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '4.セル(セル範囲)を移動する
   xlCopyRange = xlSheet.Range("C3")
   xlDestRange = xlSheet.Range("H3")
   xlCopyRange.Cut(Destination:=xlDestRange)
   MRComObject(xlCopyRange)
   MRComObject(xlDestRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '5.セル(表全体)をを移動する
   xlCopyRange = xlSheet.Range("B2")
   xlCurrentRegion = xlCopyRange.CurrentRegion
   xlDestRange = xlSheet.Range("G11")
   xlCurrentRegion.Cut(Destination:=xlDestRange)
   MRComObject(xlCurrentRegion)
   MRComObject(xlCopyRange)
   MRComObject(xlDestRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '6.形式を選択して貼り付け
   xlRange = xlSheet.UsedRange
   xlRange.Clear()
   MRComObject(xlRange)
   n = 0
   For r As Integer = 1 To 5
      For c As Integer = 1 To 5
         n += 1
         xlRangeDat = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c))
         xlRangeDat.Value = n
         MRComObject(xlRangeDat)
      Next
   Next

   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)
   xlRange = xlSheet.Range("A1:F6")
   'Excel をアクティブにする(エクセルにフォーカスを移す。)
   AppActivate(xlApp.Caption)    '必要ありませんが、見た目に解り易くする為に
   xlRange.Select()
   SendKeys.SendWait("%+(=)")
   MRComObject(xlRange)

   xlCopyRange = xlSheet.Range("B2")
   xlCurrentRegion = xlCopyRange.CurrentRegion
   xlCurrentRegion.Copy()
   MRComObject(xlCurrentRegion)
   MRComObject(xlCopyRange)

   xlDestRange = xlSheet.Range("A10")
   xlDestRange.PasteSpecial(Excel.XlPasteType.xlPasteValues)
   MRComObject(xlDestRange)
    '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '7.セルのエラー値を取得する
   'xlRange = xlSheet.UsedRange
   'xlRange.Clear()

   'Excel 上にエラーを発生(生成)させる
   xlRange = xlSheet.Range("A1") : xlRange.Formula = "#DIV/0!"
   MRComObject(xlRange)
   xlRange = xlSheet.Range("A2") : xlRange.Formula = "#N/A"
   MRComObject(xlRange)
   xlRange = xlSheet.Range("A3") : xlRange.Formula = "#NAME?"
   MRComObject(xlRange)
   xlRange = xlSheet.Range("A4") : xlRange.Formula = "#NULL!"
   MRComObject(xlRange)
   xlRange = xlSheet.Range("A5") : xlRange.Formula = "#NUM!"
   MRComObject(xlRange)
   xlRange = xlSheet.Range("A6") : xlRange.Formula = "#REF!"
   MRComObject(xlRange)
   xlRange = xlSheet.Range("A7") : xlRange.Formula = "#VALUE!"
   MRComObject(xlRange)
   xlRange = xlSheet.Range("A8") : xlRange.Value = CDec("1234567890123")
   'この場合、Style オブジェクトでなく、Style プロパティなので、解放処理は必要ありません。
   xlRange.Style = "Currency [0]"
   xlRange.ColumnWidth = 8
   MRComObject(xlRange)

   '確認のために、2秒間表示しておく
   System.Threading.Thread.Sleep(2000)

   Dim xlFunction As Excel.WorksheetFunction = xlApp.WorksheetFunction
   For r As Integer = 1 To 10
      For c As Integer = 1 To 3
         xlRangeDat = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c))
         If xlFunction.IsError(xlRangeDat) Then
            'セル上のエラーの発生場所とエラーの種類を取得
            Debug.Print(" R" & r.ToString & ", C" & c.ToString & " で " & _
            xlRangeDat.Text.ToString & vbTab & "(" & xlRangeDat.Value.ToString & _
                                                         ") のエラーが発生しました。")
            'エラーが表示しているセルの書式設定を残して、数式と文字を削除(お好みで)
            xlRangeDat.ClearContents()
         End If
         '文字数に対して表示列幅が不足して[####]のように表示しているセルを改善。
         If xlRangeDat.Text.ToString.Length > 3 AndAlso _
                                    xlRangeDat.Text.ToString.Substring(0, 3) = "###" Then
            'データの文字列長に合せて列幅を自動調整
            xlRange = xlRangeDat.Columns
            xlRange.AutoFit()
            MRComObject(xlRange)
         End If
         MRComObject(xlRangeDat)
      Next
   Next
   MRComObject(xlFunction)

   '上記実行結果
   'R1, C1 で #DIV/0!    (-2146826281) のエラーが発生しました。
   'R2, C1 で #N/A       (-2146826246) のエラーが発生しました。
   'R3, C1 で #NAME?    (-2146826259) のエラーが発生しました。
   'R4, C1 で #NULL!    (-2146826288) のエラーが発生しました。
   'R5, C1 で #NUM!       (-2146826252) のエラーが発生しました。
   'R6, C1 で #REF!       (-2146826265) のエラーが発生しました。
   'R7, C1 で #VALUE!    (-2146826273) のエラーが発生しました。
   '確認のために、3秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ
VB2010 から Excel のセルにコメントを挿入及びコメント操作色々(VB.NET)  (No.36の個別表示) [スレッド一覧へ]
日時: 2012/06/10 14:16
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,コメント操作,挿入,削除,変更,コメントを表示      *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.06.10
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel のセルにコメントを挿入及びコメント操作色々(VB.NET)
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0
まずは、>>32 VB2010 から Excel のセルに関する操作、1行 Tips 集その1及び2をご覧になってから
こちらをご覧下さい。
尚、この Tips を使用される場合は、Excel の Com オブジェクトの解放に関する処理を理解
されてから使用するようにして下さい。
'-------------------------------------------------------------------------------

'Button32 が重複しておりますので、Sub とか適当な場所に記入して下さい。

Private Sub Button32_Click(sender As System.Object, e As System.EventArgs) Handles Button32.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '=============================================================================
'-------------------------------------------------------------------------------
  下記のVB6.0用のコードを移植したものです。

  コメント表示・変更・削除方法色々
  http://www.hanatyan.sakura.ne.jp/vbhlp/excel09.htm#xl_2
'-------------------------------------------------------------------------------

   'セル A3 にコメントを新規作成(追加)します。
   Dim xlRange As Excel.Range = Nothing
   Dim xlComment As Excel.Comment
   xlRange = xlSheet.Range("A3")
   xlComment = xlRange.AddComment("セル A1 と A2 の合計です")
   MRComObject(xlComment)
   MRComObject(xlRange)

   xlRange = xlSheet.Range("C8")
   xlComment = xlRange.AddComment("ついでにもう1個作成しました。")
   MRComObject(xlComment)
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '----------------------------------------------
   'セル E3 にコメントを記入又は変更します。
   xlRange = xlSheet.Range("E3")
   xlRange.NoteText("変更予定")
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '----------------------------------------------
   '最初のコメントを表示します。
   Dim xlComments As Excel.Comments
   xlComments = xlSheet.Comments
   xlComment = xlComments.Item(1)
   xlComment.Visible = True
   MRComObject(xlComment)
   MRComObject(xlComments)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '----------------------------------------------
   'すべてのコメントを表示します。
   xlComments = xlSheet.Comments
   For Each xlComment In xlComments
      xlComment.Visible = True
      MRComObject(xlComment)
   Next
   MRComObject(xlComments)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '----------------------------------------------
   'セル範囲を指定してコメントを削除
   xlRange = xlSheet.Range("A1:A7")
   xlRange.ClearComments()
   MRComObject(xlRange)
   '確認のために、1秒間表示しておく
   System.Threading.Thread.Sleep(1000)

   '----------------------------------------------
   '記入しているコメントを全て削除
   xlComments = xlSheet.Comments
   For Each xlComment In xlComments
      xlComment.Delete()
      MRComObject(xlComment)
   Next
   MRComObject(xlComments)

   '=============================================================================
   System.Threading.Thread.Sleep(1000)
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)
   Call ProcessCheck()
End Sub
メンテ
VB2010 から Excel の表示処理速度を向上及び検索(VB.NET)  (No.37の個別表示) [スレッド一覧へ]
日時: 2012/07/02 11:08
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,Excel 2005,表示処理速度を向上,検索           *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.07.02
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010 から Excel の表示処理速度を向上及び検索(VB.NET)
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0
まずは、>>32 VB2010 から Excel のセルに関する操作、1行 Tips 集その1及び2をご覧になってから
こちらをご覧下さい。
尚、この Tips を使用される場合は、Excel の Com オブジェクトの解放に関する処理を理解
されてから使用するようにして下さい。
'-------------------------------------------------------------------------------

Private Sub Button33_Click(sender As System.Object, e As System.EventArgs) Handles Button33.Click
  Call ExcelOpen("", "")   '新規ファイルをオープンして、Excel を起動
  '========================== 表示処理速度を向上及び検索 =======================
  '--------------------------------------------------------------------------
  '仮データの入力
  Dim xlRangeDat As Excel.Range = Nothing
  Dim xlRange As Excel.Range = Nothing
  Dim nRnd As New System.Random()
  Dim sTime0 As DateTime
  Dim eTime0 As DateTime
  xlApp.ScreenUpdating = False
  For i As Integer = 1 To 2
   xlApp.ScreenUpdating = True
   '画面の更新を停止して表示処理速度を向上させる
   If i = 1 Then xlApp.ScreenUpdating = False
   sTime0 = Now      '処理時間計測開始
   For c As Integer = 1 To 50
     For r As Integer = 1 To 50
      xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c))
      '1 〜 100 までのランダムなデータを作成
      xlRange.Value = Strings.ChrW(CInt(nRnd.Next(12354, 12400))).ToString & _
              Strings.ChrW(CInt(nRnd.Next(12354, 12400))).ToString
      MRComObject(xlRange)
     Next r
   Next c
   '画面の更新をする(デフォルトに戻す)
   xlApp.ScreenUpdating = True
   eTime0 = Now      '処理時間計測終了  ' 3.8 秒 →  7.3 秒
   MessageBox.Show(Me, eTime0.Subtract(sTime0).TotalSeconds & " 秒かかりました。")
  Next i

 '[あい]を検索検索して見つかったセルをアクティブにする
  Dim xlCells As Excel.Range = Nothing
  Dim xlInterior As Excel.Interior = Nothing
  '下記のように、Cells プロパティを引数無しで使用しても解放されますが、
  '検索範囲が解っているので、xlRange = xlSheet.Range(R1ToA1(1, 1), R1ToA1(50, 50)) の
  'ようにした方が解放されやすい。
  '尚、 xlSheet.Cells は、 xlSheet.Range("1:1048576") や xlSheet.Range("$1:$1048576") や
  'xlSheet.Range("A1:XFD1048576") と指定するのも同じ事です。
  'xlCells = xlSheet.Cells
  xlCells = xlSheet.Range(R1ToA1(1, 1), R1ToA1(50, 50))
  xlRange = xlCells.Find("あい")
  If xlRange IsNot Nothing Then
   xlRange.Activate()
   xlInterior = xlRange.Interior
   xlInterior.Color = Color.Red
   xlApp.Goto(Reference:=xlRange, Scroll:=True)
   MessageBox.Show(Me, "大吉! 愛は、" & xlRange.Address & " に見つかりました。")
   ' Debug.Print(xlRange.Address)
   MRComObject(xlInterior)
   MRComObject(xlRange)
  Else
   MessageBox.Show(Me, "凶! 愛は、見つかりませんでした。")
  End If
  MRComObject(xlCells)
  '確認のために、1秒間表示しておく
  System.Threading.Thread.Sleep(1000)

  '=============================================================================
  'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
  Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了
  'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
  Call ProcessCheck()
End Sub
メンテ
VB2010から Excel のマクロを作成し実行する(VB.NET)  (No.38の個別表示) [スレッド一覧へ]
日時: 2012/07/13 16:07
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,マクロ,マクロの記入,マクロの削除,マクロの実行   *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.07.13
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:VB2010から Excel のマクロを作成し実行する(VB.NET)
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0
まずは、>>32 VB2010 から Excel のセルに関する操作、1行 Tips 集その1及び2をご覧になってから
こちらをご覧下さい。
尚、この Tips を使用される場合は、Excel の Com オブジェクトの解放に関する処理を理解
されてから使用するようにして下さい。
'-------------------------------------------------------------------------------

Private Sub Button34_Click(sender As System.Object, e As System.EventArgs) Handles Button34.Click
   Call ExcelOpen("", "")     '新規ファイルをオープンして、Excel を起動
   '==================== VB2010からマクロを作成し実行する =======================
   'Imports Microsoft.Vbe.Interop   'を記入の事

   'ファイル→オプション→セキュリティセンター→セキュリティセンターの設定→マクロの設定→
   'VBA プロジェクト オブジェクト モデルへのアクセスを信頼する にチェックを入れておく事。

   Dim xlVBE As Microsoft.Vbe.Interop.VBE
   Dim xlProject As Microsoft.Vbe.Interop.VBProject
   Dim xlComponents As Microsoft.Vbe.Interop.VBComponents = Nothing
   Dim xlComponent As Microsoft.Vbe.Interop.VBComponent = Nothing
   Dim xlCodeModule As Microsoft.Vbe.Interop.CodeModule

   xlVBE = xlApp.VBE
   xlProject = CType(xlBook.VBProject, Microsoft.Vbe.Interop.VBProject)
   xlComponents = xlProject.VBComponents
   xlComponent = xlComponents.Add(Microsoft.Vbe.Interop.vbext_ComponentType.vbext_ct_StdModule)
   xlCodeModule = xlComponent.CodeModule

   '標準モジュールに記入するマクロのコード
   Dim MacroCord As String = ""
   'CVErr 関数は、VB2010 には無く、VB2010 からは、使用できないようなので、マクロで実行
   MacroCord = _
      "Public Sub MacroTest()" & vbCrLf & _
      "   Dim myArray As Variant, i As Long" & vbCrLf & _
      "   myArray = Array(xlErrDiv0, xlErrNA, xlErrName, xlErrNull, xlErrNum,  _" & vbCrLf & _
      "                                                  xlErrRef, xlErrValue)" & vbCrLf & _
      "   For i = 1 To 7" & vbCrLf & _
      "      Worksheets(""Sheet1"").Cells(i, 1).Value = CVErr(myArray(i - 1))" & vbCrLf & _
      "   Next i" & vbCrLf & _
      "End Sub"
   'マクロのコードを標準モジュールに書き込み
   '変数の宣言を強制するにチェックが入っているとエラーとなるのでコメントに
   'oCode.InsertLines(1, "Option Explicit")  
   xlCodeModule.InsertLines(2, MacroCord)

   '作成したマクロを実行する
   xlApp.Run("MacroTest")
   MessageBox.Show(Me, "VB2010 から MacroTest マクロを作成し、実行しました。")

   '記入したマクロを削除する
   xlComponents.Remove(xlComponent)
   MessageBox.Show(Me, "VB2010 から作成した MacroTest マクロを削除しました。")

   MRComObject(xlCodeModule)
   MRComObject(xlComponent)
   MRComObject(xlComponents)
   MRComObject(xlProject)
   MRComObject(xlVBE)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub
メンテ

Page: 1 |

 投稿フォーム               スレッド一覧へ
題  名 スレッドをトップへソート
名  前
パスワード (記事メンテ時に使用)
投稿キー (投稿時 投稿キー を入力してください)
コメント

   クッキー保存   
スレッド一覧へ