Excel VBA質問箱 IV

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

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


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

【19987】Excelの起動状況 コウ 04/11/22(月) 14:56 質問[未読]
【19988】Re:Excelの起動状況 ぴかる 04/11/22(月) 15:48 回答[未読]
【19989】Re:Excelの起動状況 コウ 04/11/22(月) 16:20 質問[未読]
【19991】Re:Excelの起動状況 ぴかる 04/11/22(月) 16:41 回答[未読]
【19992】Re:Excelの起動状況 コウ 04/11/22(月) 16:53 お礼[未読]
【20027】Re:Excelの起動状況 コウ 04/11/24(水) 15:55 質問[未読]
【20028】Re:Excelの起動状況 ichinose 04/11/24(水) 19:15 発言[未読]
【20038】Re:Excelの起動状況 コウ 04/11/25(木) 10:13 質問[未読]
【20039】Re:Excelの起動状況 つん 04/11/25(木) 11:05 発言[未読]
【20040】Re:Excelの起動状況 ぴかる 04/11/25(木) 11:10 発言[未読]
【20042】Re:Excelの起動状況 つん 04/11/25(木) 14:05 発言[未読]
【20043】Re:Excelの起動状況 yuu1 04/11/25(木) 15:09 回答[未読]
【20044】Re:Excelの起動状況 コウ 04/11/25(木) 15:49 お礼[未読]

【19987】Excelの起動状況
質問  コウ  - 04/11/22(月) 14:56 -

引用なし
パスワード
   たびたびすいません。よろしくお願いします。
マクロを起動した際に、Excelが既に起動されている場合はマクロを終了させたい
のですが、"Excelの起動を確認する"という方法が良く分かりません。
過去ログを検索して以下のコードで起動確認ができるというのは分かったのですが、
そもそもマクロを含んだExcel自身を見てしまうようで、必ず"起動している"と判定
します。どなたか良い解決法をご存知ではないでしょうか?

Dim obExcel As Object    'Excelオブジェクト
'Excelオブジェクトを取得する
Set obExcel = GetObject(, "Excel.Application")
'Excelが起動しているか判定(起動していればモジュールを抜ける)
If Err.Number = 0 Then
  Exit Sub
End If

【19988】Re:Excelの起動状況
回答  ぴかる  - 04/11/22(月) 15:48 -

引用なし
パスワード
   コウさん、こんにちは。

他のブックが開いているという観点でいいんなら、こんなんで出来るかなと思います。
以前につんさんから、教えて頂いたものを少しいじくりました。

Sub Auto_Open()

  Dim BOOK数 As Long
  Dim wb As Workbook
 
  BOOK数 = 0
 
  For Each wb In Workbooks
    If Windows(wb.Name).Visible = True Then
      BOOK数 = BOOK数 + 1
    End If
  Next wb
 
  If BOOK数 > 1 Then
    MsgBox "既に他のブックが開いています。" & vbLf & _
        "このブックを終了します。"
    Application.DisplayAlerts = False '警告メッセージオフにする
    ActiveWorkbook.Close
  End If

End Sub

【19989】Re:Excelの起動状況
質問  コウ  - 04/11/22(月) 16:20 -

引用なし
パスワード
   ぴかる さん返信有難うございます。
教えてくださったコードでうまくいきました。
一つ良く分からないのですが、以下のコードで立ち上がっている自分のブックが、
wbに入らない(表現間違っているかもしれませんが)のはなぜなのでしょうか?
>  For Each wb In Workbooks
>    If Windows(wb.Name).Visible = True Then
>      BOOK数 = BOOK数 + 1
>    End If
>  Next wb

【19991】Re:Excelの起動状況
回答  ぴかる  - 04/11/22(月) 16:41 -

引用なし
パスワード
   ▼コウ さん:
>ぴかる さん返信有難うございます。
>教えてくださったコードでうまくいきました。
>一つ良く分からないのですが、以下のコードで立ち上がっている自分のブックが、
>wbに入らない(表現間違っているかもしれませんが)のはなぜなのでしょうか?
>>  For Each wb In Workbooks
>>    If Windows(wb.Name).Visible = True Then
>>      BOOK数 = BOOK数 + 1
>>    End If
>>  Next wb

マクロが入っているブックだけなら、BOOK数 = 1 となりメッセージは表示されません。
他のブックがあると、BOOK数 > 1 となりメッセージ表示となります。
こういう事でよろしいです?。ちゃうかな?(^_^;)

【19992】Re:Excelの起動状況
お礼  コウ  - 04/11/22(月) 16:53 -

引用なし
パスワード
   ああ・・・、そうですね。
教えてくださったコードの中に、
If BOOK数 > 1 Then
がありました。自分以外のブックが開いていたら、BOOK数が2以上になるわけですね。
よく見ていませんでした。
どうも有難うございました。

【20027】Re:Excelの起動状況
質問  コウ  - 04/11/24(水) 15:55 -

引用なし
パスワード
   こんにちは。お世話になります。
この投稿で教えていただいたコードでExcelの起動状況は判定できたのですが、
以下の条件だと"インデックスが有効範囲にありません"というエラーが発生します。
何度も申し訳ありませんが、良い手立てがあれば教えていただきたく思います。
(条件)
1.起動状況判定を含むマクロを起動させる
2.1のマクロにて他のbookを作成する(そういう機能があるマクロです)
3.1のマクロを終了する
4.マクロを含むbookと作成したbookがある状態で再びマクロを実行させる

ちなみに、このコードで発生します
>    If Windows(wb.Name).Visible = True Then

【20028】Re:Excelの起動状況
発言  ichinose  - 04/11/24(水) 19:15 -

引用なし
パスワード
   ▼コウ さん:
こんばんは。

>こんにちは。お世話になります。
>この投稿で教えていただいたコードでExcelの起動状況は判定できたのですが、
>以下の条件だと"インデックスが有効範囲にありません"というエラーが発生します。
>何度も申し訳ありませんが、良い手立てがあれば教えていただきたく思います。
>(条件)
>1.起動状況判定を含むマクロを起動させる
>2.1のマクロにて他のbookを作成する(そういう機能があるマクロです)
ということは、ぴかるさんが提示されたコードのとおりと言うわけでは
ありませんね?


>3.1のマクロを終了する
>4.マクロを含むbookと作成したbookがある状態で再びマクロを実行させる
>
>ちなみに、このコードで発生します
>>    If Windows(wb.Name).Visible = True Then

不具合の場合は、この投稿を見ている人が
上記のエラーが再現できるコードと手順を提示して下さい。


又、不具合は、ExcelのバージョンやWindowsのバージョンによっても
起こる場合と起こらない場合があります。
これも記述して下さい。

沢山の方が再現できれば、いろんな案が投稿されると思いますよ!!

ちなみにぴかるさんのコードでコウ さんの1〜4の手順では、
Excel2000で確認したところ、エラーは発生しませんでした。

手順書を記述するのは大変だと思いますが、それを記述する事で
解決してしまう場合もありますから・・・。

【20038】Re:Excelの起動状況
質問  コウ  - 04/11/25(木) 10:13 -

引用なし
パスワード
   ichinoseさん返信有難うございます。
アドバイスに従って、環境と詳細コードを記述させてもらいます。
<環境>
Windows2000,Excel2000
<コード>
Public Sub Excel_macro()
  Dim obExcel As Object    'Excelオブジェクト
  Dim lBookNumber As Long   'ブック数カウント
  Dim wkbbuff As Workbook   'バッファ

10
  'ブック数カウントを初期化する
  lBookNumber = 0
  'ワークブック数分ループする
  For Each wkbbuff In Workbooks
    '他のブックの名前が取得できる場合(他のブックがオープンできる場合)
    If Application.Windows(wkbbuff.Name).Visible = True Then '★
      'ブック数カウンタをインクリメントする
      lBookNumber = lBookNumber + 1
    End If
  Next wkbbuff
20
  '他のブックが既に開かれている場合
  If lBookNumber > 1 Then
    '警告メッセージオフにする
    Application.DisplayAlerts = False
    'アプリケーションをクローズする
    ActiveWorkbook.Close
  End If

  'ワークブックを作成する
  Set wkbWorkBook = Workbooks.Add
  wkbWorkBook.Windows(1).Caption = "テスト"
  wkbWorkBook.Worksheets(Sheet1.Name).Activate

  Exit Sub
End Sub

一度このマクロを実行後、"テスト"ブックが作成された後、マクロ搭載ブックと"テスト"
ブックがある状態で再びマクロを起動すると★印のところで"インデックスが有効範囲
にありません"のエラーが発生します。
よろしくお願いします。

【20039】Re:Excelの起動状況
発言  つん E-MAIL  - 04/11/25(木) 11:05 -

引用なし
パスワード
   おはようございます。
横から失礼しあmす。

>Public Sub Excel_macro()
>  Dim obExcel As Object    'Excelオブジェクト
>  Dim lBookNumber As Long   'ブック数カウント
>  Dim wkbbuff As Workbook   'バッファ
>
>10
>  'ブック数カウントを初期化する
>  lBookNumber = 0
>  'ワークブック数分ループする
>  For Each wkbbuff In Workbooks
>    '他のブックの名前が取得できる場合(他のブックがオープンできる場合)
>    If Application.Windows(wkbbuff.Name).Visible = True Then '★
>      'ブック数カウンタをインクリメントする
>      lBookNumber = lBookNumber + 1
>    End If
>  Next wkbbuff
>20
>  '他のブックが既に開かれている場合
>  If lBookNumber > 1 Then
>    '警告メッセージオフにする
>    Application.DisplayAlerts = False
>    'アプリケーションをクローズする
>    ActiveWorkbook.Close
>  End If
>
>  'ワークブックを作成する
>  Set wkbWorkBook = Workbooks.Add

   ↓ここが問題みたいですね?
    ここを、コメントアウトして、Captionが「Book?」のままだと
    2回目以降もエラーにならないですね。
    どういう意図があるのかわからないですけど、
    「テスト」という名前でファイル保存してしまえば、
     エラーにならないのではないでしょうか?
>  wkbWorkBook.Windows(1).Caption = "テスト"
>  wkbWorkBook.Worksheets(Sheet1.Name).Activate
>
>  Exit Sub
>End Sub

wkbWorkBook.Windows(1).Caption = "テスト"
これをした場合、2回目の実行で、
>If Application.Windows(wkbbuff.Name).Visible = True Then '★
「wkbbuff.Name」の中身をみると「Book1」になってますが、
実際は、Book1というキャプションのウインドウがないので、エラーになってるような・・・
何故そうなるのかよくわからないですが・・・

また、ichinoseさんが適切なレスを入れてくださると思いますが、
ちょっと気が付いたことを書いてみました。

【20040】Re:Excelの起動状況
発言  ぴかる  - 04/11/25(木) 11:10 -

引用なし
パスワード
   こんにちは。

あたくし、実力不足と仕事の都合で対応はもう無理かなと思います。
ichinoseさん、つんさん、適切なレスよろしくネ!
スンマセン、失礼しま〜す♪

【20042】Re:Excelの起動状況
発言  つん E-MAIL  - 04/11/25(木) 14:05 -

引用なし
パスワード
   どもども。
再び、つなぎのつんです(^^;

>横から失礼しあmす。
すごいタッチミスですね(>_<)

ちょっと時間があったので、いろいろ見てたのですが・・・
また気になったところが。

>>Public Sub Excel_macro()
     ↓この変数使ってないですよね?
>>  Dim obExcel As Object    'Excelオブジェクト
>>  Dim lBookNumber As Long   'ブック数カウント
>>  Dim wkbbuff As Workbook   'バッファ
>>
>>10
>>  'ブック数カウントを初期化する
>>  lBookNumber = 0
>>  'ワークブック数分ループする
>>  For Each wkbbuff In Workbooks
>>    '他のブックの名前が取得できる場合(他のブックがオープンできる場合)
>>    If Application.Windows(wkbbuff.Name).Visible = True Then '★
>>      'ブック数カウンタをインクリメントする
>>      lBookNumber = lBookNumber + 1
>>    End If
>>  Next wkbbuff
>>20
>>  '他のブックが既に開かれている場合
>>  If lBookNumber > 1 Then
>>    '警告メッセージオフにする
      ↓警告メッセージオフにしてますが、適当なところで
       オンに戻さないと・・・
>>    Application.DisplayAlerts = False
>>    'アプリケーションをクローズする
>>    ActiveWorkbook.Close
>>  End If
>>
>>  'ワークブックを作成する
>>  Set wkbWorkBook = Workbooks.Add
>
   ↓ここで、
   wkbWorkBook.SaveAs (ThisWorkbook.Path & "\テスト.xls")
   のように、ファイル保存してみました。
   そしたら、2回目以降はエラーになりませんでした。
   しかし、2回目以降は、「テスト.xls」がアクティブになってるので、
   開いているブックが2つ以上ある場合に閉じられるブックは
   1回目のブックとは違ってきてますが、そんでええんですか?
>>  wkbWorkBook.Worksheets(Sheet1.Name).Activate
>>
>>  Exit Sub
>>End Sub
>

何度も失礼します。

ところで、ぴかるさん、おひさしぶりです〜^^

【20043】Re:Excelの起動状況
回答  yuu1  - 04/11/25(木) 15:09 -

引用なし
パスワード
   >ちなみに、このコードで発生します
>>    If Windows(wb.Name).Visible = True Then

エラーの原因はCaptionを変えたにもかかわらずWindows(wb.Name)としてる
ためです。(wb.NameはCaptionではない)
対処としてはFor Each のループをWindowsでまわせばいいと思います。
WindowsのVisibleを判定するのにWorkbooksでまわす必要性がありません。
コードはいかのような感じでしょうか。

 Dim ww As Window
 For Each ww In Windows
  If ww.Visible = True Then
   lBookNumber = lBookNumber + 1
  End If
 Next

【20044】Re:Excelの起動状況
お礼  コウ  - 04/11/25(木) 15:49 -

引用なし
パスワード
   返信有難うございます。
教えて頂いたコードで不具合を解消することができました。
みなさんどうも有難うございました。

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