プロが教える店舗&オフィスのセキュリティ対策術

同一Book内で、シートのコピーをしようと考えて、幾つかのHPを参考に、以下のような
記述をしました。

その際に、以下の記述をした場合、本来はコピー先のシート名を変更したいにも関わらず、コピー
元のシート名が変わってしまいます。

追加したシートの名前を変更させるには、どのような書き方にすれば良いでしょうか?

自分で記述しておきながら、どのように対応したら良いかわからず。。。

また、以下のような記述をした場合、追加したセル側のシートを操作したいにも関わらず、
コピー元のシートを書き換えてしまいます。

追加したシートのセルを操作したい(値を入力)ような場合は、どのような記述を
すれば良いでしょうか。。。

ご教授頂ければと思います。

'既存のEXCELファイルを開く
Dim xlFilePath As String = "C:\test.xls"

'起動時の処理
Dim xlApp As New Excel.Application
Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath)

'確認のためExcelのウィンドウを表示する
xlApp.Visible = True

Dim xlSheets As Excel.Sheets = xlBook.Worksheets
Dim xlSheet As Excel.Worksheet = CType(xlSheets.Item(1), Excel.Worksheet)
Dim xlSheet2 As Excel.Worksheet = xlBook.Worksheets(1)

'シートのコピー
xlSheet.Copy(After:=xlSheet2)

'シートに名前を付ける
xlSheet.Name = "TEST"

Dim xlRange As Excel.Range

'データの入力セル範囲
xlRange = xlSheet.Range("A1:A1")

'セルへデータの入力
xlRange.Value = “AABBCC”

A 回答 (3件)

う~ん


サンプルのステートメントをよく噛みしめていますか?
現在のシート数はどうやって求めましたか?
Worksheets.Count ですよね。これが常に現在の
シート数を持っているのです。コピーして、シートが
増えたらこのCountプロパティも増えます。
論理的には以下のようなコードになるでしょう。

Dim 現シート数 As Integer
Dim 最終シート As Excel.Worksheet
Dim 最新シート As Excel.Worksheet

Do
  '末尾にシートをコピーする
  現シート数 = xlBook.Worksheets.Count
  最終シート = xlBook.Worksheets(現シート数)
  xlSheet.Copy(After:=最終シート)
  最新シート = xlBook.Worksheets(現シート数 + 1)
  '***** 何らかの処理 *****
  If 終了 Then Exit Do
Loop

尚、最初からシート数が分かっているような実務は
殆どありませんよ。30年以上この商売してますが、
そんなのは1回あったかなかったくらいです。

ついでに言うと、複数形のものはコレクション、
単数形のものはオブジェクトと言います。
Workbooksはコレクションで、Workbookの集合です。
だから、Count(個数)があり、メンバを追加する意味で
Add(新規ブック作成)やOpen(既存ブックを開く)という
メソッドがあります。メンバを減らすのはCloseです。
同様にシートもWorksheetsとWorksheetがあります。
AddやCopyでメンバが増え、Deleteで削除されます。
コレクションからはインデックスか名前を指定すると
オブジェクトが得られます。上記もインデックスで
コレクションからオブジェクトを得ていますよね。
こういう関係を知らないと正確なプログラムは作れ
ません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

細かな部分まで教えて頂き、考えていたような事ができるように
なりました。

私ももう少し知識を増やさないとダメですね。。。

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

お礼日時:2012/02/08 09:54

「末尾に新しく作る」ということは


「今あるシート数」の後に作るということです。

Dim 現シート数 As Integer = xlBook.Worksheets.Count
Dim 最後のシート As Excel.Worksheet = xlBook.Worksheets(現シート数)
xlSheet.Copy(After:=最後のシート)
Dim 新シート As Excel.Worksheet = xlBook.Worksheets(現シート数 + 1)

当然ですがコピーでできたシートのインデックスは
現シート数+1ですね。
    • good
    • 0
この回答へのお礼

教えて頂き、本当にありがとうございます。

ようやく理解できてきました。

ただ、最後にもう1点だけ確認させて下さい。

何度も申し訳ありません。

教えて頂いた方法でシートを追加していく際に、あらかじめシートをどのくらい用意
するかがわかっていれば、そのシート分、教えて頂いた記述をすれば良いかと思われ
ますが、データの件数、分岐条件によってどのくらいシートを用意するかわからない場合、
その都度シートを追加していかなくてはならない場合は、どのような形で記述すれば
良いでしょうか。。。

数シートであれば、私が宣言したように、現シートや最後のシートを

xlSheet1,xlSheet2,xlSheet3・・・

と増やして宣言し、認識する事が可能ですが、何シートか不明の場合は、、、、

変数を動的に指定する事とかで対応するのでしょうか???

教えて下さい。

お礼日時:2012/02/07 10:10

>元のシート名が変わってしまいます


だって、そういうコーディングですよ。

>'シートのコピー
>xlSheet.Copy(After:=xlSheet2)
>'シートに名前を付ける
>xlSheet.Name = "TEST"

xlSheetは元のシートじゃないですか。

コピーされてできた新しいシートは
次のように求めます。

Dim 新シート As Excel.Worksheet = xlBook.Worksheets(xlSheet.Index + 1)
新シート.Name = "TEST"

xlSheetの後ろに作ったのでIndexは
xlSheetのIndex+1になります。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。

新しいシートの求め方、ようやく理解し、正しく変更する事ができました。

もう1点だけこれに関連して教えて下さい。

今、2シートできている状態ですが、もう1シート、末尾に追加したい場合はどのように
記述すれば良いでしょうか?

大変申し訳ありませんが、教えて頂ければ幸いです。

お礼日時:2012/02/06 13:45

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A