tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルSheetやBookのコピー後の処理
記事No13790
投稿日: 2009/07/01(Wed) 13:53
投稿者ケイ
度々申し訳ございませんが質問させてください。
SheetやBookをコピーした後の処理についてご教示お願い致します。

<抜粋>
 If Len(RetShtName) = 0 Then
   '同名Sheetがなければ「原紙」と言うSheetを同一Book内にコピーする
   xlBook.Worksheets("原紙").Copy after:=xlBook.Worksheets("原紙")
   'コピーして出来た新しいSheetのSheet名を変更する
   xlBook.ActiveSheet.Name = TgtShtName

   '★質問1:出来たSheetを現在は「xlBook.ActiveSheet」で指定して
        Sheet名を変更してるのですが、コピーして出来た新Sheetを
        確実に指定するにはどうすればいいのでしょうか?
        (コピーして出来た新sheetが必ずActiveではないかも
         しれないと懸念しています。)

 Else
   '同名シートがあれば、別ブックにコピーする。
   xlBook.Worksheets(RetShtName).Copy
   'コピーして出来た新ブックをPathとファイル名を指定して保存
   xlApp.ActiveWorkbook.SaveAs FileName:="C:\重複〜ExcelTextControl.xls"

   '★質問2:質問1と同等の質問なのですが、出来たBookを現在は
        「xlApp.ActiveWorkbook」で指定して保存場所とファイル名を指定して
        保存してるのですが、
        コピーして出来た新Bookを確実に指定するにはどうすればいいので
        しょうか?
        (これもまた、コピーして出来た新Bookが必ずActiveではないかも
         しれないと懸念しています。)

      (以下省略〜詳しくは下の全記述を参照ください)

尚、このプログラムとは無関係な他のExcelBookも複数開いている場合を想定したいです。


Option Explicit
Private TgtShtName As String
Private RetShtName As String
-----------------------
Private Sub Form_Load()
'参照設定:Microsoft Excel 11.0 Object Library

Dim xlApp   As Excel.Application
Dim xlBook  As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim ObjSht  As Excel.Worksheet
Dim n As Integer

    TgtShtName = "MySheet"
    
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open("C:\ExcelTextControl.xls")
    Set xlSheet = xlBook.Worksheets(1)
        
        xlApp.Visible = True
        
        For n = 1 To xlBook.Worksheets.Count
          If xlBook.Worksheets(n).Name = TgtShtName Then
            RetShtName = xlBook.Worksheets(n).Name
            Exit For
          End If
        Next
        
        If Len(RetShtName) = 0 Then
            '同名Sheetがなければ「原紙」と言うSheetを同一Book内にコピーする
            xlBook.Worksheets("原紙").Copy after:=xlBook.Worksheets("原紙")
            'コピーして出来た新しいSheet(原紙)のSheet名を変更する
            xlBook.ActiveSheet.Name = TgtShtName
        Else
            '同名シートがあれば、別ブックにコピーする。
            xlBook.Worksheets(RetShtName).Copy
            'コピーして出来た新ブックをPathとファイル名を指定して保存
            xlApp.ActiveWorkbook.SaveAs FileName:="C:\重複〜ExcelTextControl.xls"
            '重複してたシートを削除
            xlBook.Worksheets(RetShtName).Delete
            '上書き保存
            xlBook.Save
            '終了
            End
         End If
        
    Set xlSheet = Nothing
    xlBook.Close
    Set xlBook = Nothing
    xlApp.Quit
    Set xlApp = Nothing
End Sub

[ツリー表示へ]
タイトルRe: SheetやBookのコピー後の処理
記事No13791
投稿日: 2009/07/01(Wed) 14:52
投稿者魔界の仮面弁士
> (コピーして出来た新sheetが必ずActiveではないかも
>  しれないと懸念しています。)
そうですね。Active とは限りません。

この場合は、
> xlBook.Worksheets("原紙").Copy after:=xlBook.Worksheets("原紙")
> xlBook.ActiveSheet.Name = TgtShtName
の部分を、位置指定にして
 xlBook.Worksheets("原紙").Copy After:=xlSheet
 xlBook.Sheets(xlSheet.Index + 1).Name = "新しい名前"
という感じにしてみては如何でしょう。After なら +1、Before 指定ならば -1 です。
今回の場合、xlSheet は xlBook.Worksheets("原紙") 自身でも良いでしょう。

なお Move や Copy 動作では、インデックスのつけ直しが行われますので、
 i = xlSheet.Index
 xlBook.Worksheets("原紙").Copy After:=xlSheet
 xlBook.Sheets(i + 1).Name = "新しい名前"
のように、事前に Index を取得しておくのは避けるようにしてください。


> コピーして出来た新Sheetを確実に指定するにはどうすればいいので
> しょうか?
少々手間ですが、こういうのは如何でしょう。

 '1シートのみを持った新規ブックを用意
 PreCount = xlApp.SheetsInNewWorkbook
 xlApp.SheetsInNewWorkbook = 1
 Set xlNewBook = xlApp.Workbooks.Add()
 xlApp.SheetsInNewWorkbook = PreCount

 Set xlDummySheet = xlNewBook.Worksheets(1)
 xlBook.Worksheets(RetShtName).Copy Before:=xlDummySheet
 Set xlNewSheet = xlNewBook.Worksheets(1)
 xlDummySheet.Delete    '最初のシートは不要なので削除
 Set xlDummySheet = Nothing

 xlNewSheet.Name = "あたらしいなまえ"

[ツリー表示へ]
タイトル【解決】Re^2: SheetやBookのコピー後の処理
記事No13794
投稿日: 2009/07/01(Wed) 18:28
投稿者ケイ
>  After なら +1、Before 指定ならば -1 です。
★「After」の意味さえ知らず使ってたので、魔界の仮面弁士さんの
おっしゃるこれらの意味もチンプンカンプンでしたが理解できました。
ふ〜〜んなるほど〜〜!!

> なお Move や Copy 動作では、インデックスのつけ直しが行われますので、
> 事前に Index を取得しておくのは避けるようにしてください。
★了解しました。

>  PreCount = xlApp.SheetsInNewWorkbook
★これも意味わからなかったのですが理解できました。
後先考えた配慮ですね!!

>  xlBook.Worksheets(RetShtName).Copy After:=xlDummySheet
★このコピー方法って結構、ミソな気がします。
元のBookのシートを別BookのSheetを指定してコピーするって
当方にしましたら神業な高等技術です〜〜

度々の質問にも迅速・丁寧で且つサンプルコーディングまで
して頂いたことにとても感謝致します。
ありがとうございました。感謝!感謝!!

P.S. 質問を投稿してから、コピペそのままの部分の間違いに気付き
   直ぐさま修正しましたが、修正が間に合わなかったことを
   お詫び致します。

[ツリー表示へ]
タイトルRe: 【解決】Re^2: SheetやBookのコピー後の処理
記事No13795
投稿日: 2009/07/01(Wed) 21:51
投稿者魔界の仮面弁士
>>  xlBook.Worksheets(RetShtName).Copy After:=xlDummySheet
> ★このコピー方法って結構、ミソな気がします。
> 元のBookのシートを別BookのSheetを指定してコピーするって
> 当方にしましたら神業な高等技術です〜〜
この場合、コピー元とコピー先とが、同一の Excel.Application である必要があります。
異なる Application インスタンス間での Copy/Moveはできないので注意してください。


それと、
>> If xlBook.Worksheets(n).Name = TgtShtName Then
>>     RetShtName = xlBook.Worksheets(n).Name
>>     Exit For
>> End If
このコードは
   If xlBook.Worksheets(n).Name = TgtShtName Then
       RetShtName = TgtShtName
       Exit For
   End If
と書くと、プロパティへのアクセス回数を減らせるため、効率が(若干)良くなります。
まぁ、気にするほどの差では無いですけれども。

[ツリー表示へ]
タイトルRe^2: 【解決】Re^2: SheetやBookのコピー後の処理
記事No13798
投稿日: 2009/07/02(Thu) 16:13
投稿者ケイ
> プロパティへのアクセス回数を減らせるため、効率が(若干)良くなります。
★早速、修正しました。
後の後までご親切にどうもありがとうございます。

[ツリー表示へ]