アレルギー対策、自宅でできる効果的な方法とは?

Excel VBAでユーザーフォームを作成し、ファイルを起動時にSheetを非表示にしてユーザーフォームのみ表示させるようにしました。

そうしたところ、

(1)実行ボタンをクリックすると作成されるExcelファイルも表示されなくなる
(2)終了ボタンをクリックするとユーザーフォームを含むExcelファイルだけが閉じるのではなく、Excelのアプリ自体が終了してしまう(実行ボタンで作成したExcelファイルは表示したままにしたいのに閉じてしまう)

という現象になってしまいました。

某書籍を参考にしてコードを書いたのですが、なぜかこのようになってしまいました。
※「★」が書籍に指示があった箇所です。

<ThisWorkbook>
Private Sub Workbook_Open()
Application.Visible = False '★
myForm.Show '★
myForm.MultiPage1.Value = 0 'マルチページ構成のため
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'========== [×]ボタン,[Alt]+[F4]キーを無効にする ==========
Dim msg As String, title As String
msg = "[画面を閉じて終了する]ボタンから終了してください。"
title = "終了方法"
Dim res As Integer
Select Case CloseMode
Case vbFormControlMenu
res = MsgBox(msg, vbOKOnly + vbCritical, title)
Cancel = True
End Select
ActiveWorkbook.Save '★
Application.Visible = True '★
Application.Quit '★
End Sub

実行したいのは、

(1)ユーザーフォームを含むExcelファイルを起動したときは、起動時にユーザーフォームだけが表示されるようにしたい
 ※ワークシートを非表示としたい
(2)「実行」ボタンをクリックすると、プログラムが実行されExcelファイルが新規で作成され表示される
 ※上記で記載した「★」の部分をコードをコメントアウトしてユーザーフォームから実行ボタンをクリックすると、プログラムが実行され正常にExcelファイルが新規で作成されることは確認済みです。
(3)ユーザーフォームが閉じても、ユーザーフォームのExcelファイルのみ閉じ、新規で作成されたExcelファイルは閉じない。
 ※実行ボタンをクリックして新規ファイルを作成しなかったり、他にExcelファイルがなかった場合は、Excelは終了する。

それとあわせて、
(1)を実行できた場合に、再度コードを編集する時はどうしたらExcelの画面が表示できるのか教えて下さい。
 ※それとも表示できないのでしょうか?

作成締め切りが迫っていて焦っています。
お知恵のある方どうかお力添え下さい。
よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

#3、お礼欄へのレスです。



> 追記いただいたコードを実行してみたところ、終了しては「マクロを有効にしますか?」の画面が表示される・・・という繰り返しになってしまいました。

Excel 2000、2003、2010、と3つの環境で、セキュリティレベルを変えながら動作確認していますが、
ご指摘のような状況は再現できませんでした。
原因を特定することはできませんが、他のイベントプロシージャを間接的に呼び出していたり、
何かしら、こちらから見えない記述が影響しているものと思われます。

> 実現したいことは「閉じたらその選択したものだけ閉じる」「開いたときはユーザーフォームだけが表示される」というごくシンプルなことなのです。

はい、#3は専ら、そのシンプルな要求に必要最低限の手数でお応えしたものです。
(Private Sub CommandButton99_Clickは保険のようなものです。)
動作の確認方法として、#3の記述を新規のブックに貼り付け、ユーザーフォームとコントロールを追加して
試してみては、、、と思います。

#3でも書きましたが、こちらとしては奨めるものでもないので、
諦めるのでしたら、特に返信頂かなくても結構ですが、
その場合は、本件質問を未解決のまま締切にしてください。

お役に立てなかったようで、すみません。
    • good
    • 1

#1、2、cjです。


#2補足欄へのレスです。

> ご提供いただいたコード「 ' ThisWorkbook モジュール  '  8521223」を実行したところ
> 「実行時エラー '1004 'Rows' メソッドは失敗しました '_Global'オブジェクト」エラーになってしまいました。

Rowsのように親オブジェクトを省略して書いた場合は、ActiveWorkbookのActiveSheetのRowsという意味になりますから、
#1の説明でいうと、この部分、
>> ActiveWorkbookとしては捉えられない(=非表示の)ブックオブジェクトが対象ですから、
>> ThisWorkbook、とか、(ThisWorkbook モジュールに書く場合は)Me、とか、明示的に指定してください。
要は、
【"Active"なオブジェクト配下のオブジェクトを捉える】
【表示されている[ブック、シート、セル範囲、等]を捉える】
等の、暗黙の意味付けを持たせてある省略表記をひとつひとつ、
【ブック.シート.セル範囲】のようにきちんと階層を踏んで書換えてあげれば、そのようなエラーは起こりません。
例えば、
  ThisWorkbook.Sheets("シート名").Rows(index)
  Workbooks("ブック名").Sheets("シート名").Rows(index)
のように書く、ということです。
オブジェクトを明示的に指定することは、
これからも頻繁に必要になるであろう非常に重要な基本のひとつです。

> シートを非表示というか、ファイルを開くとユーザーフォームだけが表示されるようにしたいのです。

そうですか。まだ今一つ、目的や意図、求める結果が掴めていませんが、
#1で提示したものは違う、ということなのでしょう。
例えば、Excel以外のアプリケーションは一切起動していない場合、
ファイルを開くと、デスクトップ上にユーザーフォームだけが表示されるようなイメージでしょうか?

ご質問でご提示のコードを基にすれば、、、。
現在のようにユーザーフォームをモーダル表示している場合は、
ユーザーフォームを閉じたタイミングでアプリケーションウィンドウを再表示する為には、
ユーザーフォームを表示する一連の処理の直後に
  Application.Visible = True '◆
を書き加えるだけでいいです。

ユーザーフォームを閉じた時に、ThisWorkbookを閉じる命令をする場合には、
Workbook_Open()プロシージャを最後まで実行した後に、ThisWorkbookを閉じる
ように順番を意識した工夫が必要です。
ここでは、Application.OnTimeメソッドを使った例を簡単に提示します。
ThisWorkbookモジュールの記述が実行される順番はこうなるように書いてあります。
  Application.Visible = False

  myForm.Show

  Application.Visible = True
↓ 条件によっては
  Me.Close SaveChanges:=True
通常は、myForm.Showを実行中に様々な処理をしています。
(myForm表示中は、ずーっとmyForm.Showの行の処理を実行中、なのです)
なので、myForm.Showを実行中にThisWorkbookを閉じてしまうと、
以降の処理に進んではくれません。
そこで、待機中の処理スケジュールを実行してから、ThisWorkbookを閉じるようにする為に、
  Application.OnTime Now, "ThisWorkbook.CloseMe"    '◆ ThisWorkbookを閉じる。
のように、閉じる方法を工夫します。
(本当はApplication.Quitの方も同様に処理するのがベターで、私は必ず実践していますが、
 QA掲示板では触れないのがお約束?みたいなので、ここでは割愛しています。)

' ' ///

' ' ThisWorkbook モジュール
Private Sub Workbook_Open()
  Application.Visible = False '★
  myForm.MultiPage1.Value = 0 'マルチページ構成のため '◆ 必要ない気もしますが、この記述が先でないと意味ないです。
  myForm.Show '★
  Application.Visible = True '◆
End Sub

Private Sub CloseMe()
  Me.Close SaveChanges:=True '◆ ThisWorkbookを閉じる。上書き保存したくない場合はFalse
End Sub

' ' ///

' ' myForm モジュール
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'========== [×]ボタン,[Alt]+[F4]キーを無効にする ==========
  Dim msg As String, title As String
  msg = "[画面を閉じて終了する]ボタンから終了してください。"
  title = "終了方法"
  Dim res As Integer
  If CloseMode <> vbFormCode Then '◆
    res = MsgBox(msg, vbOKOnly + vbCritical, title)
    Cancel = True
    Exit Sub '◆ 以降の行の処理を実行したくないという意図だと思うのですが、その場合の記述。
  End If '◆

''  ActiveWorkbook.Save '★ ? この記述で何をしたいのかはこちらでは解りません

  Dim wbk As Workbook
  For Each wbk In Workbooks '◆ Workbooks総当たり
    If Not (wbk.Name = ThisWorkbook.Name Or UCase(wbk.Name) Like "PERSONAL.XLS*") Then Exit For
  Next
  If wbk Is Nothing Then '◆ ThisWorkbook以外にWorkBookが開かれていなければ
    Application.Quit '★ Applicationを終了
  Else '◆ ThisWorkbook以外にWorkBookが開かれていれば
    Set wbk = Nothing '◆
    Application.OnTime Now, "ThisWorkbook.CloseMe"    '◆ ThisWorkbookを閉じる。
  End If
End Sub

' ' ///

私個人の考えとして、Application.Visible = Falseを扱うのは、
絶対にエラーを出さない(エラー時にプロジェクトを終了させない)
という前提でしか書けるものではありませんから、
非常時の対策が面倒という意味で他人に奨めるものではないのです。
一応、こちらの立ち位置だけは理解して貰いたい、というだけのことで、
ご要望に応えた物を書くこと自体は、差支えありません。

ただ、やはり心配なので、
#1でも提案したように、緊急避難用に
ボタンを用意(目立たない所に配置)しておくことをお勧めしておきます。

' ' ///

' ' myForm モジュール
Private Sub CommandButton99_Click()
  Application.Visible = True
  Me.Hide
End Sub

' ' ///

> 本を見たらそれができると書いてあったので。
> ただ、本の通りに実行したら質問に記述したとおり、

本に書いてあれば間違いない、というものではないでしょうし、
目的や条件などを十分に考慮した上で、応用するのは思ったより難しかった、というようなことでしょうね。

> ボタンをクリックすると作成されるファイルまで非表示になってしまい
> (最小化もされていないが、バックグラウンドでは開いている様子)、
> 結果を見ることができません。
> また、ユーザーフォームを閉じると、Excelのアプリケーション自体が終了してしまい、
> 他のファイルが開いていてもそれも終了してしまうので、
> ユーザーフォームのファイルだけが終了するようにしたいというのが希望です。

一通り解説策は示せたものと思っています。

以上です。
    • good
    • 4
この回答へのお礼

「Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
」に追記いただいたコードを実行してみたところ、終了しては「マクロを有効にしますか?」の画面が表示される・・・という繰り返しになってしまいました。実現したいことは「閉じたらその選択したものだけ閉じる」「開いたときはユーザーフォームだけが表示される」というごくシンプルなことなのです。いろいろご迷惑をおかけしてしまい申し訳ございませんでした。

お礼日時:2014/03/24 16:31

#1、cjです。


原稿を投稿時に要約して再構成している内に、
おかしな文章を上げてしまいました。

> ユーザーフォームをモーダル(排他的)表示した場合は、
> コマンドバーのボタン(又はクイックアクセスツールバー)に頼るぐらいしか無いのではないかと。
> それでは心許ない、というか、カスタマイズされた環境でしか出来ないことになってしまいます。

結果的に間違った内容になっています。
ユーザーフォームをモーダル(排他的)表示したまま、
「ユーザーフォームを介してのコードによる操作」以外の方法で、
VBEを新たに開くなどの方法は、なかったように記憶しています。
(予めVBEを開いておいて最小化してあればタスクバーから再表示できますし
 裏ワザ的なネタはあるといえばあるのですが)
今回回答の趣旨からしても、不要な説明になっていますので、
上記3行については撤回、とさせてください。

最後のサンプル、.Hideメソッドを使い方、とかは、役に立つんじゃないかな?と思っていますけれど。

失礼しました。

この回答への補足

いつもありがとうございます。ご提供いただいたコード「 ' ThisWorkbook モジュール  '  8521223」を実行したところ「実行時エラー '1004 'Rows' メソッドは失敗しました '_Global'オブジェクト」エラーになってしまいました。シートを非表示というか、ファイルを開くとユーザーフォームだけが表示されるようにしたいのです。本を見たらそれができると書いてあったので。ただ、本の通りに実行したら質問に記述したとおり、ボタンをクリックすると作成されるファイルまで非表示になってしまい(最小化もされていないが、バックグラウンドでは開いている様子)、結果を見ることができません。また、ユーザーフォームを閉じると、Excelのアプリケーション自体が終了してしまい、他のファイルが開いていてもそれも終了してしまうので、ユーザーフォームのファイルだけが終了するようにしたいというのが希望です。

補足日時:2014/03/21 10:14
    • good
    • 1

こんにちは。




シートを非表示というオーダーですが、
ブック内のすべてのシートを非表示にすることは不可能ですから、
代りにブックのウィンドウを非表示にします。
(※ブックが複数のウィンドウをもっている場合もあります。
  その場合はすべてのウィンドウを非表示にするようループさせてください)
ウィンドウがひとつであれば、
  Me.Windows(1).Visible = False
という記述で非表示に、
  Me.Windows(1).Visible = True
で再表示されます。

因みに、ウィンドウを非表示にした状態で、ブックを保存すれば、
次に開いた時にも非表示の状態は維持されますのでWorkbook_Openイベントからの
ブックのウィンドウを非表示にする処理は、設計次第では必要ない場合もあるのかも知れません。

しかし、Excelメニューの[表示]タブから簡単に[再表示]出来てしまいますから、
見られては困る内容ならば、ブックの保護を組み合わせた方がよいのかも知れません。
その場合のサンプルとしては以下のような書き方になります。
後述の本題のコードではブックの保護を扱っていませんので、
必要なら.Windows(1).Visible = の前後の行に追加修正してください。
その際は、記述の順番を間違えないように注意することと、
ActiveWorkbookとしては捉えられない(=非表示の)ブックオブジェクトが対象ですから、
ThisWorkbook、とか、(ThisWorkbook モジュールに書く場合は)Me、とか、明示的に指定してください。

Sub ブックのウィンドウ非表示()
  Me.Windows(1).Visible = False
  Me.Protect Password:="1234", Structure:=True, Windows:=True
End Sub
Sub ブックのウィンドウ再表示()
  Me.Unprotect Password:="1234"
  Me.Windows(1).Visible = True
End Sub

また、そもそもシートを表示させないブックということなら、
アドインブック(*.xla、*.xlam)として保存しておくのが一般的なので、
通常のマクロ有効ブックを開いてシートが見えないのは、
慣れた人でも驚いてしまうかも知れませんから、理解を得るよう工夫した方が好いとも思います。

' ' ///

お望みのものとは違うかも知れませんが、
直接的な返答として現状に役立ちそうな記述を以下並べてみます。

' ' ///

' ' ThisWorkbook モジュール  '  8521223
Private Sub Workbook_Open()
' '  Application.Visible = False '★
  Me.Windows(1).Visible = False '◆
  myForm.MultiPage1.Value = 0 'マルチページ構成のため '◆ 必要ない気もしますが、この記述が先でないと意味ないです。
  myForm.Show '★ モーダル表示の場合は、myForm を閉じるまで次の行に進みません。
End Sub

' ' ///

' ' myForm モジュール  '  8521223
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'========== [×]ボタン,[Alt]+[F4]キーを無効にする ==========
  Dim msg As String, title As String
  msg = "[画面を閉じて終了する]ボタンから終了してください。"
  title = "終了方法"
  Dim res As Integer
'  Select Case CloseMode
'  Case vbFormControlMenu ' フォームの閉じるボタンから閉じようとした場合は  ◎
'    res = MsgBox(msg, vbOKOnly + vbCritical, title)
'    Cancel = True
'  End Select
  If CloseMode <> vbFormCode Then '◆ コード(自作のボタンのイベント)からUnLoadした場合以外は  ◎
    res = MsgBox(msg, vbOKOnly + vbCritical, title)
    Cancel = True
    Exit Sub '◆ 以降の行の処理を実行したくないという意図だと思うのですが、その場合の記述。
  End If '◆

''  ActiveWorkbook.Save '★ ? この記述で何をしたいのかはこちらでは判りません

  Dim wbk As Workbook
  For Each wbk In Workbooks '◆ Workbooks総当たり
    If Not (wbk.Name = ThisWorkbook.Name Or UCase(wbk.Name) Like "PERSONAL.XLS*") Then Exit For
  Next
  If wbk Is Nothing Then '◆ ThisWorkbook以外にWorkBookが開かれていなければ
''    Application.Visible = True '★
    Application.Quit '★ Applicationを終了
  Else '◆ ThisWorkbook以外にWorkBookが開かれていれば
    Set wbk = Nothing
    With ThisWorkbook '◆ ThisWorkbookについて
      .Windows(1).Visible = True '◆ Windowを再表示する
      .Close SaveChanges:=True '◆ 閉じる。上書き保存したくない場合はFalse
    End With '◆
  End If
End Sub

' ' ///

他、

> (1)を実行できた場合に、再度コードを編集する時はどうしたらExcelの画面が表示できるのか教えて下さい。
>  ※それとも表示できないのでしょうか?

ユーザーフォームをモーダル(排他的)表示した場合は、
コマンドバーのボタン(又はクイックアクセスツールバー)に頼るぐらいしか無いのではないかと。
それでは心許ない、というか、カスタマイズされた環境でしか出来ないことになってしまいます。
ブックのウィンドウを再表示するコード自体は前述のように至って簡単ですが、
権限によって再表示の可否を制限する必要があるなら、以下のような感じにします。
この例では、仮に、CommandButton99 を クリックした場合、のイベントプロシージャに書いていますが、
UserForm_QueryClose イベント内の記述、res = MsgBox()を工夫して、
resの値で条件分岐してみるのもいいかも知れません。
(ユーザー目線で、パスワードを探りたくなるような目立つ設計を奨めるつもりではありませんけれど。)
ブックの保護と関連付ける場合は前述のサンプルを参考にして下さい。

' ' ///

Private Sub CommandButton99_Click()
  Dim vRtn
  Const ADMIN_PASS = "1234" '◆ ぱすわーど任意に指定
  vRtn = Application.InputBox(Prompt:="パスワードを入力", Title:="管理者用編集モード")
  If vRtn <> ADMIN_PASS Then Exit Sub
  ThisWorkbook.Windows(1).Visible = True
  Me.Hide
End Sub

' ' ///


因みに、パスワードを扱うなら、
VBAProjectを保護しておくのが、比較的簡単でより堅くなるとは思います。

以上です。
    • good
    • 1

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

QExcelのVBAでフォームだけ表示させる方法

はじめまして。

UserForm1で、デジタルで時間を表示する(デジタル時計)を作成しています。
Excelのアプリケーションを表示せず、フォームのみ表示させたいので、
Application.Visible = Falseとしたいのですが、この方法だと、他のExcel
ファイルを起動する際に、Excelが見えなくなってしまいます。

■やりたいこと
・Excelファイルが1つも開かれていない場合、Excelを非表示にして
 Userform1のみ表示されている状態で起動する
・Userform1のみ表示している状態で、他のBooKを開いた場合、
 Excelを表示して開いたBookを表示させる
・他のBooKを開いている状態で、Userform1が記述されているBook
 を開いた場合、ExcelもUserform1も表示させる
・他のBookを閉じるて、Userform1が記述されているBookのみになった
 場合、Excelを非表示にしてUserfrom1のみ表示されている状態にする

自分自身(Userform1を記述しているBook)のみ起動している時には、
Application.Visible=falseにすれば良いのだと思いますが、どういうロジック
を組めば良いかご教授いただければ幸いです。

すみませんが、よろしくお願い致します。
それ以外の時は

はじめまして。

UserForm1で、デジタルで時間を表示する(デジタル時計)を作成しています。
Excelのアプリケーションを表示せず、フォームのみ表示させたいので、
Application.Visible = Falseとしたいのですが、この方法だと、他のExcel
ファイルを起動する際に、Excelが見えなくなってしまいます。

■やりたいこと
・Excelファイルが1つも開かれていない場合、Excelを非表示にして
 Userform1のみ表示されている状態で起動する
・Userform1のみ表示している状態で、他のBooKを開いた場合、
 Excelを表示して開...続きを読む

Aベストアンサー

無理。
つうか VBA で苦労してやる内容じゃない。
だいたいが、何に使うのか知らないけれど Excel でやる意味あるの?

時計を表示する Excel ファイルと、時計を表示しているときに開く別の Excel ファイルとの関係がわからない。
時計を表示する Excel ファイルは単にユーザーフォームを表示して時計を刻み続けるだけ。
非表示になっている Excel アプリケーションを表示させるのは、その他の Excel ファイルに書き込むコードの役目であり、時計の Excel ファイルではない。
つまり時計を表示させているときに同時使用する Excel ファイルが限定的じゃない限り破綻する。

質問文をきちんと書き直してみた。
こしてみると、時計表示用 Book 以外にその PC で使用するすべての Book にもコードを書かなければならないということがわかる。
・Excelファイルが1つも開かれていない場合、時計表示用Bookのコードが Excel を非表示にして Userform1 のみ表示されている状態にする。
・他のBooKを開いている状態で、時計表示用 Book を開いた場合、時計用 Book は Excel を非表示にせずに Userform1 を表示させる。
・Userform1 のみ表示している状態で、他の BooK を開いた場合、他の Book のコードが Excel を 再表示する。
・他の Book を閉じて、時計表示用 Book だけになる場合、最後に閉じる他の Book のコードが Excel を非表示にして Userform1 のみ表示されている状態にする。
・Userform1 が表示されていても、他の Book のシートや Excel の各種ユーザー インターフェイスが普通に使用できること。

VB 2012 Express でもインストールして Windows フォームのアプリを作ったほうが早いし、シンプルだと思う。

無理。
つうか VBA で苦労してやる内容じゃない。
だいたいが、何に使うのか知らないけれど Excel でやる意味あるの?

時計を表示する Excel ファイルと、時計を表示しているときに開く別の Excel ファイルとの関係がわからない。
時計を表示する Excel ファイルは単にユーザーフォームを表示して時計を刻み続けるだけ。
非表示になっている Excel アプリケーションを表示させるのは、その他の Excel ファイルに書き込むコードの役目であり、時計の Excel ファイルではない。
つまり時計を表示させているときに同...続きを読む

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。

Q(Excel+VBA)ユーザーフォームのみ表示で完結させたい。

ExcelのVBAを使った複雑なアプリケーションを開発中です。
 本体のWorkBookは、終始必要なくて、ユーザーフォームだけで完結するものです。結果的には、あたかもVBで作成されたもののように見えることになる。
【手順】
1) xslファイルを開くとユーザーフォームのみ表示される。
2) ユーザーフォームで一連の作業を行う。本体のWorkBook上のsheetは処理中に使用はする(作業用の一時データ貼り付けなど)けど、表示させたくない。
3) 作業終了時・・・これがわからない。
     (終了ボタンまたは閉じるボタンクリック)
           |
     <他のWorkBookが開いているか>
   |                 |
   yes                 No
   |                 |
[現在のworkBookのみ閉じる]   |
  saveの必要なし    [アプリケーションを終了する]  
                 saveの必要なし

Aベストアンサー

これでよい?
>3) 作業終了時・・・これがわからない。
'終了ボタンはフォームを閉じるだけでよい
Private Sub CommandButton1_Click()
Unload Me
End Sub
'フォームが閉じる時のイベントで分岐処理
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If Workbooks.Count > 1 Then
'他にBookが存在した場合
Application.DisplayAlerts = False
ThisWorkbook.Close
Else
'他にBookが無い場合
Application.DisplayAlerts = False
Application.Quit
End If
End Sub

以上、参考まで

QエクセルVBAのフォームを最前面にする方法を教えてください。

エクセルVBAなのですが、UserForm1を最前面に表示して、
他のどのウインドウをアクティブにしても消えない状態にしたいのですが、
どのようなコードを書けばできるでしょうか。
VB.NETで表すとMe.TopMost = Trueとなると思うのですが、
エクセルVBAだとそのような書き方はないようです。

もうしわけございませんがご教示頂きたく、お願いいたします。m(__)m

Aベストアンサー

あらかじめ、フォームのプロパティの[ShowModal]をFalseにしておいて、以下のような方法ではダメでしょうか?
画面のアクティブイベントを利用するのは、個人的に嫌いなのですが。。。


Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST As Long = -1
Private Const SWP_NOSIZE As Long = &H1&
Private Const SWP_NOMOVE As Long = &H2&


Private Sub UserForm_Activate()
Call SetWindowPos(GetForegroundWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub

あらかじめ、フォームのプロパティの[ShowModal]をFalseにしておいて、以下のような方法ではダメでしょうか?
画面のアクティブイベントを利用するのは、個人的に嫌いなのですが。。。


Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const HWND_TOPMOS...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Qエクセルで別ブックをバックグラウンドでオープンする方法

最初にメニュー画面となるブックを開いた後、データブックをバックグランドのみで開きたいのですが、エクセルVBAで単純にOPENを行うと画面上にデータブックが表示されてしまいます。操作作業者に画面が次々入れ替わることを見せたくないのですが、ブックをバックグラウンドだけで開く方法はあるのでしょうか。VBAについては素人で宜しくお願いします。

Aベストアンサー

ごめんなさい。解決済みと思って見ていませんでした。 まだですか?

後で開いた3つのブックは、VBAで操作しないのですか。
操作するのでしたら、ブックをオブジェクト変数に入れておいた方が操作しやすい
と思うのですが・・・ 一応何処でどのように使うのか判りませんので・・・

こんな感じで如何でしょうか。

ブックを開いてから非表示にするまでの瞬時の画面のことですね。
それなら、その間、ScreenUpdating = False でどうでしょうか。

Public Bk1 As Workbook
Public Bk2 As Workbook
Public Bk3 As Workbook
Dim PathName As String

Sub Auto_Open()
PathName = ThisWorkbook.Sheets("メニュー").Range("C28").Value
ファイル読込 "初期値.xls", Bk1
ファイル読込 "データ1.xls", Bk2
ファイル読込 "データ2.xls", Bk3
End Sub

Sub ファイル読込(BkName, ObjBk)
Application.ScreenUpdating = False
Set ObjBk = Workbooks.Open(Filename:=PathName & "\" & BkName)
Windows(BkName).Visible = False
Application.ScreenUpdating = True
End Sub

ごめんなさい。解決済みと思って見ていませんでした。 まだですか?

後で開いた3つのブックは、VBAで操作しないのですか。
操作するのでしたら、ブックをオブジェクト変数に入れておいた方が操作しやすい
と思うのですが・・・ 一応何処でどのように使うのか判りませんので・・・

こんな感じで如何でしょうか。

ブックを開いてから非表示にするまでの瞬時の画面のことですね。
それなら、その間、ScreenUpdating = False でどうでしょうか。

Public Bk1 As Workbook
Public Bk2 As Workbook
P...続きを読む

QExcel VBAで、ユーザーフォームの値を、モジュールで使用したい。

VBA初心者です。(おそらく)基本的な質問で、申し訳ありません。
ユーザーフォーム1には、テキストボックス1とコマンドボタン1が配置されているとします。

Sub TEST ()
Dim N
Userform1.Show
MsgBox N
End Sub

Private Sub CommandButton1_Click()
Dim N
N = TextBox1.Text
UserForm1.Hide
End Sub

Sub TESTを実行した時に、ユーザーフォーム1からNの値を引き継ぐには、どうしたら良いのでしょうか?よろしくお願いします。

Aベストアンサー

'モジュールに変数宣言(グローバル変数)
'Public 宣言すると他のモジュールやフォームと
'共有できる変数になります。
Public AA As String

'sample
'A1 を実行する。

Sub A1()
Call A2
AA = InputBox("input", , AA)
End Sub

Sub A2()
AA = InputBox("input", , AA)
End Sub


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報