• 締切済み

ブックの共有をしているexcelファイルの複製

ブックの共有を設定しているbook1.xlsというexcelファイルがあります。 ブックの共有を行なっているとだんだんデータサイズが肥大化してくるので、その対策として 【1】"book1.xls"のシート単位で全て新しい"book2.xls"にコピーする。 【2】"book1.xls"を別のフォルダへ移動。 【3】"book2.xls"の名前を"book1.xls"に変え、ブックの共有設定を行う。 ということをしています。 これらの作業を自動で行えたらと思うのですが、 タスクスケジューラー?.batファイル?VBA?など、何をどう組み合わせたらよいのかがよくわかりません。 アドバイスよろしくお願いします。

みんなの回答

  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

私のレスが長くて解かり難いのは申し訳ないですが、 もう少し、読み込んでみて頂ければ幸いです。 >『(共有化のままだとマクロ編集できませんから)一旦共有化解除して』 >という部分は手動ということになりますでしょうか。 はい。その通りです。 マクロ実行するためのマクロを作成してマクロ実行するまでの手順を説明したものです。 end-u>必要なら、それをマクロ処理する事もできます。 ここから end-u>: end-u>この場合、サイズが肥大化した時に必要に応じて任意で実行するような運用ですね。 ここまでの文章です。 >全て自動で実行ファイルの肥大化を解消する方法がないかと考えているのですが、 >何か良いアドバイスがありましたらよろしくお願いします。 そのニーズに応えるために end-u>これを定期的に自動実行するようにできなくもないですが。 end-u>例えば.. この文章の後に、タスクスケジュールとVBScriptを使ってExcelを操作する方法を提案しました。 この方法以外に、となるとVBScriptではなくて、Workbook_Openイベントを使う事も考えられますが Workbook_Openイベントの内容はほぼ<test.vbs>と変わりません。 そのxlsブックをタスクスケジューラに登録するだけですが、 そちらのほうが良いでしょうか。 そうだとしても、提案された内容を一度試してみるというのが普通の対応だと思います。 試してみてどうだったのか、何かエラーが出てうまくいかなかったのか、 または実行環境を考慮するとこの方法は採用できそうもない、とか。 そもそも試し方がわからない、とか。 そういう反応があると前に進み易いのですが。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

ファイルを複製するという事は、その時点での共有Bookの変更履歴を破棄しても構わないという事ですね? そうであれば、一旦Book共有化を解除して、再共有化をする事で変更履歴が破棄されます。 それだけでも肥大したBookサイズはある程度解消すると思います。 まずはそれで試してみられたらどうでしょう。 必要なら、それをマクロ処理する事もできます。 (共有化のままだとマクロ編集できませんから)一旦共有化解除して [Alt]+[F11]キー同時押し[VisualBasicEditor]を起動し[Alt]→[i]→[m]キー順押し。 標準モジュールが挿入されますから、そこに下記コードをコピーペーストします。 Sub reShare()   Const copyName = "C:\mydoc\book2.xls" 'CopyBookのフルパス   Application.DisplayAlerts = False   With ThisWorkbook     .SaveCopyAs copyName     If .MultiUserEditing Then       .ExclusiveAccess     End If     .SaveAs .FullName, accessmode:=xlShared   End With   Application.DisplayAlerts = True End Sub マクロ実行はExcel画面から[Alt]+[F8]キーでマクロを選択して[実行]します。 この場合、サイズが肥大化した時に必要に応じて任意で実行するような運用ですね。 これを定期的に自動実行するようにできなくもないですが。 例えば.. '<test.vbs>--------------------------------------- Option Explicit Const thisName = "C:\mydoc\book1.xls" '元のBookのフルパス Const copyName = "C:\mydoc\book2.xls" 'CopyBookのフルパス Const xlShared = 2 Dim LogName Dim XL Dim wb Dim msg Call Main '------------------------------------------------- Sub Main() On Error Resume Next 'LogはTEMP環境変数のフォルダに保存。 LogName = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%TEMP%") & "\log.log" If Len(LogName) > 0 Then Call XLsub With Err If .Number <> 0 Then If Not XL Is Nothing Then If Not wb Is Nothing Then wb.Close Set wb = Nothing End If XL.Quit Set XL = Nothing End If msg = .Number & "::" & .Description .Clear End If End With With CreateObject("scripting.filesystemobject") If Err.Number = 0 Then With .OpenTextFile(LogName, 8, True, -1) .WriteLine Now & vbTab & msg .Close End With End If End With End If End Sub '------------------------------------------------- Sub XLsub() Dim n Set XL = CreateObject("excel.application") XL.Visible = True XL.ScreenUpdating = False Set wb = XL.Workbooks.Open(thisName) If Not wb.MultiUserEditing Then msg = "MultiUserEditing: False" Else '他のユーザーが開いていたら処理中止。 n = UBound(wb.UserStatus) If n <> 1 Then msg = "UserStatusError: " & n Else XL.DisplayAlerts = False wb.SaveCopyAs copyName wb.ExclusiveAccess wb.SaveAs thisName, , , , , , xlShared XL.DisplayAlerts = True msg = "Success" End If End If wb.Close False Set wb = Nothing XL.Quit Set XL = Nothing End Sub '------------------------------------------------- '# Call Main をコメントアウトすれば、一応ExcelVBAでも試せるようにはしてます。 以上をテキストファイルで保存して拡張子含め test.vbs という名前に変更します。 この test.vbs をタスクスケジューラに登録すれば良いです。 コード内で、UserStatusプロパティを見て、他ユーザーが使用中だったら中止するようにしてます。 ただ、このUserStatusプロパティに不正値が残って、正確には取れない場合があるかもしれません。 その場合は状況に応じてこのチェックを外すなど、修正してください。 また、タスク登録の際、環境によっては cscript.exe から指定しないといけないかもしれません。 C:\WINDOWS\system32\cscript.exe "C:\mydoc\test.vbs"

noname#242311
質問者

お礼

詳細にありがとうございます。 『一旦Book共有化を解除して、再共有化をする事で変更履歴が破棄されます。』 この動きは理解しているのですが、昼間は多くの人が開いているいるため、誰もいない深夜に自動実行したいです。 『(共有化のままだとマクロ編集できませんから)一旦共有化解除して』 という部分は手動ということになりますでしょうか。 全て自動で実行ファイルの肥大化を解消する方法がないかと考えているのですが、何か良いアドバイスがありましたらよろしくお願いします。

関連するQ&A