現在、VBを勉強するためにアプリを作っておりまして…
詳しく知りたいので、詳しく書きたいのですが、
試行錯誤した所から書くと膨大な量になりますので、要点(と思われるところ)だけで失礼します。
環境は、WinXP、Excel2003、VB.NET2003です。
最初、訳も分からず「Excel5.0 ObjectLibrary」を参照していましたが、うまく行かないので、
参照の「*excel」だけを削除して「11.0」を参照させました。
「5.0」では、うまく行ってたのですが、
Dim xlApp As New Excel.Application
Dim xlBook As WorkBook
では、「Excel.Application」「WorkBook」で波線が出ます。
http://support.microsoft.com/kb/306022/
http://support.microsoft.com/kb/302094/ja
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/office.aspx
他、色々のサイトのサンプルを試しましたが、どれもデバッグ時点でエラーが出ます。
「5.0」「11.0」の順で参照させたところ、「Excel.Application」「WorkBook」では波線は出ませんでしたが、「xlapp.Workbooks.Open(filePath)」が実行のところでエラーが出て止まりました。
参照の仕方が何か悪いのでしょうか?
それとも、コードの書き方が悪いのでしょうか?
もう何をすれば良いのか、わかりません。
どうすれば、いいのでしょうか?
どなたかご教示の程、宜しく御願いいたします。
> 「5.0」「11.0」の順で参照させたところ
これらを同時に参照させないでください。
あと、Office 関連のコンポーネントを扱う際には、参照設定画面の
「COM タブ」の方ではなく、「.NET タブ」の方にある物を使ってください。
Office 2003 の PIA (プライマリ相互運用機能アセンブリ)というヤツです。
http://www.microsoft.com/japan/msdn/office/office2003/OfficePrimaryInteropAssembliesFAQ.asp
http://support.microsoft.com/kb/328912/
http://support.microsoft.com/kb/823986/
> では、「Excel.Application」「WorkBook」で波線が出ます。
波線がでる時は、エラーの理由も別画面に表示されますよね。
そうしたメッセージも記載してください。
で、エラーメッセージが書かれていないので、何とも判断しにくいのですが、
おそらくは、名前空間の指定に問題があるのだと思いますので、その
波線さえ解消すれば、正常に動くようになるでしょう。
まずは オブジェクトブラウザ を使って、Workbook という型名が、
どの名前空間にあるのかを確認してみてください。
名前空間さえわかれば、それを Imports で指定すれば解決できるかと。
# Imports する名前空間は、参照設定しているのが Interop.Excel.dll なのか
# Microsoft.Office.Interop.Excel.dll なのかによって異なります。
> Dim xlApp As New Excel.Application
New の際には、Excel.○○Class の方を使った方が良いと思います。
> http://support.microsoft.com/kb/306022/
> http://support.microsoft.com/kb/302094/ja
> http://www.microsoft.com/japan/msdn/vbasic/migration/tips/office.aspx
これらのサンプルでは、オブジェクトの解放処理が正しく行われていませんね。
(最後の 1 つはまだマシですが…それでも完全ではなさそうです)
Excel のインスタンスが解放されずに残ってしまう可能性があるため、
あまり鵜呑みにしない方が良いかと思いますよ。
Excel を確実に解放するために、以下をご覧下さい。
http://support.microsoft.com/kb/317109/
http://www.bcap.co.jp/hanafusa/dotnet/Excel08.htm
http://jeanne.wankuma.com/tips/programing/releasecom.html
早々の御返事、誠にありがとうございます。(涙
>そうしたメッセージも記載してください。
申し訳ございません。
「型'○○○'が定義されておりません」と出ておりました。
それで、御指導の通り、
「.netからの参照」の後、Excel内を調べましたら「WorkBook」等がありました。
そこで「Imports Microsoft.Office.Interop.Excel」を付け加えましたが、
「Excel.Application」だけに波線が残りましたので、
Dim xlApp As New Application
・
・
・
xlApp = System.Reflection.Missing.Value
xlApp = CreateObject("new Excel.Application")
としてデバッグしましたが、下のxlAppで停止しましたので、
下のxlApp2行を取り払い、デバッグしたところExcelが起動しました!!
ありがとうございますっ!
とは言え、こんな素人考えな事をして、何か不具合はないのでしょうか…?
> とは言え、こんな素人考えな事をして、何か不具合はないのでしょうか…?
かなりマズイでしょう。
それぞれの処理を、ほとんど理解しないまま書いていませんか? (^^;
偶然動いただけという、いきあたりばったりのコーディングだと、
どこに問題があるのかを把握できなくなるので、後々、困りますよ。
> Dim xlApp As New Application
それでも間違いでは無いのですが、この表記だと、その名前空間が
System.Windows.Forms.Application
の事を指しているのか、それとも
Microsoft.Office.Interop.Excel.Application
の事を指しているのかが曖昧になるため、名前空間の宣言は
Imports Microsoft.Office.Interop
までにしておいて、
Dim xlApp As New Excel.Application
のように記述するのが一般的です。
> xlApp = System.Reflection.Missing.Value
えぇと、なぜこの時点で、Missing.Value の表記がでてきたのでしょうか?(^^;
VB.NET では、Missing.Value を使う事は、ほとんどありません。
C# であれば使いますが…それにしても、この状況では使われません。
> xlApp = CreateObject("new Excel.Application")
CreateObject構文を使うのであれば、
xlApp = CreateObject("Excel.Application")
ですし、New 構文を使うのであれば、
xlApp = New Excel.ApplicationClass
です。どっちつかずのコードになっていますよ。
そもそも、最初の変数宣言時に
Dim xlApp As New Excel.Application
と書いているわけですが、これは、
Dim xlApp As Excel.Application = New Excel.ApplicationClass
の省略表記です。
変数宣言の時点で、変数 xlApp に、Applicationオブジェクトを
既に代入しているのですから、その後で、xlApp に新たな
オブジェクトを再代入する必要はありませんし、再代入してもいけません。
# 前のオブジェクトを解放せずに、その変数に別のオブジェクトを代入すると、
# 前のオブジェクトが正しく解放されず、Excelが終了せずに残ってしまいます。
丁寧な解説、誠にありがとうございます。
結局、よくよく考えてみれば、Excelの既存シートのセルへデータを代入し、名前を変えて.xlsファイルで保存ができればいいのですが、
それ以前に、あの後、いくらやってもエクセルの表示以外できません。
何というか、「エクセル一閃っ!」って感じで、何も出来ません。orz
> xlApp = System.Reflection.Missing.Value
> xlApp = CreateObject("new Excel.Application")
は、MSのソースのコピペでした。
Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Core
Imports System.Runtime.InteropServices
としてやりましたが、相変わらず「Excel.Application」での波線は消えません。他は消えました。
どこ探しても、「excel()」っていうのがないんです。
> 「5.0」「11.0」の順で
の時は、出てきたのですが。
土曜日からずっとこの調子で、今回、よろこんだ分、凹んでますので、
もう少し、状況などをきっちり整理した上で、カキコさせて戴きます。
orz・・・
起動しました!
「Imports Microsoft.Office.Interop」として「.Excel」を除いたところ、
「Dim xlApp As」のところから、「Excel」「Application」ともに表示が出ました。
結局、こんな感じのソースになりました。
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Core
Imports System.Runtime.InteropServices
--------------------------------------------------
Dim xlApp As New Excel.ApplicationClass
Dim xlBook As Object
Dim xlBooks As Object
Dim xlSheet As Excel.Worksheet
Dim xlSheets As Excel.Worksheets
With xlApp
.Visible = True
xlBooks = .Workbooks
xlBook = xlBooks.Add
xlSheet = xlBook.ActiveSheet
xlBooks.Open("C:\Templete.xls")
xlBooks = xlApp.Workbooks
xlSheets = xlApp.Worksheets("1st")
End With
ありがとうございました。
下から2行目("1st")で止まりますが、後はこれと名前を変えて保存だけです。
頑張ります。丁寧なレスを戴き、ホントにありがとうございました。
解決チェック済みのようですが、幾つか危なそうな点があるので、
それぞれ、情報(○)、警告(△)、要修正(×)を付けて回答しておきます。
> With xlApp
> .Visible = True
> xlBooks = .Workbooks
(○) まず、ここまでは良いと思います。
> xlBook = xlBooks.Add
(○) この場合、空のワークブックが生成されますね。
(○) 元となるテンプレート(*.xlt, *.xls)がある場合には、上記を
xlBook = xlBooks.Add("C:\Templete.xls")
のように記述する事もできます。このようにすると、Templete.xls を
基にした、新規のワークブックが表示されますよ。
> xlSheet = xlBook.ActiveSheet
(△) 処理が曖昧になりますので、Active系プロパティは、できる限り
使わないようなコーディングを心掛けた方が良いでしょう。
(×) しかし、ここで ActiveSheet を受け取った所で、その後それを
全く使っていないのですから、意味がありません。
この行は削除してしまいましょう。
> xlBooks.Open("C:\Templete.xls")
(×) xlBook.Open は、ActiveXオブジェクトを返しますので、使用後に
解放の義務があります。Addと同様、戻り値を変数に受けて下さい。
(○) .Add の場合、新規のブックを作成しますが、.Open を使った場合は、
ファイルそのものが開かれます。もし、元のファイルを残しておきたい
のであれば、.Open よりも、.Add で開いた方が都合が良いでしょう。
> xlBooks = xlApp.Workbooks
(×) 無意味です。この行も削除してください。
すでに xlBooks 変数には、xlApp.Workbooks を格納してあるので、
ここで再度取得しなおした所で、意味が無いからです。
> xlSheets = xlApp.Worksheets("1st")
> 下から2行目("1st")で止まりますが、後はこれと
(×) xlApp.Worksheets でも操作できますが、それだと、複数のブックが
開かれていたような場合に、処理が曖昧になってしまいます。
1stシートは、「Templete.xls」のワークブック上のシートなのですから、
この場合は、xlApp.Worksheets ではなく、xlBook.Worksheets を使うように
修正した方が良いでしょう。ちなみに、xlBook.Sheets でも OK です。
(×) 1stシートのデータ型は「Worksheets型」ではなく「Worksheet型」です。
つまり最終的に受け取る変数も、xlSheets ではなく xlSheet の方となります。
(×) ただし、.Worksheets("1st") のような書き方はしてはいけません。
理由は、先述の URL を参照してもらうとして、具体的な修正案としては、
以下のようなコードとなります。
Dim xlSheets As Excel.Sheets
Dim xlSheet As Excel.WorkSheet
:
xlSheets = xlApp.Worksheets 'まず、.Worksheets までを変数に受け取ってから
xlSheet = xlSheets("1st") '個々の Worksheet を取り出すようにする。
ただし、VB.NET の設定を厳密な型指定モード(Option Strict On)に
している場合には、上記ではエラーとなります。その場合は、
xlSheets = xlApp.Worksheets
xlSheet = DirectCast(xlSheets("1st"), Excel.Worksheet)
のように、「DirectCast」を使った明示的な型変換が必要となるでしょう。
> 名前を変えて保存だけです。
(○) Workbookオブジェクトには、Saveメソッドや SaveAs メソッドがありますので、
これを利用して保存ができます。詳しくは、Excel 側のヘルプを見てください。
(△) ただし、保存しただけで安心してはいけません。プログラム中で使用した
ActiveXオブジェクト全てを、解放してあげないと、Excel が終了せず、
非表示にて残ってしまう原因となるからです。先の URL を参考にして、
Marshal.ReleaseComObject メソッドで、ひとつひとつ解放してあげましょう。
ご丁寧な回答ありがとうございます。
結局、このようにしました。
Dim xlApp As New Excel.ApplicationClass
Dim xlBooks As Excel.Workbooks
Dim xlBook As Excel.Workbook
Dim xlSheets As Excel.Worksheets
Dim xlSheet As Excel.Worksheet
With xlApp
xlBooks = .Workbooks
xlBook = xlBooks.Add("C:\Program Files\JKS\dat\StdTemplete.xls")
xlSheet = xlBook.Worksheets("1st")
End With
With xlSheet
.Range("e4").Cells.Value = TextBox1.Text '日付
.cell("t4").value = TextBox2.Text 'ひらがな
.Cells("ae3").value = TextBox3.Text '半角数字
End With
'Com解放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets)
xlBook.Close()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
xlApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
ですが、
「'System.NullReferenceException' のハンドルされていない例外がmicrosoft.visualbasic.dll で発生しました。
追加情報 : オブジェクト変数または With ブロック変数が設定されていません。」
と'Com解放の前に出て中断してしまいます。
Excel自身は起動しますが、デバッグ毎に手作業で終了させています。
> With xlApp
> xlBooks = .Workbooks
今回の場合、With の影響範囲が、この1行だけですよね。
分かりにくくなるだけなので、この場合は With を取って、
xlBooks = xlApp.Workbooks
のようにした方が良いと思いますよ。
> xlBook = xlBooks.Add("C:\Program Files\JKS\dat\StdTemplete.xls")
これは良いとして……
> xlSheet = xlBook.Worksheets("1st")
> End With
これが NG 。正しくは、
xlSheets = xlBook.Worksheets
xlSheet = xlSheets("1st")
です。
で、エラーの原因もここにあります。要するに、元のコードだと、
変数 xlSheets が一度も使われていなかったわけですよ。
一度も xlSheets にオブジェクトを代入していないわけですから、
中身は当然 空っぽ (つまり、Nothing) な状態です。それなのに、
何もない物を解放しようとしたために、
> 「'System.NullReferenceException' のハンドルされていない例外が
> microsoft.visualbasic.dll で発生しました。
> 追加情報 : オブジェクト変数または With ブロック変数が
> 設定されていません。」
というエラーが発生していたわけです。
> With xlSheet
> .Range("e4").Cells.Value = TextBox1.Text '日付
これも NG です。
.Range("e4") が返す物は COM のオブジェクト。(Excel.Range型)
.Cells が返すものも、COM のオブジェクト。(Excel.Range型)
これらの 2 つの解放処理が抜け落ちています。修正するとすれば、
Dim aaa, bbb As Excel.Range
aaa = xlSheet.Range("E4")
bbb = aaa.Cells
bbb.Value = TextBox1.Text
:
:
System.Runtime.InteropServices.Marshal.ReleaseComObject(bbb)
System.Runtime.InteropServices.Marshal.ReleaseComObject(aaa)
のようなイメージとなりますね。
> .cell("t4").value = TextBox2.Text 'ひらがな
これは、掲示板に投稿する際に編集したものですよね?
.cell というプロパティは無いので、エラーになるはずです。
実際のコードは、.Cells(〜) か .Range(〜) ですよね?
# "T4"という文字列で指定しているので、多分 Range の方だと思いますが…。
> .Cells("ae3").value = TextBox3.Text '半角数字
> End With
これも NG です。先ほどと同様、解放処理が抜けています。
(その前の行の "T4" セルの操作も同様かな)
オブジェクトブラウザで確認していただくと分かるのですが、
Worksheet の Range プロパティ : 引数が 1個〜2個 : Range型を返す
Worksheet の Cells プロパティ : 引数は取らない : Range型を返す
のような定義になっていますよね。
それなのに、.Cells(…) と引数があるかのように記述できるのは、実は
.Cells(1)
というコードでは、既定のプロパティが省略されており、実際は
.Cells._Default(1)
のように処理されるからです。
この場合の修正案は……もしも Cells プロパティを使って処理するなら、
ccc = xlSheet.Cells
ddd = ccc(4, 20) '第4行20列 = T4 セル
ddd.Value = TextBox2.Text 'ひらがな
System.Runtime.InteropServices.Marshal.ReleaseComObject(ddd)
ddd = ccc(3, 31) '第3行31列 = AE3 セル
ddd.Value = TextBox3.Text '半角数字
System.Runtime.InteropServices.Marshal.ReleaseComObject(ddd)
System.Runtime.InteropServices.Marshal.ReleaseComObject(ccc)
という感じになり、Range プロパティを使って処理するなら、
ccc = xlSheet.Range("T4")
ccc.Value = TextBox2.Text 'ひらがな
System.Runtime.InteropServices.Marshal.ReleaseComObject(ccc)
ccc = xlSheet.Range("AE3")
ccc.Value = TextBox3.Text '半角数字
System.Runtime.InteropServices.Marshal.ReleaseComObject(ccc)
という感じになるでしょうね。
# なお、上記で ccc とか ddd とか書かれいる部分は、
# Excel.Range 型の変数だと思ってください。
いつも詳細に御返事戴いて、ホントに申し訳ありません。
xlSheet = xlSheets("1st")で必ず上記と同様のエラーが出ます。
その後のE4のデータの入力も、開いたシートに反映されてないし…
何故でしょう?
また訳がわかんなくなってきました。
それと、あの・・・申し訳ありません。
追加の質問なんですが、
VBのフォーム上のデータをExcelのセルへ入力したいのですが、
必ず、Range("E4")のように範囲指定するか、配列を作って、
その上でのデータ入力になるのでしょうか?
また、そのデータも解放せねばならないのでしょうか?
あら?行き違いになっちゃいましたね。
いつも、ありがとうございます。
何故か、cellでエラーが出ていません。
それと当初は、
.Range("E4").Cells.Value = TextBox1.Text
にしていました。
しかし、開いたシートに全然、反映されないので、色々と実験していたのですが、
今回、その最中のコードを消し忘れていました。
実際に作りたいのは400くらいのデータをExcelに入力させるようなものを作るつもりなので、
その一つ一つを解放するとなると、大変な作業になりますね。orz
>実際に作りたいのは400くらいのデータをExcelに入力させるようなものを作るつもりなので、
>その一つ一つを解放するとなると、大変な作業になりますね。orz
データを入力しないセルも含めて、矩形の範囲に配列で処理すれば
1回で済むのでは?データを入力しないセルに何か入ってるなら
最初に読み込めばいいし、別シートとか配列で対応できない形式で
あっても、プログラムから書き込む範囲を別に用意して、エクセル側で
そのセルを参照する形にしても良いし。
> 必ず上記と同様のエラーが出ます。
NullReferenceException の例外だとすれば、多くの場合は、
「Nothing 状態の変数を操作しようとした」事が原因です。
どの行を実行した時にエラーが発生しているのかを調べ、その時の変数に、
どのような値/オブジェクトを格納しているのか、再確認してみましょう。
> 必ず、Range("E4")のように範囲指定するか、配列を作って、
> その上でのデータ入力になるのでしょうか?
セルへのデータ指定方法としては、以下のような物があります。
-------------
(1) Cells プロパティか Range プロパティで、特定のセル範囲
(1つのセルだけではなく、複数のセル範囲も指定可能です)を取得し、
そこに単一の値、または複数の値(1次元配列または2次元配列)を渡す。
(2) クリップボード経由でデータを渡す。(Pasteメソッド)
(3) ADODB.Recordset経由でデータを渡す。(CopyFromRecordsetメソッド)
-------------
他にも方法はありますが、基本的には(1)の手法が一般的でしょうね。
今回使っている方法も、(1)を使ったコードですね。
> 何故か、cellでエラーが出ていません。
Option Strict Off モードなら、コンパイルエラー(赤い波線表示)にはなりません。
それとも、実行時にもエラーにならないという事でしょうか。
(少なくとも、当方ではエラーになりました)
> それと当初は、
> .Range("E4").Cells.Value = TextBox1.Text
> にしていました。
E4 の位置に出力するだけなら、.Cells は余計です。
Range("E4").Value = 〜 で充分でしょう。
実際には、オブジェクト解放も視野に入れるので、
foo = .Range("E4")
foo.Value = TextBox1.Text
System.Runtime.InteropServices.Marshal.ReleaseComObject(foo)
ですね。
> その後のE4のデータの入力も、開いたシートに反映されてないし…
さしあたり、以下の点をチェックしましょう。
* 最初に xlApp.Visible = True を入れて、Excel を表示させた状態に
してみて、Excel 上に予想通りの結果が渡されているかを確認。
(一行ずつステップ実行して、そのたびに Excel の状態を見る)
* プログラムを実行した後、[Ctrl]+[Shift]+[ESC]キーで、
タスクマネージャを表示してみて、その「プロセス」タブに、
非表示の Excel が残っていない事を確認。
(残っていたら、プログラム中にオブジェクトの解放漏れがあるという事)
* ブックを Close する前に、SaveAs メソッドを呼び出し、
ファイルを明示的に保存するようにしてみる。
> その一つ一つを解放するとなると、大変な作業になりますね。orz
連続した領域なら、配列を使って一度に指定できますので、利用してみてください。
それと、セルへの代入時に毎回解放するのが面倒なのであれば、
代入処理と解放処理を行うための Sub / Function を用意すれば、
呼び出し側のコードが煩雑になる事を防げると思いますよ。
>xlSheet = xlSheets("1st")で必ず上記と同様のエラーが出ます。
は解決したのかな?単純に『1st』って名前のシートが無いとか?
全角半角が違うとか?
xlSheets = xlBook.Worksheets
For Each xlSheet In xlSheets
Debug.WriteLine(xlSheet.Name)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
Next
で出力ウィンドウに出力されるシート名を確認してみては?
たくさんのアドバイスありがとうございます。
Dim xlApp As New Excel.ApplicationClass
Dim xlBooks As Excel.Workbooks
Dim xlBook As Excel.Workbook
Dim xlSheets As Excel.Sheets ←WorkSheetsになってました。
Dim xlSheet As Excel.Worksheet
Dim xlRange As Excel.Range
Dim DataArray2(200, 40) As Object
Dim r2 As Integer
Dim c2 As Integer
xlBooks = xlApp.Workbooks
xlBook = xlBooks.Open("C:\test.xls")←addを変更しました。
xlSheets = xlBook.Worksheets
xlSheet = xlSheets.Item("1st") ←Itemをつけました。
xlApp.Visible = True
としました。
それで、配列 DataArray2 にデータを代入して、
DataArray2(r2,c2)= Text1.Text
最後に、入力しました。
xlRange.Value = DataArray2
途中、配列のインデックスが少なかったので+αしました。
それで過去スレを参考して、印刷
xlsApp.ActiveWorkbook.PrintOut Copies:=1, Collate:=True
しましたが、データがどこに飛んでいったのか、
殆どのセルが空白になって、20枚くらい印刷されそうになりました。
セルの結合をしてると、それを一つとして数えなければならないのでしょうか?
次にとる策として、セルの結合も罫線も全て、指定した方が良いのでしょうか?
それと
System.Runtime.InteropServices.Marshal.ReleaseComObject(DataArray2)
にしました。エラーが出て消しましたが、今、考え中です。
すみません。全然、頓珍漢なレスしてました。
印刷をきっちりさせれば、10枚程度になりそうです。
一度、一枚だけプリントアウトさせて、プリンターをリセットしました。
その時、ファイルを保存するかどうか聞いてきたので、キャンセルして中を覗いてみました。
すると、200の内、3つ程だけがセル上に残り、
シート上のテンプレートの文字類は全て消されて罫線だけが残っておりました。
配列内のデータ、nullも合わせて丸ごと貼り付けたんだから、当然ですよね。
ただ、印刷時に「11/21枚」と出て、印刷プレビューさせると二枚しかないので、
その他のデータがRange外に出てるのでしょうか?
あーまた・・・このところコレにかかりきりで、連日4時間睡眠なのでボーっとしてるのかな。
上記のやり方で、エクセルは開くようになりました。
それから、Worksheetsをsheetsに直してからnothingが無くなり、
やっと、データ処理をしてくれるようになりました。
そのデータも、どこかへ飛んでってますが。orz
お休みなさい。
> xlsApp.ActiveWorkbook.PrintOut Copies:=1, Collate:=True
これ自体は、Excel VBA的なコードですね。
VB.NETからの操作だと、 xlBook.PrintOut 〜〜 、かな。
> System.Runtime.InteropServices.Marshal.ReleaseComObject(DataArray2)
解放が必要なのは、COMのオブジェクトだけです。
DataArray2 は .NETのオブジェクトなので、上記の処理は不要です。
なお、COMのオブジェクトかどうかは、Marshal.IsComObject で判断できます。
> シート上のテンプレートの文字類は全て消されて罫線だけが残っておりました。
> 配列内のデータ、nullも合わせて丸ごと貼り付けたんだから、当然ですよね。
配列を用意する部分を、
xlRange = xlSheet.Range("A1:D3")
foo = xlRange.Value
のようにすると、セルの値を持った二次元配列 foo が得られますので、
得られた、foo の中身を一部書き換えてから
xlRange.Value = foo
のようにして書き戻せば、元のデータが消えてしまうことを防げるかも。
御返事送れてスミマセン。
当初、A1方式を、R1C1方式に書き直したので、
写し違いで、いくつかズレたくらいで、
> xlRange.Value = foo
で、ほぼ完璧にExcelへ書き込みできました。
ホンっトに、ありがとうございます。
これを元に、また何か作ろうと思います。
今度は、メンテしやすいように…やっぱ仕様書から作るべきかなぁ…
ツイート | ![]() |