none
VBA2008ExpressEdititionでのXPへの対応の件 RRS feed

  • 質問

  • VISTAではプログラムが走るのにXPでは上手く走りません。同じように2008ExpressEditionをインストールしたつもりですがXPの場合は特に何か追加のインストール等が必要なのでしょうか?

    2010年5月7日 3:36

回答

  • 長いコードなので最後までは読んでいませんが、Paint イベントのところで InputBox や MessageBox の類は使わないでください。
    きつい言い方になりますが、Windows のプログラムとしてやってはいけないことをしていることになります。
    (Vista で改善された部分かもしれませんが、XP までの Windows では NG となる行為です)

    Paint イベントは画面に描画してほしいときに呼び出されますが、InputBox で待っている間にも再度描画要求がきたりします。
    従って、Paint イベントで Form を表示したり、InputBox や MessageBox を表示したりするようなコードを書いてはいけません。
    描画するためのパラメータは Paint イベント以外で集めてください。

    次に、Paint イベントでは CreateGraphics を使わず、e.Graphics を使ってください。
    Paint イベントを使ったサンプルを探して確認してみてください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク tyokogawa 2010年5月20日 3:28
    2010年5月17日 14:28
    モデレータ

すべての返信

  • タイトルに「フォームボタン表示でのエラー」とありますが、もう少し詳しく教えていただけませんか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年5月7日 15:33
    モデレータ
  • どういったようにうまくいかないのでしょうか?エラーが表示されるなどでしょうか?
    また、インストールした Express Edition の Service Pack の有無は同じでしょうか?
    .NET Framework 以外にコントロールを使った、ライブラリを使ったなどはないでしょうか?

    タイトルに「フォームボタン表示でのエラー」とありますが、もう少し詳しく教えていただけませんか?
    タイトルではなく、ハンドルです。
    過去にもこのプロファイルで投稿があることから、今回の投稿との関連性はないかもしれません。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年5月7日 15:41
    モデレータ
  • タイトルではなく、ハンドルです。
    お~、見間違えました。ご指摘ありがとうございます。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年5月7日 16:34
    モデレータ
  • こんにちは、VisualVasic2008フォームボタン表示でのエラー さん。

    Azulean さんからのご指摘のとおり、どのような状況なのか、エラーや環境情報なども含めて詳細情報を記載していただいたほうが、より回答を得やすくなるかなと思いますよ。
    ご連絡くださいね。

    2010年5月11日 8:39
  • 「フォームボタン表示でのエラー」と言うのとは質問の内容は違います。VISTAパソコン(自宅のPC)では問題なくプログラムが走るのにXP(会社のPC)では走らない。例えば①InputBoxでデータを入力するのですがXPでは同じInputBoxが2回(最初のInputBoxのみですが)続けて出現する。②Formを一旦、クリアする為のClearColor(e)が作動しない。③かってにプログラムが途中でストップして最初の宣言部分に戻っているような感じ。です。以上の問題は自宅のPC(VISTA)では全然、生じずにうまく走っています。VBA2008ExpressEditionのインストールに当たってはVISTAでもXPでも同じインストールだと思いましたが何か違うところがあるのでしょうか?それとも、XPではVBA2008ExpressEditionは作動しないステートメント等があるのでしょうか?
    2010年5月12日 12:31
  • ①InputBoxでデータを入力するのですがXPでは同じInputBoxが2回(最初のInputBoxのみですが)続けて出現する。②Formを一旦、クリアする為のClearColor(e)が作動しない。
    ③かってにプログラムが途中でストップして最初の宣言部分に戻っているような感じ。

    通常、XP だから、Vista だからといってそのような動きの差にはなりません。
    ソースコードに何らかの誤りがあるのではないでしょうか。
    あるマシンで正常に動作するからと行って、ソースコードに間違いがないとは限りません。

    InputBox だけ実行するプログラムを作って試してみて、問題をほかの人でも再現できるようにソースコードを提示してみてください。

    VBA2008ExpressEditionのインストールに当たってはVISTAでもXPでも同じインストールだと思いましたが何か違うところがあるのでしょうか?

    本筋じゃありませんが、VBA ではなく、VB です。(VBA は Office などに組み込まれているもので、違うものです)

    それとも、XPではVBA2008ExpressEditionは作動しないステートメント等があるのでしょうか?

    そういうものは例外(Exception)として出てきますので、そういった可能性は低いと思われます。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年5月12日 14:51
    モデレータ
  • 通常、XP だから、Vista だからといってそのような動きの差にはなりません。
    ソースコードに何らかの誤りがあるのではないでしょうか。
    あるマシンで正常に動作するからと行って、ソースコードに間違いがないとは限りません。

    上記のコメントを頂きましたが、と言うことは”あるマシンでは正常に動作するのにあるマシンでは同じ環境(同じVB2008ExpressEditionインストール、同じプログラムを起動)であるにもかかわらず動作しない”と言うことがあると言うことでしょうか?私の場合は自宅のVISTAでプログラムを作成し、うまく動作したので今度はそのプログラムをUSBを介して会社のXPにコピーして動作させたところ以前に投稿させて頂いたようなトラブルが出ます。もちろんいずれのPCにもVB2008ExpressEditionは同様にインストールしてあります。何かそのUSBを介したやり方、あるいは、VISTAからXPへの移植が問題になるとか言う様なことは無いでしょうか?(ちなみに私は最初の質問者です)

     

    2010年5月14日 22:20
  • 上記のコメントを頂きましたが、と言うことは”あるマシンでは正常に動作するのにあるマシンでは同じ環境(同じVB2008ExpressEditionインストール、同じプログラムを起動)であるにもかかわらず動作しない”と言うことがあると言うことでしょうか?

    たとえば、exe ファイル以外の何かに依存する場合は、単にファイルをコピーするだけでは動きません。
    "D:\" に何か読み書きするようなアプリケーションを作った場合、別のマシンの D:\ が CD/DVD ドライブだと書き込みができませんよね。

    そのほかには、自分のマシンには入っているライブラリ、コントロールだが、標準では入っていないものを利用している場合、相手のマシンにそれがないと動かないことはあり得ます。

    何かそのUSBを介したやり方、あるいは、VISTAからXPへの移植が問題になるとか言う様なことは無いでしょうか?

    環境差によって起きる・起きないは、今の情報では特定できないので、アドバイスしようがありません。
    ですので、シンプルなプロジェクトを作って、実験してみてくださいと先の発言で提案しています。

    シンプルなプロジェクトでも起きるのであれば、それに注目して原因を推測すれば良いでしょう。
    逆にシンプルなプロジェクトでは再現しないのであれば、InputBox が問題ではないのかもしれません。別の違い(観点)を見つけていく必要があります。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年5月15日 1:17
    モデレータ
  • 私の感想ですので、ずれておれば、ご容赦ください。
    VB6の場合で、DoEventsを入れたら、バグが発生すると言う話題に似ているなと思いました。
    DoEventsを入れていないから、たまたま、うまく動いているような。
    進捗を表す、プログレスバーの場合、XPや7では、プログラムどおり、伸びていくのですが、VISTAの場合は、少し遅れる。
    感覚的に言うと、XPや7では、バーを伸ばす、処理をするの繰り返しですが、VISTAの場合、バーを伸ばしつつ処理をする感じです。
    DoEventsを入れているのにです。(かえってリアル感があります。)

    XPで、開発されてはいかがでしょうか。

    2010年5月15日 9:14
  • 念のため。

    感覚的に言うと、XPや7では、バーを伸ばす、処理をするの繰り返しですが、VISTAの場合、バーを伸ばしつつ処理をする感じです。
    DoEventsを入れているのにです。(かえってリアル感があります。)

    VB6 ではスレッドの概念がないので避けられないのかもしれませんが、.NET 世代では Application.DoEvents の利用は避けるべきです。
    スレッドに関するクラス(Thread など)、コンポーネント(BackgroundWorker)が提供されているので頼る必然性もありません。
    とりあえず使うという風にしてしまうと、不具合の温床になるので…。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年5月15日 12:34
    モデレータ
  •  最初の質問者です。以下に確認用のプログラムを作成してみました。VISTAで作成し、VISTAでは問題なく、動作しましたが、XPで動作確認したところ、
    前回報告したようにInputBoxでの問い合わせが何回も出てきて、又、プログラム中の別の分割数を入れるInputBoxが出現しません。やはり、VISTAでは
    問題なく作動するプログラムがXPでは上手く作動しません。どなたか御指導いただきたく!
    Public Class Form1
      Dim WT, THIN, W, NCI, NCO As Integer
      Dim SLI, SLO As Double
      'SLIは板長さ(m)、WTは全体重量(Ton)、THINは板厚み(mm)、Wは板幅(mm)、NCIは均等分割数
      Public Sub form1_paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    
        WT = CInt(InputBox("全体重量WT(Ton)は?<例:15>", "板長さ算出", CStr(WT), 300, 550))
        THIN = CInt(InputBox("板厚みTHIN(mm)は?<例:2>", "板長さ算出", CStr(THIN), 300, 550))
        W = CInt(InputBox("板幅W(mm)は?<例:1200>", "板長さ算出", CStr(W), 300, 550))
        NCI = CInt(InputBox("均等分割数は?<例:3>", "板長さ算出", CStr(NCI), 300, 550))
        SLI = WT * 10 ^ 9 / 7850 / THIN / W / NCI
        MsgBox("分割後の板長さSLIは" & CInt(SLI) & "mです。")
    
        Dim aFont As New System.Drawing.Font("Arial", 7, FontStyle.Bold)
        Dim o As Graphics : o = Me.CreateGraphics
        Dim myPon As New System.Drawing.Pen(System.Drawing.Color.Blue)
        Dim formGraphics As System.Drawing.Graphics
        formGraphics = Me.CreateGraphics()
        Dim X1 As Integer = 20
        Dim Y1 As Integer = 220
        Dim X2 As Integer = 20 + 600
        Dim Y2 As Integer = 220
        formGraphics.DrawLine(myPon, X1, Y1, X2, Y2)
        myPon.Dispose()
        formGraphics.Dispose()
    
        Dim u As Graphics : u = Me.CreateGraphics
        Dim myPun As New System.Drawing.Pen(System.Drawing.Color.Black)
        formGraphics = Me.CreateGraphics()
        formGraphics.DrawLine(myPun, 20, 380, 20, 20)
        formGraphics.DrawLine(myPun, 20, 380, 620, 380)
        formGraphics.DrawLine(myPun, 120, 380, 120, 20)
        formGraphics.DrawLine(myPun, 220, 380, 220, 20)
        formGraphics.DrawLine(myPun, 320, 380, 320, 20)
        formGraphics.DrawLine(myPun, 420, 380, 420, 20)
        formGraphics.DrawLine(myPun, 520, 380, 520, 20)
        formGraphics.DrawLine(myPun, 620, 380, 620, 20)
        formGraphics.DrawLine(myPun, 20, 320, 620, 320)
        formGraphics.DrawLine(myPun, 20, 260, 620, 260)
        formGraphics.DrawLine(myPun, 20, 200, 620, 200)
        formGraphics.DrawLine(myPun, 20, 140, 620, 140)
        formGraphics.DrawLine(myPun, 20, 80, 620, 80)
        formGraphics.DrawLine(myPun, 20, 20, 620, 20)
        formGraphics.DrawString("0", aFont, Brushes.Red, 10, 385)
        formGraphics.DrawString("m(板長)", aFont, Brushes.Red, 620, 385)
        formGraphics.DrawString(CStr(CInt(SLI)), aFont, Brushes.Red, 600, 385)
        myPun.Dispose()
        formGraphics.Dispose()
    
    
        NCO = CInt(InputBox("別の均等分割数NCOは?<例:5>", "板長さ算出", CStr(NCO), 300, 550))
        SLO = WT * 10 ^ 9 / 7850 / THIN / W / NCO
        MsgBox("別の分割後の板長さSLOは" & CInt(SLO) & "mです。")
    
        ClearColor(e)
        Dim g As Graphics : g = Me.CreateGraphics
        Dim myPgn As New System.Drawing.Pen(System.Drawing.Color.Fuchsia)
        formGraphics = Me.CreateGraphics()
        Dim X3 As Integer = 20
        Dim Y3 As Integer = 220
        Dim X4 As Integer = 20 + 600
        Dim Y4 As Integer = 220
        formGraphics.DrawLine(myPgn, X3, Y3, X4, Y4)
        myPgn.Dispose()
        formGraphics.Dispose()
    
        Dim q As Graphics : q = Me.CreateGraphics
        Dim myPqn As New System.Drawing.Pen(System.Drawing.Color.Black)
        formGraphics = Me.CreateGraphics()
        formGraphics.DrawLine(myPqn, 20, 380, 20, 20)
        formGraphics.DrawLine(myPqn, 20, 380, 620, 380)
        formGraphics.DrawLine(myPqn, 120, 380, 120, 20)
        formGraphics.DrawLine(myPqn, 220, 380, 220, 20)
        formGraphics.DrawLine(myPqn, 320, 380, 320, 20)
        formGraphics.DrawLine(myPqn, 420, 380, 420, 20)
        formGraphics.DrawLine(myPqn, 520, 380, 520, 20)
        formGraphics.DrawLine(myPqn, 620, 380, 620, 20)
        formGraphics.DrawLine(myPqn, 20, 320, 620, 320)
        formGraphics.DrawLine(myPqn, 20, 260, 620, 260)
        formGraphics.DrawLine(myPqn, 20, 200, 620, 200)
        formGraphics.DrawLine(myPqn, 20, 140, 620, 140)
        formGraphics.DrawLine(myPqn, 20, 80, 620, 80)
        formGraphics.DrawLine(myPqn, 20, 20, 620, 20)
        formGraphics.DrawString("0", aFont, Brushes.Red, 10, 385)
        formGraphics.DrawString("m(板長)", aFont, Brushes.Red, 620, 385)
        formGraphics.DrawString(CStr(CInt(SLO)), aFont, Brushes.Red, 600, 385)
        myPqn.Dispose()
        formGraphics.Dispose()
    
      End Sub
    
      Public Sub ClearColor(ByVal e As PaintEventArgs)
        e.Graphics.Clear(Color.Silver)
      End Sub
    
    End Class
    
    • 回答の候補に設定 foohogehoge 2010年5月18日 2:01
    • 回答の候補の設定解除 山本春海 2010年5月18日 2:11
    2010年5月17日 13:24
  • 長いコードなので最後までは読んでいませんが、Paint イベントのところで InputBox や MessageBox の類は使わないでください。
    きつい言い方になりますが、Windows のプログラムとしてやってはいけないことをしていることになります。
    (Vista で改善された部分かもしれませんが、XP までの Windows では NG となる行為です)

    Paint イベントは画面に描画してほしいときに呼び出されますが、InputBox で待っている間にも再度描画要求がきたりします。
    従って、Paint イベントで Form を表示したり、InputBox や MessageBox を表示したりするようなコードを書いてはいけません。
    描画するためのパラメータは Paint イベント以外で集めてください。

    次に、Paint イベントでは CreateGraphics を使わず、e.Graphics を使ってください。
    Paint イベントを使ったサンプルを探して確認してみてください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク tyokogawa 2010年5月20日 3:28
    2010年5月17日 14:28
    モデレータ
  • すみません、間違って「回答の候補に設定」をクリックしてしまいました。
    取消はできないようです。。
    2010年5月18日 2:06
  • こんにちは、foohogehoge さん。
    間違いとのことなので、こちらで解除させていただきました。

    2010年5月18日 2:12