Excel VBA質問箱 IV

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

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


3593 / 13644 ツリー ←次へ | 前へ→

【61222】VBAでVBSのMSGBOX表示みたいな ON 09/4/16(木) 18:43 質問[未読]
【61223】Re:VBAでVBSのMSGBOX表示みたいな n 09/4/16(木) 20:05 発言[未読]
【61224】Re:VBAでVBSのMSGBOX表示みたいな ON 09/4/17(金) 11:01 お礼[未読]
【61233】Re:VBAでVBSのMSGBOX表示みたいな neptune 09/4/17(金) 23:08 発言[未読]
【61234】Re:VBAでVBSのMSGBOX表示みたいな Abyss 09/4/18(土) 1:14 発言[未読]
【61235】Re:VBAでVBSのMSGBOX表示みたいな n 09/4/18(土) 2:32 発言[未読]
【61260】Re:VBAでVBSのMSGBOX表示みたいな ON 09/4/20(月) 17:33 質問[未読]
【61261】Re:VBAでVBSのMSGBOX表示みたいな n 09/4/20(月) 18:42 発言[未読]
【61262】Re:VBAでVBSのMSGBOX表示みたいな ON 09/4/20(月) 19:03 発言[未読]

【61222】VBAでVBSのMSGBOX表示みたいな
質問  ON  - 09/4/16(木) 18:43 -

引用なし
パスワード
   よろしくお願い致します


VBAのコードだけでVBSのメッセージを表示したいと思っていますが
他の方法でもかまいません


下記では、一定時間操作がないと自ブックを閉じる処理をしています
【61104】一定時間選択変更がなければ上書保存でループにハマル
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=61104;id=excel

このとき、ブックでメッセージを出すと、それが押されるまでブックが閉じれません
このため、
ブックを閉じるときに、vbsのメッセージを出したいと思っています

単純にVBSのファイルを呼び出すことは
Dim vbs_msg As Long
vbs_msg = Shell("wscript.exe C:\test.vbs", vbNormalFocus)
では、出来ているのですが

別途にtest.vbsを、VBA内で生成というか
test.vbsの外部ファイル不要で出来ないものかと思っています

VBSでなくてもよいのですが
このようなことは可能でしょうか


アドバイスよろしくお願い致します

【61223】Re:VBAでVBSのMSGBOX表示みたいな
発言  n  - 09/4/16(木) 20:05 -

引用なし
パスワード
   本当は
Sub test1()
  CreateObject("WScript.Shell").PopUp "3秒後に閉じる予定だけど...", 3
End Sub
これでちゃんと閉じれば良いのでしょうけど、VBA内で実行しても不安定で閉じない場合があります。

なのでvbsファイルを作って実行とか。
Sub test2()
  Const f = "d:\test.vbs"
  Const s = "CreateObject(""WScript.Shell"").PopUp ""3秒後に閉じます。"", 3"
  Dim n As Long
  
  n = FreeFile
  Open f For Output As #n
  Print #n, s
  Close #n
  Shell "wscript.exe " & f, vbNormalFocus
End Sub

でも
>ブックを閉じるときに、vbsのメッセージを出したいと思っています
これはUserFormの替わりにしたいという事なのでしょうか?
それとも現状のコードに加える?
加えるとしたら、そもそもUserFormがPopUpの替わりなので必要性に疑問が。

【61224】Re:VBAでVBSのMSGBOX表示みたいな
お礼  ON  - 09/4/17(金) 11:01 -

引用なし
パスワード
   n さん こんにちは
いつもお世話になっています m(_ _)m

>>ブックを閉じるときに、vbsのメッセージを出したいと思っています
>これはUserFormの替わりにしたいという事なのでしょうか?
>それとも現状のコードに加える?
>加えるとしたら、そもそもUserFormがPopUpの替わりなので必要性に疑問が。

一連のQ アドバイスありがとうございました

全体の動作のイメージは

・入力途中等、勝手に閉じられてしまうと頭にくるので
 警告フォームを出す
 この時、いつ閉じられるか不明だと心臓によくないので
 カウントダウンを表示する
 離席等で上記のまま放置されると自動上書き終了する

・離席後、戻ってみるとエクセルが閉じていたり
 別ブックがになっていると??みたいになることがあるので
 当該ブックは閉じました メッセージを表示しておく

みたいになりました


コードのご提示ありがとうございました
勉強になります

下記のようにしてみましたが
test1()は、msgboxのボタンが押されるまで、ブックが閉じませんでした
やはり、test2()のように外部VBS等をキックしないといけないような
気がしてきました

時間をおいたとき
いつも、このVBSて何だっけ? みたいになることが多いので
不要で済ますことが出来ればいいな の質問でした

ちなみに
自PCにWindowsのMessengerが使えそうな気がしましたが
サービスが無効になっていましたのでそこから先は何も試してみません
でした


なにかあればよろしくお願い致します

--------------------------------------------------------------
'ThisWorkbook

Private Sub Workbook_BeforeClose(Cancel As Boolean)

  Application.Quit

End Sub

--------------------------------------------------------------
'Module1

Sub test1()

  'CreateObject("WScript.Shell").PopUp "3秒後に閉じる予定だけど...", 3
  CreateObject("WScript.Shell").PopUp "無操作のためブックは閉じました"
  
  ThisWorkbook.Save
  ThisWorkbook.Close

End Sub


Sub test2()

  Const f = "C:\CP\2009\200904\test2\msg.vbs"
  'Const s = "CreateObject(""WScript.Shell"").PopUp ""3秒後に閉じます。"", 3"
  Const s = "CreateObject(""WScript.Shell"").PopUp ""無操作のためブックは閉じました"""
  
  Dim n As Long
 
  n = FreeFile
  Open f For Output As #n
  Print #n, s
  Close #n
  
  Shell "wscript.exe " & f, vbNormalFocus
  
  ThisWorkbook.Save
  ThisWorkbook.Close
  
End Sub

--------------------------------------------------------------

【61233】Re:VBAでVBSのMSGBOX表示みたいな
発言  neptune  - 09/4/17(金) 23:08 -

引用なし
パスワード
   ▼ON さん:
こんにちは

>下記のようにしてみましたが
>test1()は、msgboxのボタンが押されるまで、ブックが閉じませんでした
>やはり、test2()のように外部VBS等をキックしないといけないような
>気がしてきました
test2ではshell関数を使ってますよね。shell関数ってのは非同期で
動作するんです。なので、shell関数実行後、関数で起動したプログラムが
どういう状態であろうが、次のステップに進みます。
なので、test2では終了します。

それに対して、test1では同期処理されます。したがって、msgboxが表示
されている間は、次のステップに進みません。なので終了しない訳です。


>時間をおいたとき
>いつも、このVBSて何だっけ? みたいになることが多いので
>不要で済ますことが出来ればいいな の質問でした
それならやっぱり、VBAではなく本当の開発言語でそれようの実行ファイルを
作っておくとか、VBAでもそれ専用のClassにしておいたりすると、後が楽かと
思います。
まぁそういう価値があるとしての話ですけど。

ON さんのスキルなら、本物の開発言語に手を出してもそんなには苦労しない
と思いますよ。(それなりに基本の習得には時間かかりますけどね)

>自PCにWindowsのMessengerが使えそうな気がしましたが
Messengerは使ったことないので何にもわかりません。^ ^;;

【61234】Re:VBAでVBSのMSGBOX表示みたいな
発言  Abyss  - 09/4/18(土) 1:14 -

引用なし
パスワード
   MessageBoxTimeoutっていうHiddenAPI(非公開API)
を使って見るとか。

(Sample)

Private Declare Function MessageBoxTimeoutA Lib "User32" _
  (ByVal Hwnd As Long, _
   ByVal lpText As String, _
   ByVal lpCaption As String, _
   ByVal uType As VbMsgBoxStyle, _
   ByVal wLanguageID As Long, _
   ByVal dwMilliseconds As Long) As Long
    
Private Const MB_TIMEOUT = &H7D00

Sub TimerMsgbox()

  Dim Sec As Long
  Dim Result As Long
  Dim sMsg As String
  
  Sec = 4 * 1000 '4秒
  sMsg = "4秒後に消えます。"
  
  Result = MessageBoxTimeoutA(Application.Hwnd, sMsg, _
        Application.Name, vbOKCancel + vbMsgBoxSetForeground, 0&, Sec)
        
  Select Case Result
    Case vbOK
      sMsg = "OKボタンが押された。"
    Case vbCancel
      sMsg = "キャンセルボタンが押された。"
    Case MB_TIMEOUT
      sMsg = "4秒経ちました。"
  End Select
  
  MsgBox sMsg
  
End Sub

【61235】Re:VBAでVBSのMSGBOX表示みたいな
発言  n  - 09/4/18(土) 2:32 -

引用なし
パスワード
   >・離席後、戻ってみるとエクセルが閉じていたり
> 別ブックがになっていると??みたいになることがあるので
> 当該ブックは閉じました メッセージを表示しておく
視点を変えてこんなのもアリかもしれません。
Sub closeTest()
  With ThisWorkbook
    If Not .ReadOnly Then
      Dim r As Range
      .Activate
      .Save
      .ChangeFileAccess xlReadOnly
      With .Windows(1)
        .Zoom = 100
        Set r = .VisibleRange
      End With
    End If
    With .ActiveSheet.TextBoxes.Add(r.Left + r.Width / 4, _
                    r.Top + r.Height / 4, _
                    r.Width / 2, _
                    r.Height / 2)
      .Interior.Color = vbYellow
      .Text = "保存終了し読取専用に変更しました。"
      .HorizontalAlignment = xlCenter
      .VerticalAlignment = xlCenter
      .OnAction = "DelShape"
    End With
    .Saved = True
  End With
End Sub

Sub DelShape()
  ActiveSheet.TextBoxes(Application.Caller).Delete
  ThisWorkbook.Saved = True
End Sub

#ただ、元スレでも書いたように、あらゆるケースでも上書き保存というのは怖くないですか?
#そのbookの用途にもよるのでしょうけど。
#保護やバックアップなどの対策をしっかりとっておく事も必要でしょうね。

【61260】Re:VBAでVBSのMSGBOX表示みたいな
質問  ON  - 09/4/20(月) 17:33 -

引用なし
パスワード
   皆様 いつもお世話になります
ありがとうございます


To neptune さん

>test2ではshell関数を使ってますよね。shell関数ってのは非同期で
>動作するんです。なので、shell関数実行後、関数で起動したプログラムが
>どういう状態であろうが、次のステップに進みます。

>それに対して、test1では同期処理されます。したがって、msgboxが表示
>されている間は、次のステップに進みません。なので終了しない訳です。

解説ありがとうございます
同期、非同期、時折目にすることはあり、shellは使用することはあるのですが、
こうして、体感して、解説いただいて、初めて実感することが出来ました
経験しないと理解できないタイプみたいです・・・  (~_~;)


>ON さんのスキルなら、本物の開発言語に手を出してもそんなには苦労しない
>と思いますよ。(それなりに基本の習得には時間かかりますけどね)

実は、VB6、VS2008はもっているのですが・・・持っているだけで・・・(^_^;;;
なかなか、使用してみたい場面に遭遇しない・・みたいなのとスキルがない・・・
VB6は、勉強すれば使用できるような気もするのですが、.NETはちんぷんかんぷんで・・
です

>それならやっぱり、VBAではなく本当の開発言語でそれようの実行ファイルを
>作っておくとか、VBAでもそれ専用のClassにしておいたりすると、後が楽かと
>思います。
また、クラスもなかなか手が出せないです・・・レベルが低いので・・・
上記、簡単に処理手順コメント頂ければうれしいです
時間のとれる時にチャレンジしてみたいと思います
お手数と思いますがコメントあればよろしくお願いいたします
(exeについては、非同期shellで呼び出せばいいような気がしています)


To Abyss さん

ありがとうございます
APIのMSGBOXなんてあるのですか
ちっとも見かけたことがないような気がします

Private Sub Workbook_BeforeClose(Cancel As Boolean)

  Call TimerMsgbox
  Application.Quit

End Sub

とか試してみましたが、同期処理となってしまいます

これって、非同期で実行する方法ありますか
簡単にコメント頂けるとうれしいです
よろしくお願いいたします


To n さん

>視点を変えてこんなのもアリかもしれません。
ありがとうございます

ムムーこういうのもありですね
MSGBOXよりも親切でわかりやすいです
ありがとうございました・・・・

で、ちょっと編集(マルチライン)しようと思ったら、また、ハマってしまいました (T_T)

以前も遭遇したことがあったようなで調べてみましたが

手動で作成した場合は
ツールバー/右クリック/visual basic/コントロールツールボックス/テキストボックス
では、プロパティから MultiLine の設定が出来ますが

ツールバー/右クリック/フォーム/エディットボックス
はシートに貼り付け出来ません、またラベルは貼り付け出来ますがプロパティの
ダイアログはありません

ご提示頂いたコードで作成されたテキストボックスはフォームのコントロールなのでしょうか?
この判定はどうすれば出来ますか

また、コードで作成したコントロールに
?ActiveSheet.TextBoxes(1).name
Text 1
?ActiveSheet.Shapes(1).name
Text 1
?ActiveSheet.OLEObjects(1).name
実行時エラー '1004':Worksheet クラスの OLEObjects プロパティを取得できません。
?ActiveSheet.DrawingObjects(1).name
Text 1
とか試してみました

MultiLineについては
ActiveSheet.DrawingObjects(1).MultiLine=true
実行時エラー '438':オブジェクトは、このプロパティまたはメソッドをサポートしていません。
となってしまいます

このへん、アドバイス頂けるとうれしいです
よろしくお願いいたします


>#ただ、元スレでも書いたように、あらゆるケースでも上書き保存というのは怖くないですか?
>#そのbookの用途にもよるのでしょうけど。
>#保護やバックアップなどの対策をしっかりとっておく事も必要でしょうね。

こちらも具体的なアドバイスいただいて助かります
どのような条件で上書きされるかも不明な状況となっていますので確かに怖いです
上書き保存時には、BKフォルダに、日時付加名でBKをとって置く事にしたいと思います

Qばかりで申し訳ありませんがよろしくお願いいたします

【61261】Re:VBAでVBSのMSGBOX表示みたいな
発言  n  - 09/4/20(月) 18:42 -

引用なし
パスワード
   ぁあ、すみません。
普通のオートシェイプのテキストボックスです。
古い書き方で混乱させてしまいました。すみません。

Sub test()
  Dim s As Shape
  Dim t As TextBox

  Set s = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 10, 20, 30, 40)
  s.TextFrame.Characters.Text = "a" & vbLf & "b" & vbLf & "c"
  Set t = ActiveSheet.TextBoxes.Add(100, 20, 30, 40)
  t.Text = "a" & vbLf & "b" & vbLf & "c"
  Set s = Nothing
  Set t = Nothing
End Sub

DrawingObjects や TextBoxes , Pictures...などは[隠しオブジェクト]で、
バージョン95以前との互換性を保持するために残っているそうです。
Excel2000までのヘルプファイル VBAXL9.CHM には[隠しオブジェクト]についての記述がありますが、
2002以降の VBAXL10.CHM には記述がないようです。

たまに便利な時があるので私は好きで結構使ってしまってます。

例えば TextBoxes 一括削除の場合
ActiveSheet.TextBoxes.Delete
これはTextBoxがなくてもエラーにはなりません。
また、TextBoxの検索などで、HitしたTextBoxに画面遷移したい時など
ActiveSheet.Shapes(1).Select
では選択されるだけで画面遷移しませんが、
ActiveSheet.TextBoxes(1).Select

ActiveSheet.Shapes(1).DrawingObject.Select
などは画面遷移を伴います。
Shapeオブジェクトを扱う時、色々と振る舞いが違う場合があるので、
知っておくとコーディングの幅が広がるかもしれません。

【61262】Re:VBAでVBSのMSGBOX表示みたいな
発言  ON  - 09/4/20(月) 19:03 -

引用なし
パスワード
   ▼n さん ありがとうございます

t.Text = "a" & vbLf & "b" & vbLf & "c"
で改行出来ました

vbLfでなくChr(13)で試していたので、土壷にはまってしまったようです
上記でデバッグプリントしたらうまく改行できていたので・・・

シェイプはあまり使用したことが無いので??でした

解説、サンプルありがとうございました
助かりました

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