投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/8/9 10:22:36
クリップボードを使っても構わないのであれば、
 .ClipboardCopyMode プロパティを指定して
 .SelectAll メソッドで全選択して
 .GetClipboardContent メソッドで得たデータを
 Clipboard オブジェクトに(加工してから)渡す
という手順を採ることで、データを一括転送できます。
http://dobon.net/vb/dotnet/datagridview/clipboardcopy.html

貼り付けには、Worksheet オブジェクトあるいは Range オブジェクトの
PasteSpecial メソッドを使うことができるでしょう。大抵の場合、
セル単位でひとつずつ貼り付けるよりも高速になると思います。


クリップボードを汚したくない場合には、ActiveX Data Object の PIA を
参照設定して、切断型 Recordset に DataGridView の内容を転写してから、
Range オブジェクトの CopyFromRecordset メソッドに渡すという手もあります。



> book = app.Workbooks.Open("C:\form3\Book1.xlsx")
> sheet = book.Worksheets(1)
ReleaseComObject のために、
 books = app.Workbooks
 book = books.Open("C:\form3\Book1.xlsx")
 sheets = book.Worksheets
 sheet = DirectCast(sheets(1), Excel.Worksheet)
のようにするべきです。Workbooks や Sheets も解放対象です。


> sheet.Range("A2").Value = "aaa"
こちらも同様に、
 rng = sheet.Range("A2")
 rng.Value = "aaa"
 Marshal.ReleaseComObject(rng)
のようにします。


> System.Threading.Thread.Sleep(5000)
UI スレッドから Sleep メソッドを呼び出してはいけません。
Excel オートメーションの利用中ならば尚の事。