• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB6.0で作成したexeファイルが他のPCではエラーが発生して動きません)

VB6.0で作成したexeファイルが他のPCではエラーが発生して動きません

このQ&Aのポイント
  • 仕事でVB6.0でつくられたプログラムが他のPCでエラーが発生し、動作しない問題が発生しています。
  • 指定したエクセルファイルを開いてデータを参照し、照合するVB6.0のプログラムが問題の原因です。
  • 他のPCでは「不正な処理をしているため、このプログラムを終了します」というエラーメッセージが表示され、問題が発生しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.6

原因は 事前(アーリー)バインディングつまり参照設定をしているためです yuzumiya氏のパソコンにはExcel2003、ターゲットパソコンにはExcel2000 ということですね VBのアプリはExcel2003を探しているが見つからないので落ちてしまうのです As Objectになおして EXcel2003への参照設定も外して EXEを作成してください

yuzumiya
質問者

お礼

何度も何度も、回答していただき、本当に有難うございました。 参照設定の「Microsoft Excel 11.0 Object Library」のチェックは外さずに、プログラム内の全ての箇所で(関数の引数も含めて) 以下の修正を行ったところ、他のPCでもエラーが発生することなくきちんとアプリが動作することが出来ました。  As excel.Application ⇒ As Object  As excel.Workbook   ⇒ As Object  As excel.Worksheet  ⇒ As Object 本当に、ありがとうございました。

yuzumiya
質問者

補足

回答有難うございます。 >原因は 事前(アーリー)バインディングつまり参照設定をしているためです >VBのアプリはExcel2003を探しているが見つからないので落ちてしまうのです ⇒なるほど!VBでExcel2003を探しているため、エラーが発生していたのですね!! >As Objectになおして EXcel2003への参照設定も外して EXEを作成してください ⇒修正するものは、以下の2点で宜しいでしょうか? (1)参照設定の「Microsoft Excel 11.0 Object Library」のチェックを外す。 (2)プログラム内の全ての箇所で以下の修正を行う。(関数の引数も含めて) As excel.Application ⇒ As Object As excel.Workbook   ⇒ As Object As excel.Worksheet  ⇒ As Object これから、修正してみます。

その他の回答 (5)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

元の質問の『不正な処理をしている為、このプログラムを終了します』のメッセージは作成したアプリで生成しているメッセージなのでしょうか、それとも Windowsが生成した物ですか? また補足などに投稿されたコードのどの部分をどのように変更なさったのでしょう excelfile_openプロシージャは機能しているのでしょうか もしかして あなたのパソコンにインストールされているExcelは複数ではありませんか その中の最新版のExcelと他のパソコンのExcelでバージョンが違うのでありませんか Dim xlApp As excel.Application といった具合で 事前(アーリー)バインディングするなら使用環境も同じExcelのバージョンである必要があります 違うバージョンが存在するなら excelfile_openの中でやっているように Excel関連のオブジェクトを As Objectで宣言して使いましょう 開発時は アーリーバインディングデングでインテリセンスを使いながら開発したほうが効率的でしょう リリース時点で As Objectに置き換え Excel.Applicationを新規に起こす場合は CreateObjectまたはGetObjectを使いましょう

yuzumiya
質問者

お礼

回答有難うございます。 助言頂いた箇所を、以下のように修正を行いましたが、やはり同じエラーが発生してしまいました。 -------------------------------- Private Sub Combo2_Click() Dim i As Integer Dim xlApp As Object  ← 修正後 Dim xlBook As Object  ← 修正後 Dim xlSheet As Object ← 修正後 ' Dim xlApp As excel.Application ← 修正前 ' Dim xlBook As excel.Workbook  ← 修正前 ' Dim xlSheet As excel.Worksheet ← 修正前 Dim fa As String, excelfile_path As String, terminal As String Dim Msg As String, Style As Integer, Title As String Dim terminal_Column As Integer, path_Column As Integer, path_name As String, Del_Line As Boolean 'エクセルのファイルパス名 fa = App.Path If Right(fa, 1) <> "\" Then fa = fa & "\" excelfile_path = fa & Text8.Text & Label7 '比較EXCELファイルの存在確認 If comp_excelfile_check(excelfile_path) = False Then Exit Sub Combo3.Enabled = False Combo3.Clear Combo3.Text = "(商品を選択してください)" Call excelfile_open(xlApp, xlBook, xlSheet, excelfile_path, "【参考】シート名") terminal = Combo2.Text i = xlSheet.Range("C13:C65536").Find(terminal, , , xlPart, , , , False).Row Do While xlSheet.Cells(i, 3).Text = terminal Combo3.AddItem xlSheet.Cells(i, 4).Value i = i + 1 Loop Combo3.Enabled = True Check5.Visible = False Check5.Value = 2 Check12.Visible = False Check12.Value = 2 End Sub -------------------------------- まだ、どこかおかしいのでしょうか?

yuzumiya
質問者

補足

返信が遅くなって申し訳ございません。 会社がお休みになってしまい、自宅からはアクセス出来ない為、こんなに遅れてしまい申し訳ありません。 >元の質問の『不正な処理をしている為、このプログラムを終了します』のメッセージは作成したアプリで生成しているメッセージなのでしょうか、それとも Windowsが生成した物ですか? ⇒Windowsが生成したものです。 >また補足などに投稿されたコードのどの部分をどのように変更なさったのでしょう ⇒投稿した箇所は一切修正を行っておりません。以前のままです。 >excelfile_openプロシージャは機能しているのでしょうか ⇒こちらも一切修正しておりませんし、自分のPCでは動いているので、機能していると思います。 >もしかして あなたのパソコンにインストールされているExcelは複数ではありませんか ⇒私のPCにはOffice2003しかインストールされておりません。 >その中の最新版のExcelと他のパソコンのExcelでバージョンが違うのでありませんか ⇒他のPCはOffice2000が殆どです。それよりバージョンの低いもののあります。ちなみに、以前作成していた方のPCはおそらくOffice2000と思われます。(本人がいないので確認は取れてはおりませんが) >Dim xlApp As excel.Application >といった具合で 事前(アーリー)バインディングするなら使用環境も同じExcelのバージョンである必要があります >違うバージョンが存在するならexcelfile_openの中でやっているように Excel関連のオブジェクトをAs Objectで宣言して使いましょう ⇒「excelfile_openの中でやっているように」というのは、どのコードの事を仰っているのでしょうか? 補足になるか分かりませんが、VBの[プロジェクト]-[参照設定]の「Microsoft Excel 11.0 Object Library」というものにチェックが入っております。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

新しいEXEの起動時にそのエラーが発生するのでしょうか それともあるアクション(イベント)を実行した場合に起きるのでしょうか エラーになっているであろう部分に MsgBoxなどを埋め込んで 何処まで期待通りに実行されているのか確認しましょう 今回の修正は何をしたのでしょうか 具体的なコードの提示があったほうが回答がつきやすいですよ 旧OSなどで検証が必要なら 仮想PC系のアプリケーションを導入してみましょう Virtual PCや VMWareなど …

yuzumiya
質問者

お礼

ゴメンなさい。もう一つ、エクセルファイルを開くプログラムを記載し忘れてしまいました。 以下になります。 Sub excelfile_open(xlApp As excel.Application, xlBook As excel.Workbook, xlSheet As excel.Worksheet, ByVal excelfile_path As String, ByVal sheet_name As String) 'エクセルファイルの取得 Dim excelfile_name As String excelfile_name = Mid(excelfile_path, InStrRev(excelfile_path, "\") + 1) On Error Resume Next 'エクセルを起動して、ファイルを開く 'Set xlApp = CreateObject("Excel.Application") 'Set xlBook = xlApp.Workbooks.Open(ExcelFile_path) Set xlApp = GetObject(, "Excel.Application") If Err.Number <> 0 Then Set xlApp = CreateObject("Excel.Application") Err.Clear End If Set xlBook = xlApp.Workbooks(excelfile_name) If Err.Number <> 0 Then '保存確認のメッセージを非表示にする。 xlApp.DisplayAlerts = False Set xlBook = xlApp.Workbooks.Open(excelfile_path) xlApp.DisplayAlerts = True End If Set xlSheet = xlBook.Worksheets(sheet_name) On Error GoTo 0 'エクセルを表示します。(表示しなくてもOK) 'xlApp.Visible = True End Sub よろしくお願い申し上げます。

yuzumiya
質問者

補足

回答有難うございます。返信遅れてもうしわけありませんでした。 exeは起動します。 イベント実行時にエラーが発生してしまいます。 exeを起動させると、ファイル名を入れるtextboxやアイテムを入れるcomboboxが表示されます。 イメージとしては、エクセルファイルにA社~D社で扱っている商品が表で纏めてあります。 そして、1つめのcombo.boxをクリックするとA社,B社,C社,D社と選べるようになり、これを選択すると、2つめのcombo.boxに、選んだ会社で扱っている商品が選べるようにcombo.boxのプルダウンに設定されるというものになります。 エラーが発生するのは、このcombo.boxでA社~D社を選択した時です。 エクセルファイルを開くプログラムで何かおかしな事になっている可能性があるのですが、この辺りは全く私は手を出していません。 いじる必要がありませんので、いじっていないのですが・・・。 その辺りのプログラムは以下の通りです。 Private Sub Combo2_Click() Dim i As Integer Dim xlApp As excel.Application Dim xlBook As excel.Workbook Dim xlSheet As excel.Worksheet Dim fa As String, excelfile_path As String, terminal As String Dim Msg As String, Style As Integer, Title As String Dim terminal_Column As Integer, path_Column As Integer, path_name As String, Del_Line As Boolean 'エクセルのファイルパス名 fa = App.Path If Right(fa, 1) <> "\" Then fa = fa & "\" excelfile_path = fa & Text8.Text & Label7 '比較EXCELファイルの存在確認 If comp_excelfile_check(excelfile_path) = False Then Exit Sub Combo3.Enabled = False Combo3.Clear Combo3.Text = "(商品を選択してください)" Call excelfile_open(xlApp, xlBook, xlSheet, excelfile_path, "【参考】シート名") 'エクセルを表示します。(表示しなくてもOK) 'xlApp.Visible = True terminal = Combo2.Text i = xlSheet.Range("C13:C65536").Find(terminal, , , xlPart, , , , False).Row Do While xlSheet.Cells(i, 3).Text = terminal Combo3.AddItem xlSheet.Cells(i, 4).Value i = i + 1 Loop Combo3.Enabled = True Check5.Visible = False Check5.Value = 2 Check12.Visible = False Check12.Value = 2 End Sub Function comp_excelfile_check(ByVal excelfile_path As String) As Boolean '比較EXCELファイルの存在確認 Dim Msg As String, Style As Integer, Title As String Dim excelfile_name As String excelfile_name = Mid(excelfile_path, InStrRev(excelfile_path, "\") + 1) If Dir(excelfile_path, vbNormal) = "" Then Msg = "比較ファイル『" & excelfile_name & "』が見つかりません。" ' メッセージを定義します。 Style = vbExclamation ' ボタンを定義します。 Title = "注意" ' タイトルを定義します。 MsgBox Msg, Style, Title comp_excelfile_check = False Else comp_excelfile_check = True End If End Function ちなみに、EXCELファイルの存在確認である、comp_excelfile_checkプログラムでは、存在しないファイル名で行うと、きちんと「ファイルが存在しません」とメッセージが出力されるので、ここまでは問題なく動いていることは分かっています。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

VB6のexeはVB6用のコンポーネントが実行時に必要です。exeだけコピーして動くのは、コンポーネントがインストール済みだからです。 修正時に新しいコンポーネントを追加しませんでしたか? いずれにしても、ディストリビューション・ウィザードでインストールキットを作成して頒布するのが正しい方法です。 これを嫌ってWebアプリケーションにしているプロジェクトが増えています。 Webアプリケーションだとクライアント側に何もインストールする必要がないですから。

yuzumiya
質問者

補足

回答有難うございます。返信が遅れてしまい申し訳ございません。 > exeだけコピーして動くのは、コンポーネントがインストール済みだからです。 修正時に新しいコンポーネントを追加しませんでしたか? コンポーネントがインストール済みというのは、どういう意味でしょうか?修正は、エクセルの参照セルを変更する程度のものです。 以前も、exeだけコピーして使えており、特に何かをインストールしてはおりませんでした。 webアプリケーションですか。初めて聞きました。調べてみます。 ご意見ありがとうございました。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

何かのコンポーネントで使うライブラリを「実行時に動的にロードして使用」にしているのかも。 Aさんは、すべてのコンポーネントを「実行ファイルに含める」にしているので、何も入れてない、どのPCでも動く。 質問者さんが書き換えた場所で使うライブラリを「実行時に動的にロードして使用」にしていると「VBのランタイムライブラリをインストール済み」のPCでしか動かなくなる。 「VBの開発環境がインストール済み」であれば「VBのランタイムライブラリもインストール済み」なのは確実。 「VBのランタイムライブラリがインストールされてないPC」で実行すると、ライブラリを使おうとしてもライブラリのロードと初期化に失敗する。 プログラムが「ライブラリのロードと初期化に成功したか?」をチェックせずに、失敗時にも成功したつもりでライブラリの関数を呼び出すと、当然 >エラーは「不正な処理をしている為、このプログラムを終了します」という 結果になるのは明白。 つまり >自分のPCでは問題なく動くのですが、他のPCで使用しようとするとエラーが発生して動きません。 って状態になる訳。 実行ファイルを作成する際の、ライブラリオプションを良~く確認しましょう。

yuzumiya
質問者

補足

早速の回答ありがとうございました。 回答頂いたライプラリオプションの件確認してみたいのですが、私初心者でして、全く分かりません。 大変申し訳ございませんが、どこをどのようにしたら良いでしょうか? 実は、VBの勉強をしたことが全くなく、Aさんから引き継がれたプログラムを必死に眺めてネットで検索して独学したので、知識がほぼ0ナノです。お手数お掛けします・・・。 はじめに、きちんとお知らせしておくべきでしたね。申し訳ありません。

noname#140971
noname#140971
回答No.1

最下位のOSで動くようにコーディングすることです。 最上位のOSでのみ動くように書いたらダメです。 ですから、Win95で開発してWin98やWinXPで動作確認したが手っ取り早いと思います。

yuzumiya
質問者

補足

早速の回答ありがとうございました。 95/98でexeファイルを作成すれば良いという事でしょうか? 最初にプログラムを開発したときのOSが既にXPで、win95/98でも動いていたのですが・・・。 ちなみに、他のXPでも同じエラーが発生してしまうのです。

関連するQ&A

専門家に質問してみよう