こんばんは。

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1343464

上記質問のNo.2の回答に

>ThisWorkbook.Close SaveChanges:=True '要保存のダイアログが出ません。
>Falseなら、ダイアログが出てきます。ただし、デフォルトは False です。
●しかし、この場合は、Application.Quit(Excelの終了)は、使えません。
●Close メソッドではなく、Save メソッドを使ってから、Application.Quit になります。

とありますが、●の行の意味がちょっと分かりません。
後学のため説明願えれば幸いです。
宜しくお願いします。

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

A 回答 (3件)

quit123さん、こんにちは。


私は、時々、基本的なところで大ポカをしたかもしれないと、今回は、ちょっと動揺しました。(^^;

お書きになったコード
>Sub test_BookClose()
>  Application.Quit
>  Range("B2") = 33333
>  ThisWorkbook.Close SaveChanges:=True
>End Sub

試してみました。なるほど、そういう問題があるのですね。

>Application.Quitはそれが書かれているプロセデュアーが終了するまでは実行されないという特性があります。
上記のようなコードは、私は書かないけれども、Quit では終わらないということですね。勉強になりました。なるほど、それで、Object変数の戻しや、 Application.EnableEvents の戻しが、利くわけですね。

ちょっと、突っ込んで書いてしまいます。(^^;
その現象として、やってみて感じたのは、それはExcelのアプリケーションのWorkbooksコレクション・オブジェクトの終了手続き(Application.Quit)と完全終了までのタイムラグではないか、ということです。

もし、プロシージャーが終わるまでなら、以下のように、プロシージャそのものを止めてしまったら、どうでしょうか?やはり、予定されていたように終わってしまいますよね。Application.Quit が実行されます。また、プロシージャー自体を止める Macro関数 Halt を使っても、終了してしまいます。

Sub test_BookClose()
  Application.Quit
  Range("B2").Value = 33331
  ThisWorkbook.Close SaveChanges:=True
  Stop
End Sub
    • good
    • 0
この回答へのお礼

おはようございます。

Wendy02さんのことですからたぶん何かツッコミが入るのではと期待して閉めないでおきました・・。(^^;;;

>その現象として、やってみて感じたのは、それはExcelのアプリケーションのWorkbooksコレクション・オブジェクトの終了手続き(Application.Quit)と完全終了までのタイムラグではないか、ということです。
>もし、プロシージャーが終わるまでなら、以下のように、プロシージャそのものを止めてしまったら、どうでしょうか?やはり、予定されていたように終わってしまいますよね。

これはタイムラグとかの問題ではなく、Application.Quitの仕様だと思います。
また、プロシージャーを止める、Stopステートメントを実行する、ということはその時点でそのプロシージャーは終了したと判断しているのではないでしょうか。

また違った意見もあろうかとは思いますが、それらはApplication.Quitの実際のロジックが分からなければ全て想像の域をでませんので今回はこれで閉めさせて頂きます。

最後に一言。Wendy02さんのVBAに関しての知識(他もあるかも知れませんが(^^;;;)には回答を見るたび驚かされます、と言うより感心されられます。
これからも素晴らしい回答期待しております。

お礼日時:2005/04/23 08:59

参考までに^^;


私はセーブコマンドを使ってます
Sub MENU_CLOSE()
ActiveWorkbook.Save
Application.Quit
End Sub
    • good
    • 0
この回答へのお礼

おはようございます。
回答ありがとうございます。
やはりプログラム終了の流れとしては、Application.Quitは最後にあった方が分かり易いですよね。
また何かあった時は宜しくお願いします。

お礼日時:2005/04/23 09:04

その文章を書いた本人です。



>しかし、この場合は、Application.Quit(Excelの終了)は、使えません。
実際、聞くよりも、やってみれば一目瞭然です。

Sub test_SheetDelete()
 Application.DisplayAlerts = False
'On Error Resume Next
'ActiveSheet.Delete
 Application.DisplayAlerts = True
 ThisWorkbook.Close SaveChanges:=True ←ここでマクロはお終いです。
 Application.Quit  ←これは使えません。
End Sub

Bookが出ていない、黒い画面が残ります。

正しく、こちらだと思っていますが、何か、問題が残るのでしょうか?

Sub test_Appquit()
 With ThisWorkbook
  If .Saved = False Then
   .Save '保存して
  End If
 End With
 Application.Quit 'Excelを終了
End Sub
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。

やはりそういうことでしたか。
Wendy02さんのことですからもしや別な理由が、
と思い質問してみました。

Application.Quitにはある特性があります。
先ず、以下のコードを試してみてください。

----------------------------------------------
Sub test_BookClose()

  Application.Quit

  Range("B2") = 33333

  ThisWorkbook.Close SaveChanges:=True

End Sub
----------------------------------------------

Sub test_AppQuit()

  Application.Quit

  Range("E2") = 666666

  With ThisWorkbook
    If .Saved = False Then
      .Save
    End If
  End With

End Sub
---------------------------------------------

どうですか? まともに動作しますよね。
このようにApplication.Quitはそれが書かれているプロセデュアーが終了するまでは実行されないという特性があります。
ですから、Closeとも使えるし、またプロセデュアーのどこにあってもOKなのです。
ま、気分的には最後に書きたい気もしますが・・・。

参考になれば幸いです。

Wendy02さんの懇切丁寧かつ的を射た回答は非常に参考になります。これからも目から鱗の回答を期待しています。
 

お礼日時:2005/04/22 00:15

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

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

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

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

Qdefine_singleton_methodについて

define_singleton_methodについて

1.9.1p378を使用しています。

メタプログラミングに興味があって、
Classに動的に生成したmethodを追加する方法を調べてみると
色々な教科書にdefine_methodを使う例が書いてあるのを見つけました。

しかし、実際にプログラムしてみると"undefined method"になってしまいます。

Class.methods.grep /define/
してみると、"define_singleton_method"というものがあり、
define_methodの代わりに使ってみたら一応期待通りに動作しました。

googleで調べてみてもdefine_singleton_methodについて解説が見つけられませんでした。

1.9系になって名前が変わったのでしょうか?
それとも似て非なるものなのでしょうか?

詳しい方、教えてください。<(_ _)>

Aベストアンサー

define_singleton_methodは1.9で追加されたもので、Objectクラスのメソッドです。

一方define_methodはModuleクラスのprivateメソッドなので、ModuleかClassの中から呼ばないといけません。
(ClassクラスはModuleクラスのサブクラス。Rubyのprivateはサブクラスからも見える)

define_methodであとからメソッドを追加しようとする場合、直接外からは呼べないので、間接的にdefine_methodを呼ぶメソッドを作成しておくか、一度Classを開くなどをやらないといけませんが、

define_singleton_methodを使えば、そんなことはせずに、簡単にできるということです。

Qエクセル2013VBAでThisWorkbook.Close実行後残ったブックが停止する

お世話になります。
エクセル2013のVBAで質問があります。

VBAを使って、あるブックをコピーして新しいブックを新規作成します。
それで、元のブックを保存して閉じるのですが、なぜか新しいブックの方に文字入力しようとすると
Microsoft excelは動作を停止しました、と表示され一旦とじられてしまいます。
再起動すると、正常動作しますが、どうしてこのようになると考えられますか?
実験的に、クローズさせるところのみを抜き出して他のブックで試しましたが、問題なく動作しました。

あと、Application.ScreenUpdatingとかは、複数開く場合、両方のブックに対して行う必要はないですか?
特に、どのブックと意識せずに単純に指定しておけばよいものなのでしょうか?

Sub sample()
Dim etc_path As String

Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual

etc_path = "クローズ実験2.xlsm"
 Workbooks(etc_path).Activate

If MsgBox("ファイルを保存して閉じておきますか?", vbYesNo, "前月ファイル保存クローズ!") = vbNo Then
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Exit Sub
Else
ThisWorkbook.Activate
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic

Workbooks(etc_path).Activate
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Workbooks(etc_path).Save

ThisWorkbook.Save
ThisWorkbook.Close
End If
End Sub

お世話になります。
エクセル2013のVBAで質問があります。

VBAを使って、あるブックをコピーして新しいブックを新規作成します。
それで、元のブックを保存して閉じるのですが、なぜか新しいブックの方に文字入力しようとすると
Microsoft excelは動作を停止しました、と表示され一旦とじられてしまいます。
再起動すると、正常動作しますが、どうしてこのようになると考えられますか?
実験的に、クローズさせるところのみを抜き出して他のブックで試しましたが、問題なく動作しました。

あと、Applic...続きを読む

Aベストアンサー

こんにちは。

>何かが他のブックにも影響しており一応操作ができるけど裏でユーザーフォームが解放されずに残っているのではないか?という所が引っかかります。

この話は、97の時代からなのです。私の中では確信を得ているのに、Microsoft とか、掲示板でとかでは、あまりこの話題は上がらないような気がします。
おっしゃっている話は、私もずっと長い間の懸念しています。

>Closeより前にUnload Meで終了するようにはなっており
UserForm から、Application全体を終了させようとしたら、突然、Excelが消えてしまうということがありました。また、掲示板でも、プロの開発者の人から、そういう現象を問題にしていることを教えてもらいました。

つい先月の質問者さんでも、かなり難しい本で勉強している方が、そのような部分が出てきましたので、アドバイスをしました。

>ユーザーフォームが解放されずに残っているのではないか
先程から、私の持っているツール総動員でプロセスを調べてみましたが、ずっとUserForm の出入りの違いは出てきません。Excel自体で、立ち上げとUnloadで、UserFormのメモリが増減することはありませんでした。ということは、UserForm というインスタンスが既にある以上は、立ち上げていてもそうでなくても、アプリケーション上?は、立ち上げているのと同じことにならないでしょうか。

ただ、プロセスモニター(Promon)で、UserForm を終了する時に、こんな項目が出てきています。調べてみました。

IRP_MJ_CLOSE

と、いうことは、これはキャッシュの終了の時に出てくるものだそうです。詳しいことは分かりませんが、この処理の手間が問題を起こすのかもしれません。

ちなみに、Mr.Excel や StackOverFlow サイトでも同じような、hang とか crash という言葉は出てきますが、肝心の、VBAコードがほとんど出ていないので、確証をつかめませんでした。

こんにちは。

>何かが他のブックにも影響しており一応操作ができるけど裏でユーザーフォームが解放されずに残っているのではないか?という所が引っかかります。

この話は、97の時代からなのです。私の中では確信を得ているのに、Microsoft とか、掲示板でとかでは、あまりこの話題は上がらないような気がします。
おっしゃっている話は、私もずっと長い間の懸念しています。

>Closeより前にUnload Meで終了するようにはなっており
UserForm から、Application全体を終了させようとしたら、突然、Excelが消えて...続きを読む

QPostMethodによるアップロード

PostMethodによるアップロードのプログラムを作成しようとしていますが、
HttpClient、PostMethodの使い方がよくわかりません。
いろいろなサイトを見て、

HttpClient client = new HttpClient();
PostMethod post = new PostMethod(url);
・・・
client.executeMethod(post);

とすればよさそうだというところまではわかったのですが、
そもそも、PostMethod(url)の"url"には何を指定すればよいのか、
また、executeMethod(post)を実行すると、何が起こってどのように
アップロードが行われるのかというところの理解ができていません。
基本的なこととは思いますが、どなたかお教えいただけないでしょうか。

Aベストアンサー

ファイルアップロード処理をするには、Webサーバ側に
ファイルアップロードを受け付けるサーバーアプリが必要です。

Javaでクライアント側のアップロードアプリを作る前に、
まずサーバー側のアップロード受け付けアプリを作る必要があります。

WebサーバにPHPをインストールしているなら、
http://www.php-labo.net/tutorial/php/upload.html
に書かれているようなPHPプログラムで、ブラウザからファイルを
アップロードするサーバー側アプリを簡単に作ることができます。

そこまでできたら、ブラウザの代わりにJavaでファイルを
アップロードするクライアントアプリを作ることも可能です。

PostMethod()のurlには、前述のサーバのアップロード受け付けアプリが
ある場所を指定します。
あとはブラウザのファイルアップロード処理がやっているのと同じことを
Javaのクライアントアプリで実装すればよいです。
具体的にはリクエストヘッダーの設定/送信、ファイルデータの読み込み、
マルチパート形式での送信、レスポンスデータの受け取り等が必要です。
このあたりはPostMethod()が自動的にやってくれるわけではありません、
自分で実装する必要があります。

具体的なJavaコーディングは
http://blog.oklab.org/?p=132
あたりが参考になると思います。

ファイルアップロード処理をするには、Webサーバ側に
ファイルアップロードを受け付けるサーバーアプリが必要です。

Javaでクライアント側のアップロードアプリを作る前に、
まずサーバー側のアップロード受け付けアプリを作る必要があります。

WebサーバにPHPをインストールしているなら、
http://www.php-labo.net/tutorial/php/upload.html
に書かれているようなPHPプログラムで、ブラウザからファイルを
アップロードするサーバー側アプリを簡単に作ることができます。

そこまでできたら、ブラウザの代わり...続きを読む

Qエクセル:マクロ「Application.CutCopyMode = False」って?

エクセルのマクロを記録していると

「Application.CutCopyMode = False」

というものがよく出てきますが、これは何でしょう?
どういう意味のものかわかりません。
削除しても差し支えないのもでしょうか?

Aベストアンサー

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
Range("A1").Select
Selection.Copy
Range("A2").Select
Application.CutCopyMode = False
ActiveSheet.Paste ← ココでエラー
------------
ご自分で、セルをコピーしてみると分かると思いますが、コピーした範囲が点線で点滅されます。
「Application.CutCopyMode = False」をすると、
その点滅がなくなります。

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
...続きを読む

Q)method for cash budgeting

I need to have a consistent method for cash budgeting this year.
今年度の現金予算を作成する一貫性のある方法が必要だ。
上記の文章(原文ママ)ですが、

1)method for cash budgeting
より

2)method of cash budgeting
の方が用例が多いように思います。
意味が違いますか?

また、
3)method of cash budget
ではダメなのでしょうか?

3点教えて頂けませんかm(_ _)m

Aベストアンサー

cash budgetingで現金予算管理

1)method for cash budgeting
現金予算管理のための、(一貫性のある)方法

2)method of cash budgeting
現金予算管理の方法

となるのではないでしょうか。

>3)method of cash budget
ではダメなのでしょうか?

ニュアンスの違いだけと思いますのでどちらでもいいかと思うのですが

[今年度の現金予算管理のためには、一貫性のある(現金管理のための)方法が必要だ]
という事だと思います。

QブックをCloseまたはQuitで閉じると他のユーザーフォームが消えてしまう。

ブックをCloseまたはQuitで閉じると他のユーザーフォームが消えてしまう。

お世話になります。
Excel2000、2013でツール開発をしているのですが、タイトルのようにユーザーフォームが消えてしまって困っています。
助言頂ければと思います。

Book1
 UserForm1…Book2を開くボタンを実装してあります。単純にWorkbooks.openです。

Book2
 UserForm2…Book2のOpenにてShowされるユーザーフォームです。

Book1のUserForm1からBook2のUserForm2をShowさせた後、
UserForm2の閉じるボタンにて「Application.quit」と「ThisWorkbook.Close」を実行させて、
Book2を閉じてまたUserForm1に戻る処理を行いたいのです。

ところが、quitとcloseを実行するとBook2は問題なく閉じるのですが、
UserForm1までもが消えてしまいます。

UserForm1を消さずに戻る方法は無いのでしょうか??

ブックをCloseまたはQuitで閉じると他のユーザーフォームが消えてしまう。

お世話になります。
Excel2000、2013でツール開発をしているのですが、タイトルのようにユーザーフォームが消えてしまって困っています。
助言頂ければと思います。

Book1
 UserForm1…Book2を開くボタンを実装してあります。単純にWorkbooks.openです。

Book2
 UserForm2…Book2のOpenにてShowされるユーザーフォームです。

Book1のUserForm1からBook2のUserForm2をShowさせた後、
UserForm2の閉じるボタンにて「Applic...続きを読む

Aベストアンサー

No2です。
こちらで確認した方法です。
Book1のUseform1のコード
--------------------------------
Private Sub CommandButton1_Click()
Workbooks.Open "d:\goo\excel\book107b.xlsm"
Application.Run "book107b.xlsm!Macro1"
Workbooks("book107b.xlsm").Close
End Sub

(book2相当)book107b.xlsmの標準モジュール
----------------------------------
Public Sub Macro1()
UserForm2.Show
End Sub

(book2相当)book107b.xlsmのUserForm2のコード
-------------------------------------
Private Sub CommandButton1_Click()
Unload Me
End Sub

Q$_SERVER['REQUEST_METHOD']と"POST"が等しいかどうか大文字小文字を区別

せずに判別する方法を教えてください

if($_SERVER['REQUEST_METHOD']==="post")
if($_SERVER['REQUEST_SESSIONMETHOD']=="post")
if(strcasecmp($_SERVER['REQUEST_METHOD'],"post")==0)
if(strcmp($_SERVER['REQUEST_METHOD'],"post")==0)

のいずれがよいでしょうか?

Aベストアンサー

>大文字小文字を区別

区別したいなら
$_SERVER['REQUEST_METHOD']==="post"
でいいんじゃない?

ただ等号での文字列比較に対しては否定的な現場も多いので
strcmp($_SERVER['REQUEST_METHOD'],"post")===0
の方がよいかも

ちなみに多くのサーバーでは「POST」を返すので小文字「post」とはマッチしません。

むしろ
strtolower($_SERVER['REQUEST_METHOD'])==="post"
など小文字同士の比較をしていることを明示した方がよいかと。

Q「Debug.Print i = i + 1」がFalseになる。

Sub test()
Dim i As Long
i = 0
Debug.Print i = i + 1
End Sub
を実行すると
False
がイミディエイトウインドウに表示されます。
理由が知りたいです。
よろしくお願いします。

Aベストアンサー

Printステートメントの outputlist並びの=が、代入式ではなく比較式と評価、実行されるためでしょうね。
演算子は式のリストに含められ、算術演算子、比較演算子、論理演算子等色々ありますが、代入記号はリスト項目にはありませんので、エラーとならないのは演算子とみなしているからですね。

Print i = i + 1 の結果は、0と1の比較なのでFalse
Print i = i とすると、0と0の比較なのでTrue
Print i, i + 1の場合は、変数と数式なので 0と1
という結果になるはずです。
 

Qmethod#invoke のラッパ

下記のようなリフレクション(動的なメソッド呼び出し)の汎用的なラッパ関数を作成しています。

class Wrapper
{
public static void main(String[] args)
{
Hoge hoge = new Hoge();
// (1)
Wrapper.call(hoge, "testMethod", new Human());
// (2) これはNoSuchMethodException例外発生
Wrapper.call(hoge, "testMethod", new Japanese());
// (3) これもNoSuchMethodException
Wrapper.call(hoge, "testMethod", (Human) new Japanese());

}

public static Object call(Object obj, String method_name, Object ...args)
{
try {
// 引数のクラス配列を取得
Class[] class_ary = new Class[args.length];
for (int i=0; i<args.length; i++)
class_ary[i] = args[i].getClass();


Class c = obj.getClass();
// メソッドインスタンスを取得
Method method = c.getMethod(method_name, class_ary);
// 実行
return method.invoke(obj, args);
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

class Hoge {
public void testMethod(Human h) {
System.out.println(h.getClass());
}
}
class Human {

}
class Japanese extends Human {

}

一見うまくうごくようにみえたのですが
(2)のようにすると例外が発生することが最近わかりました。
親クラスにキャストした(3)でも同様です。

理由は

// 引数のクラス配列を取得
Class[] class_ary = new Class[args.length];
 for (int i=0; i<args.length; i++)
  class_ary[i] = args[i].getClass();

のgetClass()の部分がキャストしようがしまいが Japaneseのクラスインスタンスを返すからだというのはわかっているのですが、他の方法が思いつきません。

多態性を備えたラッパ関数を作成することは無理でしょうか?
何か解決策があればアドバイスをお願いします。

下記のようなリフレクション(動的なメソッド呼び出し)の汎用的なラッパ関数を作成しています。

class Wrapper
{
public static void main(String[] args)
{
Hoge hoge = new Hoge();
// (1)
Wrapper.call(hoge, "testMethod", new Human());
// (2) これはNoSuchMethodException例外発生
Wrapper.call(hoge, "testMethod", new Japanese());
// (3) これもNoSuchMethodException
Wrapper.call(hoge, "testMethod", (Human) new Japanese());

}

public static Object call(Object obj, String...続きを読む

Aベストアンサー

こんな感じでしょうか。あんまり詳しくチェックしてませんけれど。

public static Object call(Object obj, String method_name, Object... args) {
try {
// メソッドインスタンスを取得
Method method = findCompatibleMethod(obj.getClass(), args);
// 実行
return method.invoke(obj, args);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

// argsを引数に呼び出せるメソッドをclazzから探します
static Method findCompatibleMethod(Class clazz, Object[] args) throws NoSuchMethodException {
for (Method method : clazz.getMethods()) {
if (isCompatible(method, args)) {
return method;
}
}
throw new NoSuchMethodException();
}

static boolean isCompatible(Method method, Object[] args) {
Class[] clazzes = method.getParameterTypes();
for (int i = 0; i < args.length; i++) {
if (!clazzes[i].isInstance(args[i])) {
return false;
}
}
return true;
}

こんな感じでしょうか。あんまり詳しくチェックしてませんけれど。

public static Object call(Object obj, String method_name, Object... args) {
try {
// メソッドインスタンスを取得
Method method = findCompatibleMethod(obj.getClass(), args);
// 実行
return method.invoke(obj, args);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

// argsを引数に呼び出せるメソッドをclazzから探します
static Method findCompatibleMethod(Class clazz, Object[] args) throws...続きを読む

QFind系メソッド、Findメソッドに相当するワークシート関数または、VBA関数は?

Excelのワークシート関数または、VBA関数で、DAOのFind系メソッドやADOのFindメソッドに相当する機能はありますか?
(Forループで回せば似たようなことはできるのですが、非効率なので・・・)

# 表計算とRDBは別物ってツッコミはなしということで。(^^;

Aベストアンサー

こんにちは。maruru01です。

Rangeオブジェクトに対するFindメソッドがあります。
また、同条件の繰り返し用に、FindNext、FindPreviousメソッドもあります。
詳細はヘルプで。


人気Q&Aランキング

おすすめ情報