![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
VBを勉強中です。
段階としては書籍やサイトを参考に既存のプログラムを編集しています。
VB6で作られたプログラムのバージョンアップを行う作業で、VB6→VS2005アップグレード完了後、エラー潰し作業(ここでの意見を参考に)後
デバッグを行っています。
.exeと同フォルダに.iniファイルを置き、参照ファイルの所在を記し
スタートアップオブジェクトの apli load イベントにて起動時に
iniを読み込ませたいのですが、うまくいきません。
VB2005では.iniではなく、.xmlでの記述を推奨とのことですが
それが原因なのでしょうか。
ビルドを行うと、.xmlが作成され、iniは作成されませんでした。
ヒントでも構いません、どうぞよろしくお願いします。
スタートアップオブジェクトは以下です。
Private Sub frmapli_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
IniFName = My.Application.Info.DirectoryPath & "\apli.ini"
End Sub
↓------ここからはapli.ini内容------↓
[apli]
MASTER_EXCEL_FILE_J = appli_form_J.xls
MASTER_EXCEL_FILE_E = appli_form_E.xls
MASTER_EXCEL_FILE_DIR =
VERSION_TEXT1 = apli Ver2.1
VERSION_TEXT2 =
VERSION_TEXT3 =
VERSION_TEXT4 =
VERSION_TEXT5 =
VERSION_PICTURE =
HELPFILE =
↑--------------------↑
参照ファイルは同フォルダ内にある以下4つのファイルです。
・apli_form_E.xls
・apli_form_J.xls
・apli.ico
・help.pdf
.iniファイルの下記部分をどう記せば良いのでしょうか。
●MASTER_EXCEL_FILE_DIR =
●VERSION_PICTURE =
●HELPFILE =
又、アップグレード前のVB6作成時での構文は以下でした。
Private Sub Form_Load()
IniFName = App.Path & "\apli.ini"
End Sub
No.2ベストアンサー
- 回答日時:
私も昔ハマったのですが、特にStringを扱うAPIだと、API側と.NETアプリとの間で
変数の調停を勝手に行ってくれたりは しないようです。
(この辺の詳細は、ややこしい&私も完全には理解できていないので
参考URLを見てください)
マーシャリングという設定をDeclareに記述して、調停方法を指定してやらなければいけません。
VB6までのGetPrivateProfileStringの書き方だと、私が遭遇した現象としては
1回目のAPI呼出だけは成功するけど2回目以降は単純に値の取得が出来ない(エラーにはならない)、
といった感じでした。
時間が無ければ、参考URL内の図8の内容で、APIの定義を書き換えてください。
(時間があれば、全部読むと結構勉強になると思います)
また、取得する文字列はStringBuilderで定義する必要がありますので、
図9を参照してください。
ちなみにXMLでの設定については、My.Settingsを使用して設定を定義すると
実際にはXMLの読み書きになると思います。
(設定の取得・書込みを、かなり簡略化してくれる)
VS2005では、Iniよりこっちの方が数段メジャーですね。
参考URL:http://www5b.biglobe.ne.jp/~yone-ken/VBNET/speci …
参照頂いたサイトを元に、見直すことで解決しました。
F11キーを押してのステップインを使い、変数に
何が入っているかをきちんと確認するべきでした。
どうもありがとうございました
No.5
- 回答日時:
>Message="'\\注1ネットワークドライプ名\' が見つかりません。
ファイル名およびファイルの保存場所が正しいかどうか確認してください。…ん?
もしかして実は「Iniは読めてるけど、その内容または以後の処理に問題があって
エラーになる」ってレベルの話ですかね?
一言で言えば「アプリの仕様を確認してください」って事になっちゃう気も
するのですが、Iniの内容から推測できる部分もあるので、そこだけ。
>MASTER_EXCEL_FILE_J = appli_form_J.xls
>MASTER_EXCEL_FILE_E = appli_form_E.xls
>MASTER_EXCEL_FILE_DIR =
ここから察するに、MASTER_EXCEL_FILE_DIR と、残りの2つを連結して
xlsファイルのフルパスを作成しているのでしょう。
MASTER_EXCEL_FILE_DIR に、該当のxlsファイルが存在するフォルダ
(ディレクトリ:DIR)を設定してみて下さい。
その際、末尾に\が必要かどうかは、まさにアプリの仕様次第ですので
(例えば "C:\Windows" なのか、"C:\Windows\" なのかというレベルの話)、
仕様を確認するか、MASTER_EXCEL_FILE_DIRとMASTER_EXCEL_FILE_J(E)を
連結している部分のソースを調べるか、pro_fl_name に格納されている文字列を
Console.WriteLineとかDebug.Printとかで確認するとかしてみてください。
それ以前の話(本当にIniが読めていない等)でしたら、別途詳細な状況を教えてください。
この回答への補足
見てくださりありがとうございます。apli.iniの内容を書き換えました。
↓------変更後apli.ini内容------↓
[apli]
MASTER_EXCEL_FILE_J = appli_form_J.xls
MASTER_EXCEL_FILE_E = appli_form_E.xls
MASTER_EXCEL_FILE_DIR = C:\bin
VERSION_TEXT1 = apli Ver2.1
VERSION_TEXT2 =
VERSION_TEXT3 =
VERSION_TEXT4 =
VERSION_TEXT5 =
VERSION_PICTURE =
HELPFILE = C:\bin\ヘルプファイル.pdf
↑--------------------↑
C:\binとC:\bin\のどちらでも
該当Excelファイルは読み込まず
ヘルプファイルだけは1度のみ開きましたが何故か二度目からはC:\Windows フォルダが開きました。
pro_fl_nameについてですが、
>pro_fl_name に格納されている文字列を
Console.WriteLineとかDebug.Printとかで確認するとかしてみてください。
この意味を調べてみたのですが、コマンドプロンプトを使用する?
とかで、理解できませんでした。
起動時にチェックが入っているラジオボタンの項目は下記となっておりました。
Private Sub Command4_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command4.Click
'次のメニュ-の表示が選択される
If Option4.Checked = True Then
pro_name = ReadIni1(IniFName, "apli", "MASTER_EXCEL_FILE_E")
Else
pro_name = ReadIni1(IniFName, "apli", "MASTER_EXCEL_FILE_J")
End If
pro_fl_name = ReadIni1(IniFName, "apli", "MASTER_EXCEL_FILE_DIR") & "\" & pro_name
plot_fl_name = Trim(Text2.Text)
この場合、下から2行目の"\" & pro_nameの
"\"の部分に問題があるのでしょうか?
上記箇所を全てExcelファイルがあるフォルダパスに変えても
状況は変わりませんでした。
ちなみにVB2005にアップグレード前のVB6作成版では
apli.iniの内容、該当Excelファイルのパスを指定すると
問題なく動作しました。
No.3
- 回答日時:
GetPrivateProfileStringやGetPrivateProfileIntの、Declare 宣言に間違いは無いですか?
VB6の場合、Integerは16ビット、Longは32ビットだが
VB.NETでは、Integerは32ビット、Longは64ビットになります。
VB.NETでの宣言は次のようになります。
Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer
No.1
- 回答日時:
iniファイルを読み込む部分のソースを提示しましょう
また エラーが出ているならそのエラーの詳細も投稿しましょう
WinAPIのGetPrivateProfileString等を使っているなら 引数の型宣言が合致しているか確認しましょう
Excelのシートを操作するようなアプリケーションならComオブジェクトの開放に十分配慮しましょう
VB6時代のコードは暗黙的に参照された物をExcelのオブジェクト参照を破棄した時点で一緒に破棄してくれました
VB.NETではそのような面倒を見てくれません
作成したアプリは終了したが Excelのタスクが残ってしまうといった現象が発生します
たとえば
dim oRng as Excel.Range = oXL.Worksheets("Sheet1").Range("A1")
などとしてしまうとoXL.Worksheets("Sheet1")の参照を開放する術が無くなります
VSTO(Visual Studio Tools for Office)だとこの辺りの対応が多少緩和されます
この回答への補足
情報が足りず申し訳ありませんでした。
redfox63さんのおっしゃるとおり、必ずアプリケーション強制終了後
その都度タスクにExcelが残ります。
すみません、知識不足の為、この部分は理解できませんでした。
>たとえば
>dim oRng as Excel.Range = oXL.Worksheets("Sheet1").Range("A1")
>などとしてしまうとoXL.Worksheets("Sheet1")の参照を開放する術が無くなります
>VSTO(Visual Studio Tools for Office)だとこの辺りの対応が多少緩和されます
エラーが出ている箇所は下記です。
エラーメッセージ
System.Runtime.InteropServices.COMException はハンドルされませんでした。
Message="'\\注1ネットワークドライプ名\' が見つかりません。ファイル名およびファイルの保存場所が正しいかどうか確認してください。
(注1)みつからないとされているパスは、外付けHDDとなっていました。なぜでしょう
Sub make_data_design_data() 'メインツ-ル
' エクセルファイルオープン
Exl = CreateObject("Excel.Application")
ExBook = Exl.Workbooks.Open(pro_fl_name) ←この行
Exl.DisplayAlerts = False
Exl.ScreenUpdating = False '画面表示の更新停止
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンパイル時のエラーについて...
-
急にXMLパースエラーが表示され...
-
thunderbardでエラーが出ます。
-
ホームページビルダーの【×】マ...
-
勝手にdatファイルになるのです...
-
ファイルが勝手にダウンロード...
-
WordでURLをクリックしてそのペ...
-
TSファイルをスムーズに再生したい
-
ギガファイル便って女の人のエ...
-
録音アプリのPCM録音で4時間録...
-
Windows Media Player 位置ス...
-
auムービーメール(.amc)をPC...
-
フリーのsshサーバーてあります...
-
HD TuneのBurst Rateとは何を意...
-
PDFファイルをホームページ...
-
Webページを丸ごと保存する方法
-
【緊急】JWWのファイルを開きた...
-
lsync+rsyncミラーリングで除外...
-
ホームページビルダー15で作っ...
-
Music Center for PCの楽曲をiT...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
急にXMLパースエラーが表示され...
-
ホームページビルダーの【×】マ...
-
コンパイル時のエラーについて...
-
ワードがなかなか閉じないです
-
VB6 使用中ファイルの確認
-
ftp_getできない?
-
ファイルopenエラーになってし...
-
エクセルVBA インデックスが有...
-
[TeX,DVI,PS,PDF]
-
Excelのハイパーリンクがエラー...
-
local by flywheelについて
-
韓国に送った添付ファイルexcel...
-
DellのHPが開かない!!
-
VBSでごみ箱に捨てたファイルの...
-
VBAのエラーについて教えてくだ...
-
Irvineフリーのプロトコルエラ...
-
thunderbardでエラーが出ます。
-
ファイル送信中のエラーについて
-
ステータスコード404がFirefox...
-
緊急です。 パワーポイントで p...
おすすめ情報