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

グーグルや過去ログを検索してもわからなかったので質問させていただきます。

エクセル(2003or2007)でVBAを用いた備品の管理ソフト(bihin.xls)を作っています。
このファイルは、起動時にAuto_Openマクロでウィンドウをもう一つ作って、2つを上下に並べて比較しながら操作できるようにしています。


しかし困ったことに、この状態で全く関係ないエクセルファイルを開くと、ウィンドウ数が計3つになってしまい見づらくなってしまいます。
また逆に、全く関係ないエクセルファイルを開いているときにこのbihin.xlsを起動すると、これまたウィンドウが3つになってしまいます。

したがって、
(1)bihin.xlsを開いているときに別のエクセルファイルを開いたら、新しいエクセルで開かせる。(つまりエクセルの複数起動)
(2)別のエクセルファイルを開いているときにbihin.xlsを開いたら、bihin.xlsを新しいエクセルで開く。
・・・という2つの機能を実現させたいと考えております。

エクセルを複数起動させる方法として、スタートメニューからエクセルを開くという方法があるのは知っているのですが、このbihin.xlsは複数の人が使うことになるので、いちいち全員にスタートメニューから開かせるのは非効率なのでできません。
また、何かしらのエクセルの設定を変更して実現できるとしても、全員のエクセルの設定を変更させるはあまりやりたくはありません。
ですので、bihin.xlsに記述するマクロで何とかしたいと考えています。

どなたかご教授いただければ幸いです。
よろしくお願いいたします。

A 回答 (6件)

補足、ありがとうございます。


>「ThisWorkbook.Name」や「ActiveWorkbook.Name」でファイル名は取得できるのではと考えており
それは、現在開いているエクセルファイルの名前取得ですよね?
いずれかのエクセルファイルが開いていて、その中で何かマクロを実行(ボタンを作成して押すなり、メニューから実行なり)したときに他のエクセルファイルに対して何かの動作を行う事はできますが、いつ開かれるかもわからない、また自分から何のアクションもせずに自動で勝手にマクロが実行される、というのは無理です、ということです。
仮に「bihin.xls」が先に開いていて、他のエクセルをいわゆる複数起動で開こうとするということは、「開いているエクセルに対して実行するマクロを、まだ開いていないエクセルファイルに対して実行する」という矛盾した事をやらせようということになりませんか。
これからユーザの手によって開かれる予定のエクセルファイルが何かなんて、今開いているエクセルが知る由もありませんし。
知っていたとしても、開いてもいないファイルの名前は取得できません。
また、逆に他のエクセルが開いているところに「bihin.xls」を開こうとして、いわゆる複数起動のためにまだ開いていない「bihin.xls」の中のマクロを動かす事はできません。
と、いうことです。

この回答への補足

>tsuka2tsuka様
ご解答誠にありがとうございます.
ご指摘は確かにその通りですね.ご丁寧に説明していただきありがとうございます.
マクロを勉強し始めてまだ少ししか立っていませんが,知識が無いゆえにマクロを使いこなせればどんなことでもできる,と思っていたのですが,当然ですがやっぱりできないことはあるんですよねw
他の方法を検討してみようと思います.
ありがとうございました.

補足日時:2008/06/02 00:01
    • good
    • 1

こんにちは。



#4 の回答者です。

>いろいろとエラーが起きてしまいました

ThisWorkbook に競合するものがあれば、また話は違いますが、おそらくは、それは、簡単な理由だと思います。分からないままに、無理なことは望みませんが、たぶん、最初のオブジェクト(App)の設定がされていないのですね。

ThisWorkbook上の、最初の

Private Sub Workbook_Open()
'起動時(コード変更時は、再度、設定しなおしてください)
 Set App = Excel.Application '単にApplicationでも可 
 ↑
で、App が確保されなければ、そのすべては動きません。

一旦、閉じて、再びブックを開けるか、そのWorkbook_OpenをVBEditor 上で実行してくださればよいです。そのままでは、そのイベント・ドリブン型のマクロは実行されないのです。
    • good
    • 0

ウィンドウの整列で、「作業中のブックのウィンドウを整列する」というチェックがありますが、それを使ってみるとか。

    • good
    • 0
この回答へのお礼

>higekuman様
ご回答ありがとうございます.
higekuman様や皆様のご指摘を参考にし,bihin.xlsの上下のウィンドウサイズをマクロによって起動時に固定するという方法をとることにしました.
この方法を取ることによって,エクセルを重複起動するわけではございませんが,最初に開いても後に開いてもbihin.xlsの上下のウィンドウは固定され,見易さは保たれるため一応の解決はできました.
どうもありがとうございました.

お礼日時:2008/06/02 00:56

こんにちは。



完全に、ご質問の状態を理解しているわけではありませんが、アプリケーション・イベントを設ければよいと思うのです。ただし、分かりきっていることかもしれませんが、

ツール--オプション--表示--
 レ ウィンドウをタスクバーに表紙
としておかないと、切り替えが面倒だと思います。

#1-#2さんのご指摘は非常に鋭いですね。

>「開いているエクセルに対して実行するマクロを、まだ開いていないエクセルファイルに対して実行する」
というのは、確かに一般的におっしゃるとおりだと思います。ただ、それは、アプリケーションのイベントの中に存在していれば、イベントは取得することは可能です。だから、アプリケーション・イベントで、インスタンスを設けてあげればよいと思います。

しかし、非効率的かもしれませんが、ThisWorkbook は決まっていますから、DeActive やActive で、Windows の総当たり制でも可能なような気がします。

それはともかくとして、ThisWorkbook モジュールに以下のように設定すればどうかと思います。どこまで、網羅しているのかは分かりかねますが。

---------------------------------------
Private WithEvents App As Application
Private Sub Workbook_Open()
'起動時(コード変更時は、再度、設定しなおしてください)
 Set App = Excel.Application '単にApplicationでも可
 With ThisWorkbook
 If .Windows.Count = 1 Then
  .NewWindow
  .Windows.Arrange ArrangeStyle:=xlHorizontal
 End If
 End With
End Sub

Private Sub App_NewWorkbook(ByVal Wb As Workbook)
 '新規ブックを開いたとき
 Call ThisWorkbook.WinActivate(Wb)
End Sub

Private Sub App_WorkbookActivate(ByVal Wb As Workbook)
 '別のブックをアクティブにしたとき
 Call ThisWorkbook.WinActivate(Wb)
End Sub

Private Sub App_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
  '別のブックを閉じたとき
 Call ThisWorkbook.WinHolizontalDevide(ThisWorkbook)
End Sub

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
 '別のブックを開いたとき
 Call ThisWorkbook.WinActivate(Wb)
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
 '別のブックを閉じたとき
 Call ThisWorkbook.WinHolizontalDevide(ThisWorkbook)
End Sub

Sub WinActivate(Wb As Workbook)
'サブルーチン(アクティベート)
 If Not Wb.Name Like ThisWorkbook.Name & "*" Then
  Wb.Windows(1).WindowState = xlMaximized
  Wb.Windows(1).Activate
 End If
End Sub
Sub WinHolizontalDevide(Wb As Workbook)
'サブルーチン(デ・アクティベート)
  If Wb.Name Like ThisWorkbook.Name & "*" Then
    Wb.Windows.Arrange ArrangeStyle:=xlHorizontal
  End If
End Sub
    • good
    • 0
この回答へのお礼

>Wendy02様
ご回答ありがとうございます.
Wendy02ご提示頂いたコードを組み込んでみましたところ,私が作っていたマクロがいけなかったのか,いろいろとエラーが起きてしまいました.
ご回答いただいたのに申し訳ございませんが,これらのプログラムは私にとって少々難関で使いこなせなさそうですので,今回は別の方法を検討したいと思います.
Wendy02のご提示くださったプログラムは大変参考になりますので,今後の勉強に役立てていきたいと思います.
ありがとうございました.

お礼日時:2008/06/02 00:32

エクセルの複数起動ではないのですが、


bihin.xlsのThisWorkbookモジュールにおいて、

Private Sub Workbook_Deactivate()
ActiveWindow.WindowState = xlMaximized
End Sub

Private Sub Workbook_activate()
ThisWorkbook.Windows.Arrange ArrangeStyle:=xlHorizontal
End Sub

とするのはいかがでしょうか?
    • good
    • 0
この回答へのお礼

>cafe_au_lait様
ご回答ありがとうございます.
試しにこのコードを導入してみたのですが,『ThisWorkbook.Windows.Arrange ArrangeStyle:=xlHorizontal』のところで『WindowsクラスのArrangeメソッド失敗しました』とエラーがでました.事前に私が組んでいたwindow関連のマクロと干渉しているのかもしれません.
bihin.xlsは起動時にウィンドウを二つにして並べて整列させた後,ウィンドウを固定させているので,おそらくここだとは思うのですが・・・.

お礼日時:2008/06/02 00:27

無理だと思います。


どれが特定のもの(ここで言うbihin.xls)で、どれが特定ではない(ここで言う関係ないエクセルファイル)ものかを見分ける方法などありません。それはあなたが自分の都合で特定を決めているだけだからです。

>いちいち全員にスタートメニューから開かせるのは非効率
そうやることを手順の一つとしてしまえば非効率ではなく、それが手順となると思うのですが。事務や経理の方など、ITに詳しくない人たちは、「こういう手順で開いてくださいね」というと、必ずそれを守って実行してくれますよ。守らないのは、むしろ「多少は知ってるぞ、パソコン使えるぞ」と思ってる人ですね。

この回答への補足

>tsuka2tsuka様
ご回答ありがとうございます。
ファイルの見分け方についてですが、私としては「ThisWorkbook.Name」や「ActiveWorkbook.Name」でファイル名は取得できるのではと考えており、それによってファイルを見分けること自体はできるのではないか、と少ない知識ながら淡い期待を抱いております。
ただ、それをどうマクロに組み込んでいけばいいか皆目見当がつかない状況です。

全員に特定の開き方を強いるのは確かにおっしゃるように手順の一つではあります。
ですが、なるべく他の人に余計な手間は取らせたくないので、できるだけ便利なソフトを作っていきたいと考えております。

補足日時:2008/06/01 01:53
    • good
    • 0

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