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フォーム御礼とは何ですか?

こんにちは。
あるブログで「フォーム御礼」という言葉を見かけましたが、どういう意味でしょうか?教えてください。

Aベストアンサー

そのブログサイトに設置されているメールフォームなどから
送られてきたブログ閲覧者からのメッセージに対する
ブログ管理者のお礼ではないでしょうか。

QExcel VBAで、ユーザーフォームをモードレス表示している間、処理を止めるには?

VBA初心者です。
タイトルの通りですが、例えばサブルーチン(1)の途中でユーザーフォーム(1)をモードレス表示している間、処理を止めることは可能でしょうか?
サブルーチン(1)を、ユーザーフォーム(1)を表示する前後に分割して、ユーザーフォーム(1)を閉じた時にサブルーチン(1-後半)を呼び出すことも考えたのですが・・・サブルーチン(1-前半)を別のサブルーチン(2)から呼び出した場合に、サブルーチン(1-前半)をEnd Subした時点で、サブルーチン(2)が進行してしまいます。
分かり難い質問で申し訳ありませんが、皆様の知恵をお貸しください。よろしくお願いします。

Aベストアンサー

>コードを解説していただけないでしょうか?
どこらへんが、わからないんでしょうか?
>UserForm1.Show (vbModeless)
はもともとやっておられるから
>Do While form
>dummy = DoEvents()
>Loop
ですか?
Do While ~ Loop は、条件が成立している間ループするということです。
この場合の条件は「form」ですが、これは、Boolean ですので、
True と False の値をとります。
True は、条件が成立しているということを表します。
つまり、form の値がTrue から False に変化するまでループを実行するということです。
DoEvents 関数は、OSにたまっている処理を実行させる処理をします。
単純に、
Do While True
'処理は何もない
Loop
とかすると、ものすごい勢いでループをして、他のプログラムが何かを処理する機会が与えられないので他のプログラムは動作できなくなります。そういう場合に、他のプログラムに対して処理する機会を与える(OSがやります)ことができます。
Dummy は、DoEventsが返す値はこの場合、別に必要ないですが、関数を関数形で呼び出す場合には、何かに代入する形にしてやる必要があります。
手続きではなくて関数を呼び出しているということをはっきりさせるためにそのようにしています。(他の人ならそのようには書かないかもしれません、そういうのは趣味で分かれる範疇です)

>コードを解説していただけないでしょうか?
どこらへんが、わからないんでしょうか?
>UserForm1.Show (vbModeless)
はもともとやっておられるから
>Do While form
>dummy = DoEvents()
>Loop
ですか?
Do While ~ Loop は、条件が成立している間ループするということです。
この場合の条件は「form」ですが、これは、Boolean ですので、
True と False の値をとります。
True は、条件が成立しているということを表します。
つまり、form の値がTrue から False に変化するまでループを実行す...続きを読む

Q“フォーム”とは何でしょうか。

“フォーム”というインターネット関連の言葉を最近耳にいたします。

検索を試みましたが、しっくりと理解できません。

特徴を教えていただけないでしょうか。
何ができるのでしょうか。その例を教えていただきたく願います。

Aベストアンサー

「フォーム」とは、データを送信するための窓といったらいいでしょうか。gooでも、検索するときに検索キーワードを入力するボックスがありますよね。それやチェックボックスなんかを総称して「フォーム」と呼びます。

「フォーム」を使えば、ユーザーが任意に選んだ情報をサーバーに送信できるという特徴がありますね。(つまり選択肢のなかから選択といったことが可能になる)

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メールフォームのソースにある「id="sen"」とは何?

人にもらったメールフォームをカスタマイズしてフォームを作っています。一行のテキスト入力フィールドのソースが以下のようになっています。
<INPUT type="text" size="50" maxlength="50" name="mail1" id="sen">
フィールドは複数あるのですが、どれも「id="sen"」がついていて、これが何を規定しているものかわかりません。html制作はホームページビルダーを使いましたがそのような設定項目はなく、Web制作の本をみても載っていません。なくてもいいものなのか、設定が必要なものなのか、わかる方、教えて下さい。
(私はhtmlを作成し、あとはプログラマに修正してもらうことになっているのですが、そのプログラマの方もよくわからないようです。)

Aベストアンサー

idはスタイルシートやJavaScript、DynamicHtmlで使用される要素です。
そういった類のものがソース内になければ、idは消去しても問題ないはずです。

参考URL:http://www.tohoho-web.com/html/attr/id.htm

QEXCEL VBAで作った ユーザーフォームを複数の人で利用したい。

いつもお世話になっています。
皆さんに色々教えていただいて何とか形になってきました。
あと一息です。
EXCELのVBAでユーザーフォームを作成しシートよりTEXTBOXにデータを表示TEXTBOXの値でシートを更新するというところまではできたのですが、それを複数ユーザーで共用したいのですが”読み取り専用とかのメッセージが出るのはツール→ブックの共用→複数のユーザーによる同時編集と、ブックの結合を許可するにチェックを入れ、詳細で自動保存するにしたのですが最初に作ったユーザーは出来るのですが。
二番目移行のユーザーからは更新しても"この場所に○○○.XLSという名前のファイルがすでにあります。置き換えますか?"となってしまい
更新がうまくいきません。
ユーザーフォームをとじる時は下記のようにしてあります。
Private Sub CommandButton1_Click()
Dim wbook As Workbook
For Each wbook In Workbooks
wbook.Save
Next wbook
Application.Quit
End Sub
質問の仕方が下手でスミマセン、宜しくお願いいたします。


    

いつもお世話になっています。
皆さんに色々教えていただいて何とか形になってきました。
あと一息です。
EXCELのVBAでユーザーフォームを作成しシートよりTEXTBOXにデータを表示TEXTBOXの値でシートを更新するというところまではできたのですが、それを複数ユーザーで共用したいのですが”読み取り専用とかのメッセージが出るのはツール→ブックの共用→複数のユーザーによる同時編集と、ブックの結合を許可するにチェックを入れ、詳細で自動保存するにしたのですが最初に作ったユーザーは出来るのですが。
二番...続きを読む

Aベストアンサー

メッセージが表示されなければ良いの?

Private Sub CommandButton1_Click()
Dim wbook As Workbook
Application.DisplayAlerts = False
For Each wbook In Workbooks
wbook.Save
Next wbook
Application.DisplayAlerts = True
Application.Quit
End Sub

試す環境が無いので、試していませんが・・・

Q質問フォームからの情報とは

よくホームページなどで、
「ご意見・ご感想はコチラ」のような入力するところがありますが、
(アドレスへ送るのではなく、入力フォームです)
あれは送り元であるこちらの情報、
例えばPCやケータイの何らかの情報も自動的に送られるものなのでしょうか?

同じPCから二度送れば、同じ情報が出て発送者が分かったりするものでしょうか?

Aベストアンサー

そのフォームサービスによって違うと思いますが、IPとHostが分かってしまうものがあります。
そういったものだと同じPC・ケータイからの発信なら分かってしまうでしょう。

QExcel VBAで、ユーザーフォームのスクロールボックスの移動ピッチを細かくしたい

VBA初心者です。
ユーザーフォームに配置したスクロールバー内のスクロールボックスを、マウスでドラッグした時の移動ピッチを細かくすることは可能でしょうか?両側のスクロール矢印ボタンを押したときの移動ピッチは、設定可能ですが・・・
よろしくお願いします。

Aベストアンサー

ドラッグ中ですか?
ドラッグを終えた時の移動後の位置ですか?

結局、ボックスが止まる位置はプロパティの Min と Max の値によって変わります。
Min が 0 で、Max が 5 ならボックスは 6箇所しか止まりません。

ドラッグ中にボックスが視覚的に移動する解像度についてはわかりません。
というかマウスの移動解像度にも影響されるので意味無いでしょう。
操作する人の忍耐力も必要でしょうから。

QGV-RX26T256HのPCBフォームとは?

http://www.links.co.jp/html/press2/gigabyte_gv-rx26t256h.html
今度、上記サイトのボードを買おうと思っているのですが、PCBフォームの意味が分かりません。
私のPCはマイクロATXなので、もしかしたら使えないのでしょうか?
スペックは
M2A-Vm
AMD DC 5000+
CFD W2U800CQ-1GLZJ PC2-6400 2G
DVD ASUS DRW-2014L1T B BULK
HDD HITATHI GST 160G
M-60BK (ブラック・電源なし)
ZUMAX 400W

宜しくお願いします。

Aベストアンサー

PCBフォームはATX、PCBサイズは175mm×111mm
ざんねんながら ATX仕様ですが PCはマイクロATX無理かと思いますが
上は高さ と 長さ表示です。
ケースによるかな
ついでに言っときますがASUSU とGIGABYTE 相性悪いよ
同メーカー選んだ方が正解ですが

QEXCEL VBA のユーザーフォームで絞り込み

ここで質問が出来るほどの実力はないのですが・・・。
EXCELのユーザーフォームにコンボボックスを2つ配置しておいて、ComboBox1では都道府県名を選択できるようにしておき、県名を選択したらComboBox2にその県の市町村名が絞り込まれて選択できるようにしたいと考えています。
エクセルにどのような並びでデータをセットしてどのようなコードを書けば実現できるのかをご教授して頂けないでしょうか?
まるまる「おんぶにだっこ」的な質問内容ですがよろしくお願いします。

Aベストアンサー

やり方はいくつもあるのですが、とりあえず簡単な方法。
都道府県名のリストと、市町村名のリストをワークシートに書いておく方法です。

まず最初に都道府県名のリストを作成します。
Sheet1(シートはどこでも構いません)の A1 に「東京都」A2 に「栃木県」A3 に「茨城県」と入力します。
(本番では A1 から下に向かって都道府県名を入力していってください。)

全部入力が終わったら A1~A3(47都道府県を入力したのなら A47 まで)を選択し、Excel ツールバーの左端の「名前ボックス」に「都道府県」と入力します。
場所わかるかなぁ・・・多分 A1~A47 を選択した状態だと A1 って表示されてると思います。(数式バーの左です)

次に各市町村のリストを作成します。
B1 に「江東区」B2 に「墨田区」B3 に「足立区」と、B列を下に向かって入力。
C1 に「宇都宮市」C2 に「日光市」C3 に「佐野市」と、C列を下に向かって入力。
D1 に「水戸市」D2 に「日立市」D3 に「鹿嶋市」と、D列を下に向かって入力。
B1~B列の最後に入力したセルまでを選択し、先ほどと同様、名前ボックスに「東京都」と入力。C列に入力した範囲は「栃木県」、D列に入力した範囲は「茨城県」と入力します。
ポイントは、A列に入力した都道府県名と全く同じ文字で名前をつける所です。
ここまでやったことを解説します。
都道府県名を入力し、その入力範囲に名前をつけました。
同じく、各都道府県ごとの市町村名にも都道府県の名前をつけました。

次にユーザーフォームでの作業です。
ユーザーフォームに ComboBox を 2つ準備します。名前はデフォルトのまま ComboBox1 と ComboBox2 とします。
ユーザーフォームに下記のコードを書きます。

Private Sub UserForm_Initialize()
Me.ComboBox1.RowSource = "都道府県"
Me.ComboBox2.RowSource = ""
End Sub

Private Sub ComboBox1_Change()
Me.ComboBox2.Value = ""
Me.ComboBox2.RowSource = Me.ComboBox1.Value
End Sub

これでユーザーが ComboBox1 で都道府県を選択すると、ComboBox2 には選択した都道府県の市町村リストが配置されます。

ここまでを解説します。
フォームの初期化イベントで ComboBox1 のリストに、シートで「都道府県」という名前がつけられた範囲の値をセットします。
Me.ComboBox1.RowSource = "都道府県"
「都道府県」という名前の範囲は A列に入力した各都道府県名がありますので、ComboBox1 には 47都道府県の名前が表示されます。

さらに ComboBox2 のリストを空っぽにします。
Me.ComboBox2.RowSource = ""
フォームの初期状態ではどの都道府県も選択されていないわけですから ComboBox2 は空っぽじゃなくてはいけません。

次に ComboBox1 でどこかの都道府県を選択したときの処理です。
まずは ComboBox2 で選択されている(かもしれない)どこかの市町村名をクリアします。
Me.ComboBox2.Value = ""

そして ComboBox1 で選択した都道府県名と同じ名前の市町村名リストを ComboBox2 のリストにセットします。
Me.ComboBox2.RowSource = Me.ComboBox1.Value

こんな感じです。

やり方はいくつもあるのですが、とりあえず簡単な方法。
都道府県名のリストと、市町村名のリストをワークシートに書いておく方法です。

まず最初に都道府県名のリストを作成します。
Sheet1(シートはどこでも構いません)の A1 に「東京都」A2 に「栃木県」A3 に「茨城県」と入力します。
(本番では A1 から下に向かって都道府県名を入力していってください。)

全部入力が終わったら A1~A3(47都道府県を入力したのなら A47 まで)を選択し、Excel ツールバーの左端の「名前ボックス」に「都道府県...続きを読む


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

人気Q&Aランキング

おすすめ情報