プロが教えるわが家の防犯対策術!

いつもお世話になっております。

エクセルVBAであれこれやっており,なんとか思うことができるようになりましたが,

またストップしてしまいました。

いくつかユーザーフォームを設定し,メインのユーザーフォームを,

Private Sub Workbook_Open()

Dim Excelver As String

Worksheets("マスター").Activate

Excelver = Application.Version
'MsgBox "Excelバージョン:" & Excelver

If Excelver = 15 Then 'エクセル2013

Const setRefFile As String = "C:\Program Files\Microsoft Office 15\Root\Office15\MSOUTL.OLB"
ActiveWorkbook.VBProject.References.AddFromFile setRefFile

End If

If Excelver = 16 Then 'エクセル2019

Const setRefFile1 As String = "C:\Program Files (x86)\Microsoft Office\root\Office16\MSOUTL.OLB"
ActiveWorkbook.VBProject.References.AddFromFile setRefFile1

End If

ActiveWindow.WindowState = xlMaximized

受付_後処理.Show

End Sub

のなかで開くようにしてます。メインのユーザーフォームのプロパティで

 ShowModal--False

にしてモードレスにすると,Bookを開くさいにユーザーフォームが表示されません。

 ShowModal--True

原因が分かりません。手動でユーザーフォーム開けば問題ないのですが,
 
原因がおわかりでしたら,ご教示ください。

A 回答 (4件)

#3 ダブりましたすみません


そうですね、やっぱり勘違いをしていたようです
流石にVBProjectを操作するコードを書かれているので
十分対策されていますね

>Bookのオープン時にメインのユーザーフォームが表示されないだけ
これは2つのバージョンとも同じなのでしょうか・・書いていないので同じなのでしょう

試しに
私のローカル環境で試してみました windows10 64bit Excel 2013 32bit
UserForm1を作り
Private Sub UserForm_Initialize()
End Sub
マスターシートを作りモジュールに
Private Sub Worksheet_Activate()
End Sub
空のイベントプロシージャ

ThisWorkbookモジュール
Private Sub Workbook_Open()
Dim Excelver As String
Worksheets("マスター").Activate
Excelver = Application.Version
'MsgBox "Excelバージョン:" & Excelver
Const setRefFile As String = "C:\Program Files\Microsoft Office 15\Root\Office15\MSOUTL.OLB"
Dim objRef As Object, flag As Boolean: flag = False
For Each objRef In ThisWorkbook.VBProject.References
If Not objRef.IsBroken Then
If objRef.Name = "Outlook" Then flag = True: Exit For
End If
Next
If flag = False Then ActiveWorkbook.VBProject.References.AddFromFile setRefFile
ActiveWindow.WindowState = xlMaximized
UserForm1.Show False
End Sub

保存して閉じ 手動で開きましたが、再現できず・・問題なくUserForm1がModelessで表示されました
再現できないので試せませんが

ActiveWindowを触る前にUserForm1.Show False を実行すると・・
UserForm1.Show False
Worksheets("マスター").Activate
ActiveWindow.WindowState = xlMaximized

UserForm1.Show False を 標準モジュールに書いてそのプロシージャを
MsgBoxを挟んで call するのとどうなるか・・

全然違うかもですがModelessで使えないコントロールとかが有った記憶があります・・
お役に立てそうもありません・・
    • good
    • 0
この回答へのお礼

何度も回答ありがとうございます。

>そうですね、やっぱり勘違いをしていたようです
>流石にVBProjectを操作するコードを書かれているので
>十分対策されていますね
は,とんでもありません,全部,ネットからの寄せ集めで,動くものを

こつここつと積み上げきた,まだまだ,初心者だと思ってます。

それに,再現まで行ってくださり,お手数をおかけします。

2013でも,2019でも同じでした。


今までは,BOOKを開く時に非モードレスの設定で開いてましたが,

メインのフォームから,サブのユーザーフォーム(他ブックを開いてシートを選択するフォーム)

を追加して,モードレスで開く必要がでたため変更したら,開かなくなりましたということです。


もちろん,”マスターのシート”に配置してある(受付_後処理.Show)を

記載したマクロを実行することで,メインのユーザーフォームを開くことは

できました。



サブのユーザーフォームもモードレスで開く必要があるため,

メインの呼び出しで,サブのユーザーフォームが閉じられるまで,

下記をメインの方に追加でいれてます。

下記の方法はCPUに負荷がかかるので推奨できないとありましたが,

他の方法ができないので,下記のようにしました。

 シート選択.Show

Do While シート選択.Visible

DoEvents

Loop

として,サブのユーザーフォーム(シート選択)が閉じるまで,

ループさせています。

この辺も関係あるのかなあと思ってますが,不明です。



何度もありがとうございます。

お礼日時:2022/09/09 20:57

#1です


上手くUP出来なかったみたいで重複したらごめんなさい
参照設定をわざわざ行っていると言う事はバージョン違いのExcelで使うと言う事ですね。
そうすると、すでに参照不可になっている項目が存在するかもしれません

#1のコード(flag 設定部分)は考慮していませんので
下記の様に変更してください

Dim objRef As Object, flag As Boolean: flag = False
For Each objRef In ThisWorkbook.VBProject.References
If Not objRef.IsBroken Then
If objRef.Name = "Outlook" Then flag = True: Exit For
End If
Next

あと、Case 15 通るとは思いますが、Case "15.0" するべきかも知れませんね 

何れに致しましても、ご質問のコードが最後まで正しく実行されているか
検証するのが良いと思います
End Subの上にMsgBoxを入れてみたり、stop や Workbook_Open ではありますがステップ実行して見るとか・・・

受付_後処理.Show Falseも確認できるのでは無いでしょうか・・
    • good
    • 0
この回答へのお礼

再度のご回答ありがとうございます。

はい,おっしゃる通り,2台のPCを使ってますが,

それぞれ入ってるエクセルのバージョンが違うので,

バージョンに応じて,参照設定をVBAで行ってます。

よく分からないのですが,

Bookのオープン時にメインのユーザーフォームが表示されないだけで,

参照設定が必要なoutlookの操作も問題なくできます。

参照設定がうまくいってないとは,思えないのですが。

お礼日時:2022/09/09 18:20

”1です


わざわざ書いているのは、バージョン違いの為のコードですね
とすると、参照不可になっている可能性がありますね

Nameプロパティでは問題が残るかも知れませんが
flag設定コードを以下に変更してください

Dim objRef As Object, flag As Boolean: flag = False
For Each objRef In ThisWorkbook.VBProject.References
If Not objRef.IsBroken Then
If objRef.Name = "Outlook" Then flag = True: Exit For
End If
Next

また、通るとは思いますが Case 15 は Case "15.0" なのかも知れません

何れに致しましても、正しく最後まで実行されているか
(受付_後処理.Show False が実行されているか)
End Sub の上に MsgBoxを作って確かめたり、
Workbook_Openではありますが、ステップ実行やStop などの設置で調べるのが良いと思います
    • good
    • 0

こんにちは


>Bookを開くさいにユーザーフォームが表示されません。
エラーは出ないのですか?
ユーザーフォーム表示部分の .Show False に問題があるようには思えませんが・・
メインフォームと言う事はサブはどのように表示されるのか
Worksheets("マスター").Activate
情報としては、Workbook_Openで実行されるすべての処理が必要ですね

FormのInitializeに問題があるのかも知れませんし・・
もし、InitializeでOutlookを触っていたら・・
参照先のOutlookにエラーがあるとか・・・参照が上手く出来ていないとか・・
無いと思いますがWorksheet_Activateイベントとか使っていたり・・
色々と想像しますが、

示されているコードで 強いて問題点を上げるとすると
表示には関係ないと思いますが、
すでに参照設定がされている場合、エラーが返る気がしますが、どうでしょう?(条件が不足している為)
思い出せませんが、すでに参照されている場合、自動的にスルーされる だったかなぁ・・

思い付く ここの部分のコード


Dim objRef As Object, flag As Boolean
For Each objRef In ThisWorkbook.VBProject.References
If objRef.Name = "Outlook" Then flag = True: Exit For
Next
If flag = False Then
Select Case Application.Version
Case 15 'エクセル2013
ActiveWorkbook.VBProject.References.AddFromFile setRefFile
Case 16 'エクセル2019
ActiveWorkbook.VBProject.References.AddFromFile setRefFile1
End Select
End If
ActiveWindow.WindowState = xlMaximized

    • good
    • 0
この回答へのお礼

早速のアドバイスありがとうございます。

開く時に,特にエラーは出ません。

ユーザーフォームのプロバティを

 ShowModal--True

に変更すると,問題なくユーザーフォームが表示されます。

それから,参照設定のことですが,

Bookを閉じるときに,

With ThisWorkbook.VBProject
For Each refObj In ThisWorkbook.VBProject.References
If refObj.Description = "Microsoft Outlook 15.0 Object Library" Then
.References.Remove refObj
MsgBox "Microsoft Outlook 15.0 Object Libraryの参照を外します。"
End If
Next refObj
End With

With ThisWorkbook.VBProject
For Each refObj1 In ThisWorkbook.VBProject.References
If refObj1.Description = "Microsoft Outlook 16.0 Object Library" Then
.References.Remove refObj1
MsgBox "Microsoft Outlook 16.0 Object Libraryの参照を外します。"
End If
Next refObj1
End With

のコードで参照を外してるので,参照設定では,エラーはでません。

サブのユーザーフォームは,三つほど設定しており,

メインからそれぞれの作業に応じて,

コマンドボタンから呼び出すかたちになってます。

お礼日時:2022/09/09 18:05

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

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


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