tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルVBからエクセルを操作する MSGBOX
記事No15254
投稿日: 2011/07/13(Wed) 06:03
投稿者あさがお44
いつも困った時に来てすみませんがよろしくお願いします。

環境 Win XP、 VB6.0、 EXCEL2007

したい事はVBからエクセルの表を作り最後にエクセルを表示する事です。
これ自体は出来ています。
分からないのはこの時 MSGBOX "完了しました。"
とやるとVBの画面に表示するので
順番が VB、MSGBOX、エクセル になってしまいます。

VB、エクセル、MSGBOX の順に出すにはどうすればいいのでしょうか?
下記のようにするとERRになります。


    'エクセルを起動する
    Set AppExcel = CreateObject("Excel.Application")
    AppExcel.Visible = False
    Set wb = AppExcel.Workbooks.Open(FILE_NM)
    retL = KY_SetXLAP(AppExcel)
    AppExcel.Sheets(1).Select
    
    表を作成(ここは長いので削除)

    AppExcel.Visible = True
    
    AppExcel.MsgBox "完了しました。"


何か方法はないかと探したのですが分かりませんでした。
よろしくお願いします。

[ツリー表示へ]
タイトルRe: VBからエクセルを操作する MSGBOX
記事No15255
投稿日: 2011/07/13(Wed) 09:41
投稿者YK
こんにちは。

> VB、エクセル、MSGBOX の順に出すにはどうすればいいのでしょうか?
> 下記のようにするとERRになります。

こんな風では
MsgBox "完了しました。", vbMsgBoxSetForeground

[ツリー表示へ]
タイトルRe: VBからエクセルを操作する MSGBOX
記事No15256
投稿日: 2011/07/13(Wed) 13:31
投稿者魔界の仮面弁士
> 順番が VB、MSGBOX、エクセル になってしまいます。
> VB、エクセル、MSGBOX の順に出すにはどうすればいいのでしょうか?

直接は無理なので:

=============================================
(案1) メッセージボックス表示中は、VB を最小化もしくは非表示にしておく。

  AppExcel.Visible = True
  Me.WindowState = vbMinimized
  'MsgBox "完了しました。", vbInformation Or vbSystemModal
  MsgBox "完了しました。", vbInformation Or &H40000 Or vbMsgBoxSetForeground
  Me.WindowState = vbNormal


=============================================
(案2) Excel マクロ で MessageBox API を呼び出す。

  AppExcel.Visible = True
  cmd = "CALL(""USER32"", ""MessageBoxA"", ""JJCCJ"", " & CStr(AppExcel.hWnd)
  cmd = cmd & ", ""完了しました。"", ""タイトル""," & CStr(vbInformation) & ")"
  ret = AppExcel.ExecuteExcel4Macro(cmd)
  'http://office.microsoft.com/ja-jp/excel-help/HP010062480.aspx


=============================================
(案3) MsgBox を呼び出す VBA コードを持った C:\MsgBook.xlsm を作っておき、
  それを AppExcel.Run もしくは AppExcel.ExecuteExcel4Macro で呼び出す。
 (または、AppExcel.VBE.VBProjects で VBA コードを動的生成)

[ツリー表示へ]
タイトルRe^2: VBからエクセルを操作する MSGBOX
記事No15257
投稿日: 2011/07/14(Thu) 02:35
投稿者あさがお44
こんなに丁寧に教えていただいて、ありがとうございます。
3つとも実際にやってみました。
すごく勉強になりました。
3つともコピーして保存しておきたいと思います。

それで今回は案2を使わせてもらいます。
ただAPIを良く知らないのでそのまま まねなのですが。。。
リンク先にも行ってみましたが私には難しく分かりませんでした。
APIのHPってC言語が多いのですがVBで説明しているところはないでしょうか?
あとずーずーしいついでに
下のPGで
WK_STR = "完了しました。"
とあらかじめ入れておいた時、
   cmd = cmd & ", ""完了しました。"", ""タイトル""," & CStr(vbInformation) & ")"
はどうなりますか?
これの意味が分からなくって。。。なぜ文字と文字の間に&がある時とない時があるのですか?
ほんとに申し訳ないのですが、よろしくお願いします。



> =============================================
> (案2) Excel マクロ で MessageBox API を呼び出す。
>
>   AppExcel.Visible = True
>   cmd = "CALL(""USER32"", ""MessageBoxA"", ""JJCCJ"", " & CStr(AppExcel.hWnd)
>   cmd = cmd & ", ""完了しました。"", ""タイトル""," & CStr(vbInformation) & ")"
>   ret = AppExcel.ExecuteExcel4Macro(cmd)
>   'http://office.microsoft.com/ja-jp/excel-help/HP010062480.aspx

[ツリー表示へ]
タイトルRe^3: VBからエクセルを操作する MSGBOX
記事No15258
投稿日: 2011/07/14(Thu) 09:22
投稿者shu
>    cmd = cmd & ", ""完了しました。"", ""タイトル""," & CStr(vbInformation) & ")"
> はどうなりますか?
> これの意味が分からなくって。。。なぜ文字と文字の間に&がある時とない時があるのですか?

&が文字列の連結に使用されるのは分かっていますか?ある時と無い時というのは多分""が
文字列中での"を表していることが分かっていない為だと思います。

", ""完了しました。"", ""タイトル"","
これは1つの文字列です。つまりこの部分を省略して書くと
cmd = cmd & "〜" & CStr(vbInformation) & ")"
となります。これは分かりますよね?

[ツリー表示へ]
タイトルRe^3: VBからエクセルを操作する MSGBOX
記事No15259
投稿日: 2011/07/14(Thu) 11:02
投稿者魔界の仮面弁士
> これの意味が分からなくって。。。なぜ文字と文字の間に&がある時とない時があるのですか?

文字列中に「"」を渡す場合は " を連記する必要があります。

たとえば、TextBox に「今日の天気は"快晴"です。」と表示する場合には、
 Text1.Text = "今日の天気は""快晴""です。"
という記述を行う事になります。

この場合、両端の「"」は文字列リテラルを囲む引用符とみなされ、
文字列中の「""」は、一個の「"」として扱われているわけです。

結果として、文字列リテラルには必ず、
偶数個の「"」が含まれていることになります(両端を含む)。


ここまでは大丈夫でしょうか?


次に & ですが、これは文字列を連結するための演算子です(恐らく御存知かと思います)。

これらを踏まえてみると、
>   cmd = "CALL(""USER32"", ""MessageBoxA"", ""JJCCJ"", " & CStr(AppExcel.hWnd)
>   cmd = cmd & ", ""完了しました。"", ""タイトル""," & CStr(vbInformation) & ")"
という処理は、
 (1)……「CALL("USER32", "MessageBoxA", "JJCCJ", 」
 (2)……CStr(AppExcel.hWnd)
 (3)……「, "完了しました。", "タイトル",」
 (4)……CStr(vbInformation)
 (5)……「)」
という 5 つの文字列を連結しているのだと読み取ることができます。
MsgBox や Debug.Print などで、変数 cmd の中身を確認してみてください。


そして今回のケースでは、
 WK_STR = "完了しました。"
を使いたいとのことですから、上記 3 の部分の一部を書き換えることになりますね。

[ツリー表示へ]
タイトルRe^4: VBからエクセルを操作する MSGBOX
記事No15260
投稿日: 2011/07/16(Sat) 02:34
投稿者あさがお44
ありがとうございます。
よく分かりました。

>  WK_STR = "完了しました。"
>  (3)……「, "完了しました。", "タイトル",」

は 
cmd = cmd & ", """ & WK_STR & """, ""タイトル""," & CStr(vbInformation) & ")"
になるのですね。
実際やってみるとちゃんと出来ました。
これで完全に解決しました。ありがとうございました。
あとひとつ、文字列に”を入れる時は””にする事。
今まで使う機会がなく知らなかったです。
しっかり覚えておきます。
丁寧にありがとうございました。
またお願いします。

[ツリー表示へ]
タイトルちょっと違います
記事No15261
投稿日: 2011/07/16(Sat) 12:03
投稿者魔界の仮面弁士

> あとひとつ、文字列に”を入れる時は””にする事。

文字列に「"」を入れるときは「""」で良いのですが、
文字列に「”」を入れるときは、「"”」や「””」では対応できません。

もしも「”」や「“」などを入力する必要がある場合には、
 cmd = Chr(&HFA57)   ' または ChrW(&HFF02)
 cmd = Chr(&H8167)   ' または ChrW(&H201C)
 cmd = Chr(&H8168)   ' または ChrW(&H201D)
などとしてください。


これが「"」の場合には、
 cmd = """"
 cmd = Chr(&H22)
 cmd = ChrW(&H22)
のいずれも同じ意味になるのですけれどね。

[ツリー表示へ]