- ベストアンサー
VB2005でExcelのシートをコピー
VB2005Expressで開発をしています。 Excelのシートをコピーして同じbookに追加をしたいと思っています。 下記でまずExcelを使用できるようにして Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Add '新規のファイルを開く Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) xlApp.Visible = True 下記で追加できると思うのですが、()内にセットするパラメータが わかりません・・・ xlBook.Worksheets.Copy() どなたかご存知の方がいらっしゃいましたら教えて下さい。 よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
たぶんエラーになるのはVB.NETのプロジェクト設定で Option StrictがOnになっているためでしょう プロジェクト > 最下段のプロパティ > コンパイルタブの中段あたりの『Option Strict(s)』を確認してみましょう シートにアクセスするには 1) xlAppのActiveSheetから取得する 2) ブックのWorksheetsプロパティからSheetsコレクションを取得してこのItemプロパティから取得する のいずれかの方法がいいでしょう 任意のシートの場合 2)の方法になると思います dim oSheets as Excel.Sheets oSheets = xlBook.Worksheets として wsA = oSheets("a") などと参照を取得しましょう
その他の回答 (6)
- redfox63
- ベストアンサー率71% (1325/1856)
> 下記で("a")の後ろに「.」を入力しても「copy」が入力補助に表示 >されないのですが・・・。Excelのバージョン等が関係しているので >しょうか。 > xlwb.Worksheets("a").copy(Before:=xlwb.Worksheets(3)) 表示されないでしょうね なぜかといえば Worksheet("a")がObject型を返すためです Objet型に Copyメソッドってありませんから … このままの構文でやるとするなら CTypeで適切な型変換が必要です xlwb.Worksheets("a")部分を CType(xlwb.Worksheets("a"),Excel.Worksheet) といった具合に型変換してやれば『.』でCopyメソッドもインテリセンスに表示されますよ この場合COMオブジェクトの開放ができなくなってしまう参照があるのでお勧めしませんが … xlwb.Worksheets(" と入力した際にパラメータヒントに何型で返されるかといったことが表示されます またオブジェクトブラウザでWorksheetsコレクションクラスのItemメソッドが何を返してくるのかを確認してみましょう
- n-jun
- ベストアンサー率33% (959/2873)
ANo.1&2+5です > xlwb.Worksheets("a").copy(Before:=xlwb.Worksheets(3)) >「copy」を手入力して実行すると、やはり上記でエラーになります。 上記ってそのまま使用されたわけではないですよね? 上記コードは私の環境でのテストですから、madamadahiyokoさんの環境に 合わせて下さいね。 "a"はコピーしたいシート名で、コピー先は同じBookの3枚目のワークシートの前 になります。(ここはExcelVBAのヘルプを参照されては) >下記で("a")の後ろに「.」を入力しても「copy」が入力補助に表示 >されないのですが・・・。Excelのバージョン等が関係しているので >しょうか。 私も候補には出てきませんでした。(手で打ち込みました) ANo.3さんの方法ならCOPYが出てきましたよ。 (Excel2002です。)
お礼
みなさんのおかげで出来ました。ありがとうございます。 返事が遅くなってすいません。 一応、ソースを下記に載せさせていただきます。 Dim xlApp As New Excel.Application Dim xlBook As Excel.Workbook = xlApp.Workbooks.Open("C:\aaa.xls") Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) Do While intRecCnt > 0 xlSheet = xlSheets.Item(1) 'シートの選択 xlSheet.Copy(Before:=xlBook.Worksheets(1)) 'シートのコピー xlSheet = xlSheets.Item(1) '再度シートを選択 xlSheet.Name = intRecCnt 'シートに名前を付ける Loop
- n-jun
- ベストアンサー率33% (959/2873)
ANo.1&2です。 redfox63さまへ >といった具合に使い終わったら Marshal.ReleaseComObject を実行しましょう とは、 http://support.microsoft.com/default.aspx?scid=kb;ja;317109 ここに関連すると言う事で宜しいでしょうか? 今回は私も大変勉強になりました。ありがとうございます。
- redfox63
- ベストアンサー率71% (1325/1856)
先に回答された方の回答で機能すると思います VB.NETでCOMを扱う場合マーシャリングに気を使わないといけません 暗黙的に参照されるオブジェクトの開放を怠るとアプリケーションが裏で動いた状態になってしまう恐れがあります 今回の場合ですと xlwb.Worksheets("a").copy(Before:=xlwb.Worksheets(3)) のxlwb.Worksheets("a") や xlwb.Worksheets(3) などがそれにあたります xlwb.Worksheets("a")やxlwb.Worksheets(3)をWorksheet型の変数を用意してこちらに代入してから Copyメソッド実行しましょう dim wsA, ws3 as Excel.Worksheet wsA = xlwb.Worksheets("a") ws3 = xlwb.Worksheets(3) wsA.Copy( Before:= ws3 ) Marshal.ReleaseComObject( wsA ) Marshal.ReleaseComObject( ws3 ) wsA = Nothing ws3 = Nothing といった具合に使い終わったら Marshal.ReleaseComObject を実行しましょう CellsやRangeで参照するRangeオブジェクトなどにも気をつけましょう
補足
丁寧に回答していただきありがとうございます。 A No.1さんに教えていただいた通りにコーディングしました。 Dim xlApp As New Excel.Application Dim xlwb As Excel.Workbook = xlApp.Workbooks.Open("R:\aaa.xls") Dim xlsheet As Excel.Worksheet 下記で("a")の後ろに「.」を入力しても「copy」が入力補助に表示 されないのですが・・・。Excelのバージョン等が関係しているので しょうか。 xlwb.Worksheets("a").copy(Before:=xlwb.Worksheets(3)) 「copy」を手入力して実行すると、やはり上記でエラーになります。 何度もすいませんが、原因がわかりましたら教えて下さい。 自分でも継続して調べてみます。よろしくお願いします。
- n-jun
- ベストアンサー率33% (959/2873)
ANo.1です。 一応自分で試したのは、 Dim xlApp As New Excel.Application Dim xlwb As Excel.Workbook = xlApp.Workbooks.Open("R:\aaa.xls") Dim xlsheet As Excel.Worksheet xlwb.Worksheets("a").copy(Before:=xlwb.Worksheets(3)) こんな感じでした。 ご参考になれば。
補足
丁寧に回答していただきありがとうございます。 教えていただいた通りにコーディングしました。 Dim xlApp As New Excel.Application Dim xlwb As Excel.Workbook = xlApp.Workbooks.Open("R:\aaa.xls") Dim xlsheet As Excel.Worksheet 下記で("a")の後ろに「.」を入力しても「copy」が入力補助に表示 されないのですが・・・。Excelのバージョン等が関係しているので しょうか。 xlwb.Worksheets("a").copy(Before:=xlwb.Worksheets(3)) 「copy」を手入力して実行すると、やはり上記でエラーになります。 何度もすいませんが、原因がわかりましたら教えて下さい。 自分でも継続して調べてみます。よろしくお願いします。
- n-jun
- ベストアンサー率33% (959/2873)
>xlBook.Worksheets.Copy() xlBook.Worksheets.Copy(Before:=xlBook.Worksheets(3)) 例えばこんな感じでしょうか。
お礼
みなさんのおかげで出来ました。ありがとうございます。 返事が遅くなってすいません。 一応、ソースを下記に載せさせていただきます。 Dim xlApp As New Excel.Application Dim xlBook As Excel.Workbook = xlApp.Workbooks.Open("C:\aaa.xls") Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) Do While intRecCnt > 0 xlSheet = xlSheets.Item(1) 'シートの選択 xlSheet.Copy(Before:=xlBook.Worksheets(1)) 'シートのコピー xlSheet = xlSheets.Item(1) '再度シートを選択 xlSheet.Name = intRecCnt 'シートに名前を付ける Loop