Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8883 / 13646 ツリー ←次へ | 前へ→

【30402】別ブックのシートを統合したい VBA初心者 丸助 05/10/26(水) 19:02 質問[未読]
【30403】Re:別ブックのシートを統合したい Statis 05/10/26(水) 19:19 発言[未読]
【30440】Re:別ブックのシートを統合したい VBA初心者 丸助 05/10/27(木) 17:16 質問[未読]
【30441】Re:別ブックのシートを統合したい Statis 05/10/27(木) 17:52 回答[未読]
【30443】Re:別ブックのシートを統合したい VBA初心者 丸助 05/10/27(木) 18:49 質問[未読]
【30445】Re:別ブックのシートを統合したい Statis 05/10/27(木) 19:49 発言[未読]
【30446】Re:別ブックのシートを統合したい VBA初心者 丸助 05/10/27(木) 19:59 質問[未読]
【30449】Re:別ブックのシートを統合したい Statis 05/10/27(木) 20:25 回答[未読]
【30451】Re:別ブックのシートを統合したい VBA初心者 丸助 05/10/27(木) 20:52 質問[未読]
【30452】Re:別ブックのシートを統合したい Statis 05/10/27(木) 21:10 回答[未読]
【30453】Re:別ブックのシートを統合したい VBA初心者 丸助 05/10/27(木) 21:21 お礼[未読]
【30459】Re:別ブックのシートを統合したい こたつねこ 05/10/27(木) 22:22 発言[未読]
【30546】Re:別ブックのシートを統合したい Statis 05/10/30(日) 9:20 回答[未読]

【30402】別ブックのシートを統合したい
質問  VBA初心者 丸助  - 05/10/26(水) 19:02 -

引用なし
パスワード
   初心者の質問で申し訳ございません。
現在、VBAマクロである業務用のプログラムを作っているのですが、
基本情報とデータが一つのブックとなっており、だんだんとデータがたまってくると、ファイルサイズがとても大きくなり、動作が重くなります。

そこで、基本情報などのシートを別のブックとして保存しておき、メインのブックを開いたときに、基本情報シートなどをコピーで同じブックにもってきて、動作させたいと思っています。

とりあえず自力でコーディングしてみたのですが、複数のブックのオープン、コピーをしており、開くまでに時間がかかり、タスクバーがチラチラします。さっとシンプルに統合し、開くようにする方法は、ありますでしょうか?

また、基本情報などのシートの内容を書き換えられたとき、どのようにして基本情報ブック本体との整合性を取ればよろしいでしょうか?

やや抽象的かもしれませんが、ご教授お願いします。

【30403】Re:別ブックのシートを統合したい
発言  Statis  - 05/10/26(水) 19:19 -

引用なし
パスワード
   ▼VBA初心者 丸助 さん:
こんばんは
>初心者の質問で申し訳ございません。
>現在、VBAマクロである業務用のプログラムを作っているのですが、
>基本情報とデータが一つのブックとなっており、だんだんとデータがたまってくると、ファイルサイズがとても大きくなり、動作が重くなります。
>
>そこで、基本情報などのシートを別のブックとして保存しておき、メインのブックを開いたときに、基本情報シートなどをコピーで同じブックにもってきて、動作させたいと思っています。
>
>とりあえず自力でコーディングしてみたのですが、複数のブックのオープン、コピーをしており、開くまでに時間がかかり、タスクバーがチラチラします。さっとシンプルに統合し、開くようにする方法は、ありますでしょうか?


コードをUpしていただけませんか?

>また、基本情報などのシートの内容を書き換えられたとき、どのようにして基本情報ブック本体との整合性を取ればよろしいでしょうか?
>
>やや抽象的かもしれませんが、ご教授お願いします。

比較するしかないのかな?
データ量にもよりますが。

【30440】Re:別ブックのシートを統合したい
質問  VBA初心者 丸助 E-MAIL  - 05/10/27(木) 17:16 -

引用なし
パスワード
   >コードをUpしていただけませんか?
はい。下の通りです。

'名簿と印刷フォームをシート追加する
Private Sub Workbook_Open()

 Application.ScreenUpdating = False
 '名簿台帳シート
 SheetAddandCopy ("Meibo.xls")
 '印刷フォームシート
 SheetAddandCopy ("PrintForm.xls")

End Sub

Sub SheetAddandCopy(sFileName As String)
Dim new_ws As Variant
Dim copy_ws As Variant
Dim sPath As String
 
 sPath = ThisWorkbook.Path
 
 '同一フォルダ内の指定ファイルを開く&コピー
 Workbooks.Open Filename:=sPath & "\" & sFileName, ReadOnly:=True
 Set copy_ws = Workbooks(sFileName).Worksheets(1).Cells
 Set new_ws = ThisWorkbook.Worksheets.Add
 copy_ws.Copy (new_ws.Cells(1, 1))
 Workbooks(sFileName).Close
 
 Set new_ws = Nothing
 Set copy_ws = Nothing

End Sub


以上ですが、どうでしょうか?
動作が速くなる方法がありますでしょうか?


>比較するしかないのかな?
>データ量にもよりますが。

そうですか。面倒なので強制的に保存しましょうかね。。。
また別の問題なんですが、
BookのBeforeCloseイベントで、名簿シートを本体ブックにコピーして
削除するコードを入れると、×ボタンを押して、閉じるときの
「変更を保存しますか?」をキャンセルすると、名簿シートが削除され
てしまい、そのままプログラムを動作できる状態ではなくなってしまうの
ですが、よい方法はありますでしょうか。

【30441】Re:別ブックのシートを統合したい
回答  Statis  - 05/10/27(木) 17:52 -

引用なし
パスワード
   ▼VBA初心者 丸助 さん:
これで如何でしょう?
変わらないようであれば(ReadOnly:=True)が原因かも??

Private Sub Workbook_Open()
 Dim Da As Variant
 Application.ScreenUpdating = False
 For Each Da In Array("Meibo.xls", "PrintForm.xls")
   SheetAddandCopy Da
 Next Da
 Application.ScreenUpdating = True

End Sub

Private Sub SheetAddandCopy(sFileName As Variant)

Dim Wb1 As Workbook

Set Wb1 = Workbooks.Open(ThisWorkbook.Path & "\" & sFileName, ReadOnly:=True)
Wb1.Worksheets(1).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Workbooks(sFileName).Close False
Set Wb1 = Nothing

End Sub

>そうですか。面倒なので強制的に保存しましょうかね。。。
>また別の問題なんですが、
>BookのBeforeCloseイベントで、名簿シートを本体ブックにコピーして
>削除するコードを入れると、×ボタンを押して、閉じるときの
>「変更を保存しますか?」をキャンセルすると、名簿シートが削除され
>てしまい、そのままプログラムを動作できる状態ではなくなってしまうの
>ですが、よい方法はありますでしょうか。

よく意味がわかりません??
単純に上書き保存して閉じるのではだめなのでしょうか?

【30443】Re:別ブックのシートを統合したい
質問  VBA初心者 丸助  - 05/10/27(木) 18:49 -

引用なし
パスワード
   早速のご回答をありがとうございます。

コードをご回答の通りに変更してみました。体感的には
若干速くなっている気がします。ありがとうございます。

>
>よく意味がわかりません??
>単純に上書き保存して閉じるのではだめなのでしょうか?

要するに、名簿シートと印刷フォームのシートは、本体が
別のブックとなっているので、当プログラムを閉じるときに
一緒に閉じると同時に、変更箇所を本体ブックに反映して
保存する必要があります。

しかし、その名簿シートと印刷フォームシートを本体ブック
に上書き保存して、シートを削除するタイミングが、
workbook_BeforeCloseイベントしかないように思われます。

このイベントだと、閉じるときの「変更を保存しますか」を
キャンセルすると、イベントの内容が実行され、シートの
削除が実行されてしまいますが、画面は元の画面に戻って
しまいます。

実際にcloseするときだけのイベントがあればいいのですが、
見たところ見当たらないもので。。。
解決策はありますでしょうか?

【30445】Re:別ブックのシートを統合したい
発言  Statis  - 05/10/27(木) 19:49 -

引用なし
パスワード
   こんばんは
コードの記載の本体で名簿シートと印刷フォームを変更し
本体を閉じるときに名簿シートと印刷フォームに変更した部分を
コピーし保存すと言う事ですか?

【30446】Re:別ブックのシートを統合したい
質問  VBA初心者 丸助  - 05/10/27(木) 19:59 -

引用なし
パスワード
   ▼Statis さん:
>こんばんは
>コードの記載の本体で名簿シートと印刷フォームを変更し
>本体を閉じるときに名簿シートと印刷フォームに変更した部分を
>コピーし保存すと言う事ですか?

そうです。ユーザーは、名簿と印刷フォームは一つのプログラム、
一つのEXCELブックとして使うような感覚で動かしたいからです。
だから、本体ブックを開いたときに、同時に名簿シートと印刷フォーム
シートをコピーしてもってくる。閉じるときに両シートの変更を更新し、
削除して本体ブックを保存して閉じる。というふうに実装できればと
思っています。

【30449】Re:別ブックのシートを統合したい
回答  Statis  - 05/10/27(木) 20:25 -

引用なし
パスワード
   こんばんは
もっと良い方法があるような気がしますが?
お試しを(すべてThisWorkbookのモジュールです)


Dim Ch As Long
Private Sub Workbook_BeforeClose(Cancel As Boolean)

If Ch = 2 Then
  Call Wb_Open
End If
End Sub
Private Sub Workbook_Open()
 Ch = 1
 Call Wb_Open
 Ch = 2

End Sub

Private Sub SheetAddandCopy(sFileName As Variant)

Dim Wb1 As Workbook
Set Wb1 = Workbooks.Open(ThisWorkbook.Path & "\" & sFileName, ReadOnly:=True)
Wb1.Worksheets(1).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Workbooks(sFileName).Close False
Set Wb1 = Nothing

End Sub

Private Sub Wb_Open()

Dim Da As Variant, Co1 As Long
 Application.ScreenUpdating = False
 Co1 = 1
 For Each Da In Array("Meibo.xls", "PrintForm.xls")
   If Ch = 1 Then
    SheetAddandCopy Da
   Else
    wb_Close Da, Co1
    Co1 = 0
   End If
 Next Da
 Ch = 3
 Application.ScreenUpdating = True

End Sub

Private Sub wb_Close(sFileName As Variant, Co As Long)

Dim Wb1 As Workbook
Set Wb1 = Workbooks.Open(ThisWorkbook.Path & "\" & sFileName)
Application.DisplayAlerts = False
With ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count - Co)
   .Cells.Copy Wb1.Worksheets(1).Range("A1")
   .Delete
End With
Workbooks(sFileName).Close True
Application.DisplayAlerts = True
Set Wb1 = Nothing

End Sub

【30451】Re:別ブックのシートを統合したい
質問  VBA初心者 丸助  - 05/10/27(木) 20:52 -

引用なし
パスワード
   詳しいご回答ありがとうございます。
早速やってみましたが、やはり閉じるときの「変更を保存しますか?」を
キャンセルすると、名簿と印刷フォームの両シートが削除された状態で
プログラム自体は続行してしまいます。

この状態で、たとえば印刷などを行うと、名簿や印刷フォームを参照できない
(シートがない)ためエラーとなります。キャンセルなどするな、と言われる
とそれまでなのですが、同時に複数のEXCELファイルを開いていて、誤って
×ボタンを押してしまうことなどもありますので、この状況を回避できれば
と思います。

意味分かりますでしょうか?

【30452】Re:別ブックのシートを統合したい
回答  Statis  - 05/10/27(木) 21:10 -

引用なし
パスワード
   こんばんは

これで如何かな?(本体のほうのシートは削除していません)

Dim Ch As Long
Private Sub Workbook_BeforeClose(Cancel As Boolean)

If Ch = 2 Then
  Call Wb_Open
End If
ThisWorkbook.Close True

End Sub

Private Sub Workbook_Open()

 Ch = 1
 Call Wb_Open
 Ch = 2
 
End Sub

Private Sub SheetAddandCopy(sFileName As Variant)

Dim Wb1 As Workbook
Set Wb1 = Workbooks.Open(ThisWorkbook.Path & "\" & sFileName, ReadOnly:=True)
Wb1.Worksheets(1).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Workbooks(sFileName).Close False
Set Wb1 = Nothing


End Sub
Private Sub Wb_Open()

Dim Da As Variant, Co1 As Long
 Application.ScreenUpdating = False
 Co1 = 1
 For Each Da In Array("Meibo.xls", "PrintForm.xls")
   If Ch = 1 Then
    SheetAddandCopy Da
   Else
    wb_Close Da, Co1
    Co1 = 0
   End If
 Next Da
 Ch = 3
 
 Application.ScreenUpdating = True
 
End Sub

Private Sub wb_Close(sFileName As Variant, Co As Long)

Dim Wb1 As Workbook

Set Wb1 = Workbooks.Open(ThisWorkbook.Path & "\" & sFileName)

With ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count - Co)
   .Cells.Copy Wb1.Worksheets(1).Range("A1")
End With

Workbooks(sFileName).Close True

Set Wb1 = Nothing

End Sub

【30453】Re:別ブックのシートを統合したい
お礼  VBA初心者 丸助  - 05/10/27(木) 21:21 -

引用なし
パスワード
   いろいろと考えていただいて本当に感謝いたします。

もともとの発想が、ファイルサイズをできるだけ小さくして、動作を
速くしたいために、シートを別々に保存する方法をとったので、本体
から削除しなければ、あまり意味がないんです。

また、本体ファイル(データ)が複数あっても、名簿と印刷フォームは
一つでいいので、本体ファイルとは別で保存することにも意味があります。

でも、なんだかややこしいので、そもそもこのシートがなくなってしまった
時は、印刷マクロ前にメッセージを出して、一度保存して閉じるように注意
をだすようにするしかないと考えています。

EXCELVBAにBeforeCloseだけでなく、OnCloseイベントがあれば、こんな
問題はおきないのですが。。。ご面倒をお掛けして、ありがとうございました。
また、お世話になるかと思いますが、よろしくお願いします。

【30459】Re:別ブックのシートを統合したい
発言  こたつねこ  - 05/10/27(木) 22:22 -

引用なし
パスワード
   ▼VBA初心者 丸助 さん:
こんばんは

>EXCELVBAにBeforeCloseだけでなく、OnCloseイベントがあれば、こんな
>問題はおきないのですが。。。ご面倒をお掛けして、ありがとうございました。
>また、お世話になるかと思いますが、よろしくお願いします。

Auto_Closeではダメなんでしょうか?

それと業務用のプログラムとの事ですが、複数端末で同時に
Bookを開くような事はないのでしょうか?
あるのであれば、それなりの処理を入れる必要がありますが・・・

【30546】Re:別ブックのシートを統合したい
回答  Statis  - 05/10/30(日) 9:20 -

引用なし
パスワード
   こんにちは
本体のシート(開いたときに追加したシート)を変更後
閉じるときに削除して良いのなら

>With ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count - Co)
>   .Cells.Copy Wb1.Worksheets(1).Range("A1")
>End With

Application.DisplayAlerts = False
With ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count - Co)
   .Cells.Copy Wb1.Worksheets(1).Range("A1")
   .Delete
End With
Application.DisplayAlerts = True
で如何ですか?

8883 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free