VBAで二重起動を防止したいのですが、
いろいろ調べましたが、わかりませんでした。
なにかいい方法はないでしょうか?
EXCELで見積書を作成して、そのファイルをVBAで保存するとき、ついでに、Outlook予定表に見積り期限日予定を入れるものです。
ファイル保存コード省略 Flnm=パス
'ここからアウトルック操作
Dim oApp As Object
Dim myNameSpace As Object
Dim myFolder As Object
Dim objITEM As Object
'outlook 起動
Set oApp = CreateObject("Outlook.Application") '既に起動してても新規起動
Set myNameSpace = oApp.GetNamespace("MAPI")
Set myFolder = myNameSpace.GetDefaultFolder(9) '起動時フォルダーを指定
myFolder.Display
'アイテムの作成
Set objITEM = oApp.CreateItem(1) '予定表作成画面を指定
objITEM.Display '編集画面を表示
'予定表内容
objITEM.Subject = "見積り発行後のフォロー" '件名
objITEM.body = "見積り発行から3ヶ月経ちました" '本文
objITEM.Attachments.Add Flnm 'ファイルの添付
objITEM.Start = DateAdd("m", 3, Date) & " 8:30" '予定日と開始時間
objITEM.Save '保存
objITEM.Close 2 '閉じる
EXCEL2007とOutlook2007を使用しています。
1.多重起動しないことと
2.起動中で最小化されたOutlookがあるならアクティブ化して予定を入れる、または
3.起動していなかったら起動させて、予定を入れる
と云うことがやりたいのですが・・・
No.4ベストアンサー
- 回答日時:
#3さんのご指摘の件ですが、おそらく、Outlook の「マルチユース(Multi-Use)」のことを指しているかとは思います。
それ自体では、確かに、Outlookは、「マルチユース」ですから、二重起動はしないです。 CreateObject("Outlook.Application") で、オートメーション・オブジェクトを作るなら、二重起動はしませんが、その後、MAPIで名前空間を作り、「予定表」を表示しています。だから、そのマクロを繰り返せば、「予定表」が二重に起動します。だから、#2のコードは、既に起動している場合は、単に前面に出すだけのものです。
それ以上に、今のところ、オブジェクトを再取得する方法については、詳しく検証していませんが、
Else
'...
Set objWShell = Nothing '←ここで終わった後に、
Set objITEM = oApp.CreateItem(1) '予定表作成画面を指定
objITEM.Display 'とすればよいはずです。
End If
なお、コマンドボタンなどに、マクロを登録してください。モジュールから直接行っても、Outlook の予定表は前面には出せません。
この回答への補足
なんどもすみません。
やはり予定表を自動入力するというところがうまくいきません。
ただし、Outlookが起動していなければ、成功します。
既に起動中のものに予定を入れることが出来ません。
Outlookからデータを取得する例はたくさん検索されますが
その逆はとても少なく難儀します。
もしよろしければもう少しお付き合い下さい。
ここの文を
'予定表内容
objITEM.Subject = "見積り発行後のフォロー" '件名
objITEM.body = "見積り発行から3ヶ月経ちました" '本文
objITEM.Attachments.Add Flnm 'ファイルの添付
objITEM.Start = DateAdd("m", 3, Date) & " 8:30" '予定日と開始時間
objITEM.Save '保存
objITEM.Close 2 '閉じる
このようにすることで、
Else
Set objWShell = CreateObject("WScript.Shell")
objWShell.AppActivate oApp.ActiveWindow.Caption 'アクティブ化
hwnd = FindWindow(FCLASSNAME, vbNullString)
SetForegroundWindow hwnd '前面に持ってきて
objWShell.SendKeys "% X" '最大化
Set objWShell = Nothing
End If
'予定表内容
objITEM.Subject = "見積り発行後のフォロー" '件名
objITEM.body = "見積り発行から3ヶ月経ちました" '本文
objITEM.Attachments.Add Flnm 'ファイルの添付
objITEM.Start = DateAdd("m", 3, Date) & " 8:30" '予定日と開始時間
objITEM.Save '保存
objITEM.Close 2 '閉じる
すべて解決しました。
順番が違っていただけでした。
大変お騒がせしましたが、無事目的達成できました。
ありがとうございました。
No.3
- 回答日時:
Outlook は基本的に多重起動はしません。
Set oApp = CreateObject("Outlook.Application") '既に起動してても新規起動
とありますが、本来であれば上記の記述はすでに起動している場合はその Outlook を使用するという動作になります。
そうならないのだとすると、何らかの理由で Outlook が正常に終了できておらず、起動中の Outlook が使用できないので、新たに Outlook が起動されてしまうのだと考えられます。
たいていはアドインが問題ですので、アドインをアンインストールして試してみてください。
No.2
- 回答日時:
>1.多重起動しないことと
>2.起動中で最小化されたOutlookがあるならアクティブ化して{?予定を入れる、または}
>3.起動していなかったら起動させて、予定を入れる
一部を除いて、3つの要件は満たしているはずです。予定を入れるというのは、すでに行っているのではないでしょうか。だから、最小化されたOutlook は、既に処理されていると解釈しています。
'//
Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Sub OutLookCheckers1()
Dim oApp As Object 'Outlook.Application
Dim myNameSpace As Object 'Outlook.Namespace
Dim myFolder As Object 'MAPIFolder
Dim objITEM As Object
Dim objWShell As Object
Dim Flnm As Variant
Dim flg As Boolean
Dim hwnd As Long
Dim strClassName As String * 100
Dim tmpClassName As String
Const FCLASSNAME As String = "rctrl_renwnd32" 'クラス名
'Outlook 起動
On Error Resume Next
Set oApp = GetObject(, "Outlook.Application") '既に起動している場合に取得
If Err.Number <> 0 Then
Set oApp = CreateObject("Outlook.Application")
flg = True
End If
On Error GoTo 0
If flg Then
Set myNameSpace = oApp.GetNamespace("MAPI")
Set myFolder = myNameSpace.GetDefaultFolder(9) '起動時フォルダーを指定
myFolder.Display
Set objITEM = oApp.CreateItem(1) '予定表作成画面を指定
objITEM.Display '編集画面を表示
'アイテムの作成 (ここは試していない)
' '予定表内容
' objITEM.Subject = "見積り発行後のフォロー" '件名
' objITEM.body = "見積り発行から3ヶ月経ちました" '本文
' objITEM.Attachments.Add Flnm 'ファイルの添付
' objITEM.Start = DateAdd("m", 3, Date) & " 8:30" '予定日と開始時間
' objITEM.Save '保存
' objITEM.Close 2 '閉じる
Else
Set objWShell = CreateObject("WScript.Shell")
objWShell.AppActivate oApp.ActiveWindow.Caption 'アクティブ化
hwnd = FindWindow(FCLASSNAME, vbNullString)
SetForegroundWindow hwnd '前面に持ってきて
objWShell.SendKeys "% X" '最大化
Set objWShell = Nothing
End If
Set oApp = Nothing
End Sub
この回答への補足
ありがとうございます。
Outlookが起動していない際には、予定表、下記部分は成功しました。
' '予定表内容
' objITEM.Subject = "見積り発行後のフォロー" '件名
' objITEM.body = "見積り発行から3ヶ月経ちました" '本文
' objITEM.Attachments.Add Flnm 'ファイルの添付
' objITEM.Start = DateAdd("m", 3, Date) & " 8:30" '予定日と開始時間
' objITEM.Save '保存
' objITEM.Close 2 '閉じる
ただ、既にOutlookが起動していた場合は、予定が入らないまたは件名が「X」となってしまっています。
予定を差し込むのがうまくいかないみたいです・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- その他(Microsoft Office) VBA メール送信済で実行されるはずが、実行されない時があります。 2 2023/02/02 14:05
- Visual Basic(VBA) エクセル VBA メール本文に指定セルに記載されているURLをリンクとして記載する方法 8 2022/08/08 07:50
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Excel(エクセル) Excel-VBAの「しばらくお待ちください」のダイアログが自動的に閉じない 2 2023/05/24 15:31
- Visual Basic(VBA) VBAにてメール作成した際、一部指定箇所のみ赤文字にしたいです。 下記の内容ですと作成されたメール本 1 2022/04/27 13:31
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
EXCELのマクロの重複起動の禁止
Excel(エクセル)
-
アウトルックが起動しているかどうかを取得するには?
Visual Basic(VBA)
-
既にファイルが開いているのなら開かない(二重起動防
Access(アクセス)
-
-
4
VBAでOutlookを終了させたい ExcelVBAで既に起動されているOutlookを終了させる
Visual Basic(VBA)
-
5
エクセルの二重起動をやめたい
Visual Basic(VBA)
-
6
Accessで二重起動できないようにしたい
Access(アクセス)
-
7
mdbファイルの2重起動は可能でしょうか?
Word(ワード)
-
8
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
9
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
10
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
11
ファイルの2重に開いた場合の処理(エクセルVBA)
Access(アクセス)
-
12
バックグラウンドのプロセスのエクセルを閉じる方法
Visual Basic(VBA)
-
13
OUTLOOKが二重起動される
Access(アクセス)
-
14
起動中のアプリ、ソフトの取得
Visual Basic(VBA)
-
15
Access VBAで行ラベルが定義されていないというエラーが出ます
Access(アクセス)
-
16
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
17
フォームの二重起動の阻止
Visual Basic(VBA)
-
18
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
19
アクセスで#エラーを表示させない方法は?
Access(アクセス)
-
20
<EXCEL/VBA> OUTLOOKのウインドを閉じる方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Windows10】パソコンがEZ MOD...
-
DELLのPCにPre-Boot Syst...
-
VirtualBox でWindows XP イン...
-
メモ帳(notepad.exe)の起動オプ...
-
レジストリの変更が反映されない
-
Windows Media Player 11を多重...
-
postgresqlが起動できなくなっ...
-
exeファイルが起動しない
-
アプリケーション起動時には音...
-
SBI証券HYPER SBI 2のエラー
-
リモートデスクトップ接続が起...
-
この項目のプロパティは利用で...
-
samファイルににアクセスする
-
DVDFabアップデートを表示させ...
-
OS9.2で起動後?マークの表示。...
-
富士通アップデートナビを起動...
-
Dynabook のSSD換装に失敗します
-
PCの知識なし太郎です。 Sataポ...
-
三相200V7.5KWモータ...
-
強制終了のやりすぎ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DELLのPCにPre-Boot Syst...
-
レジストリの変更が反映されない
-
Windows Media Player 11を多重...
-
VirtualBox でWindows XP イン...
-
【Windows10】パソコンがEZ MOD...
-
OSを起動するたびにクイック起...
-
メモ帳(notepad.exe)の起動オプ...
-
オンラインアプリとオフライン...
-
相手に渡したプログラムソフト...
-
exeファイルが起動しない
-
PCがwindows Updateで起動しな...
-
マウスカーソルの横にある砂時...
-
アプリケーション起動時には音...
-
三相200V7.5KWモータ...
-
DVDFabアップデートを表示させ...
-
access2019の起動が遅い
-
Dynabook のSSD換装に失敗します
-
パソコンの起動が遅い
-
hdd交換
-
Windows11 で電卓の起動が遅い
おすすめ情報