質問

COMコンポーネントを用いた以下2点のExcelファイルの操作方法が分からず困っています。

1.指定されたシートを同一Excelファイル内にコピー追加する方法。

2.指定されたシートのシート名を変更する方法。

以上よろしくお願いします。

通報する

回答 (2件)

お世話になります。

VB.NET(.NET Framework 2.0 及び Excel 2003 で動作確認)
から操作したい場合です。

1) 参照設定の追加
ソリューションエクスプローラから
該当するプロジェクトを選択し、右クリックして「参照の追加」を選ぶ。

表示されたダイアログで、COM を選択して、
Microsoft Excel x.x Object Library
を選択して、OK を押下。

2) コーディング
Imports Microsoft.Office.Interop

Public Class Form1
  ' デザイナで Button を張りつけてある
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    ' 必要な変数は Try の外で宣言する
    Dim xlApplication As Excel.Application
    Dim saveFileName As String = "D:\" & DateTime.Now.ToString("yyyyMMddHHmmss") & ".xls"
    ' COM オブジェクトの解放を保証するために Try ~ Finally を使用する
    Try
      xlApplication = New Excel.Application()
      xlApplication.Visible = True
      ' 警告メッセージなどを表示しないようにする
      xlApplication.DisplayAlerts = False
      Dim xlBooks As Excel.Workbooks = xlApplication.Workbooks
      Try
        ' 新規にファイルを開く場合
        Dim xlBook As Excel.Workbook = xlBooks.Add()
        ' 既存ファイルを開く場合
        'Dim xlBook As Excel.Workbook = xlBooks.Open(Filename:="xlsファイルのパス")
        Try
          Dim xlSheets As Excel.Sheets = xlBook.Worksheets
          Try
            Dim xlSheet As Excel.Worksheet = DirectCast(xlSheets(1), Excel.Worksheet)
            '' 最初のシートの名前を変える
            xlSheet.Name = "aaa"
            '' 最初のシートをコピーする
            xlSheet.Copy(After:=xlSheet)
          Finally
            If Not xlSheets Is Nothing Then
              System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets)
            End If
          End Try
        Finally
          If Not xlBook Is Nothing Then
            Try
              xlBook.SaveAs(Filename:=saveFileName)
              xlBook.Close()
            Finally
              System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
            End Try
          End If
        End Try
      Finally
        If Not xlBooks Is Nothing Then
          System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
        End If
      End Try
    Finally
      If Not xlApplication Is Nothing Then
        Try
          xlApplication.Quit()
        Finally
          System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication)
        End Try
      End If
    End Try
    MessageBox.Show(saveFileName & "に保存しました")
  End Sub
End Class


上記コードを実行し、Button をクリックすると
aaa というシートがコピーされて D:\yyyyMMddHHmmss.xls に
保存されるはずです。

COM を扱う場合の注意点についてはこちらをどうぞ。
http://jeanne.wankuma.com/tips/programing/releas …

VB6 から Excel を扱う場合はこちらを参考にして下さい。
http://naoko.wankuma.com/tips/tips_0001_vb6excel …

この回答へのお礼

環境を付け忘れましたが、VB2005を用いています。
また、MSDNをよく探すと詳しい情報が出ており自己解決致しました。

すぐに質問文を消したかったのですが、24時間経たないと消せないようなので放っておいた次第です。

ありがとうございました。

<第1ステップ>
エクセルで、マクロの記録モード(ツールーマリロー新しいマクロの記録)にして、質問の1.、2.の操作をしてください。
それでエクセルVBAのコードはどんなものになるか分かります。
操作は
(1)シートコピー
問題のコピー元のシートのシートタブ部で右クリック
「異動またはコピー」を選ぶ。
「コピーを作成する」にチェックを入れること
(2)シート名変更
問題のシートのシートタブ部で右クリック
「名前の変更」を選択。
シートタブ部で新の名前を入力
ーー
以上で記録されたコードを変数とかで相対化するのはできるでしょう。
>COMコンポーネントを用いた、とおっしゃっているレベルだから。
ーーー
<第2ステップ>
エクセルのアプリケーションオブジェクトをつかむ
Set xlApp = CreateObject("Excel.Application")
それを頭につけて、順次、ブック、シートのオブジェクトをつかむ。
  Set xlBook = xlApp.Workbooks.Add
  Set xlSheet = xlBook.Worksheets(1)
そしてエクセルVBAのDefaltに頼ったコードの書き方でなく、
サブおオブジェクトには親(上位)オブジェクト名を必ず先頭にかぶせる。
そのようにマクロの記録のコードを改良してください。
参考
http://www.bcap.co.jp/hanafusa/VBHLP/excel1.htm

この回答へのお礼

環境を付け忘れましたが、VB2005を用いています。
また、MSDNをよく探すと詳しい情報が出ており自己解決致しました。

すぐに質問文を消したかったのですが、24時間経たないと消せないようなので放っておいた次第です。

ありがとうございました。

このQ&Aは役に立ちましたか?0 件

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

新しく質問する

このカテゴリで人気のQ&Aランキング