• ベストアンサー

VB.netでShellExecuteがしたい

VB6ですと ShellExecute(Me.Handle, "open", "History.csv", "", "", 3) とするとエクセルが開いて「History.csv」が観覧できるのですが、VB.netだと、エラーがでないもののエクセル画面がでてきません。なぜでしょうか? また、ShellExecuteに変わるような関数がありますでしょうか? 以下はソースです、パスは間違っていないし、返り値は562954248388610となっています。 i = ShellExecute(Me.Handle.ToInt64, "open", sFolderPullPath & "SerialHistory.csv", "", "", 3)

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

  • ベストアンサー
  • JeanneNet
  • ベストアンサー率48% (100/208)
回答No.4

こんにちは、じゃんぬねっと です。 ついでなんで以下についてもお答えします。 # まあ、余談に近いのですが... > 以下はソースです、パスは間違っていないし、返り値は562954248388610となっています。 > i = ShellExecute(Me.Handle.ToInt64, "open", sFolderPullPath & "SerialHistory.csv", "", "", 3) これは、Declare の宣言が間違ってるんじゃないでしょうか? VB6 での Long は、VB.NET では Integer (Int32) です。 戻り値が Long (Int64) になっているのならば、未定義の上位ビットが返ってきちゃいます。 # 第 1 引数を見る限り、そう確信しています。 それと、第 1 引数は IntPtr でやるべきですね。

lord_chan
質問者

補足

ありがとうございます。Declare の宣言をLongからInt32に直すとできました。 ちなみに「ByVal lpKeyName As Any」などのAny型は何に直せばいいのでしょうか?GetPrivateProFileStringに使われているものです。

その他の回答 (5)

回答No.6

GetPrivateProfileStringについても、変わらないと思うのですが^^; 値/参照のIN/OUT考えたら、全部STRINGに置き換える事ができますよー ついでだから、書きもあわせてサンプルをどうぞ^^ Private 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 Private 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 Const DEF_SEC As String = "SECTION" Const DEF_KEY As String = "KEY" Const DEF_INI As String = "C:\test.ini" Const DEF_BUFF_LEN As Integer = &HFF& Dim intRet As Integer Dim strValue As String = "値" '書く MsgBox("書き込む値: " & strValue) Call WritePrivateProfileString(DEF_SEC, DEF_KEY, strValue, DEF_INI) '初期化 strValue = New String(CChar(" "), DEF_BUFF_LEN) MsgBox("初期化された値: " & strValue) '読む If GetPrivateProfileString(DEF_SEC, DEF_KEY, vbNullString, strValue, DEF_BUFF_LEN, DEF_INI) Then   MsgBox("取得した値: " & Strings.Left(strValue, (InStr(strValue, vbNullChar) - 1))) Else   MsgBox("失敗") End If

lord_chan
質問者

補足

ありがとうございます、試してみます。

回答No.5

Anyは、場合によってStringかIntegerです。 もし、関連づいたアプリケーションでファイルを開くのであれば、Stringが使いやすいかと・・・・ Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _ (ByVal hwnd As Integer, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Integer) As Integer Dim intRet As Integer intRet = ShellExecute(0, "open", Environ("windir") & "\珈琲カップ.bmp", vbNullString, Environ("windir"), 1)

lord_chan
質問者

補足

なるほどですね、ありがとうございます。GetPrivateProFileStringのdeclareはどのような記述になるのでしょう?

  • JeanneNet
  • ベストアンサー率48% (100/208)
回答No.3

こんにちは、 VB.NET ですと、API を使わずとも、 System.Diagnostics.Process.Start() メソッドで可能です。

lord_chan
質問者

補足

ありがとうございます。今後とも活用させていただきます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

Shell関数を使うというのはどうでしょうか

lord_chan
質問者

補足

ご回答ありがとうございます。具体的にはshell関数でエクセルを起動させるのでしょうか?

  • iiikkk
  • ベストアンサー率37% (92/247)
回答No.1

Imports System.Diagnostics Process.Start("c:\History.csv") ではどうでしょうか?

lord_chan
質問者

補足

ご回答ありがとうございます。 なるほどですね、.netには新しい関数があるのですね。

関連するQ&A

  • ShellExecuteでエクセルファイルが起動しません。

     今、API関数GetOpenFileNameで「ファイルを開く」コモンダイアログを出して、  そこから選んだファイルのフルパスをテキストボックスに入れています。  さらにそのテキストボックスの中に入ったフルパスをAPI関数ShellExecuteで起動  させようとしているのですが、起動してくれません。  ちゃんとフルパスは入っています。  試しに新しいフォームを作ってShellExecute単独で、直接フルパスを  指定してやってみたところ起動できました。  問題は、パスではなく他の引数でしょうか??  ちなみに第1引数   : me.hwnd      第2引数   : "open"      第3引数   : フルパス      第4・5引数 : vbNullString      第6引数   : SW_SHOW と指定しました。  第4と5の引数はvbNullCharや""と指定してみました。  よろしくお願いします。

  • VBでShell○なのにShellExecute×

    http://support.microsoft.com/kb/170918/ja 等を参考に、コンソールアプリからHTMLファイルを呼び出すだけのEXEをVB(Visual Basic 2008 Express Edition)で作ったところ、 Shell関数ではHTMLがIEで起動されるのに対し、ShellExecute関数ではダメでした。 HTMLへのファイルパスが正しいことはMsgBoxで確認しました。 また、ほぼ同じソースをbasにしてExcelから起動すると、ShellExecuteでも起動しました。 以下がソース(抜粋)になりますが、原因が分かる方がおられましたら、ヒントだけでも、ご教示いただけると幸いです。 よろしくお願いいたします。 - - - - - - - - - - - - - - - - - - - - - - Option Explicit On Module Module1 Private Declare Function ShellExecute Lib "shell32.dll" Alias _ "ShellExecuteA" (ByVal hwnd As Long, ByVal lpszOp As _ String, ByVal lpszFile As String, ByVal lpszParams As String, _ ByVal lpszDir As String, ByVal FsShowCmd As Long) As Long Private Declare Function GetDesktopWindow Lib "user32" () As Long 'エラーコード宣言略 Function StartDoc(ByVal DocName As String) As Long Dim Scr_hDC As Long Scr_hDC = GetDesktopWindow() 'こちらだと成功 StartDoc = Shell("explorer.exe" & " " & DocName, vbNormalFocus) StartDoc = ShellExecute(Scr_hDC, "Open", DocName, _ "", "C:\", SW_SHOWNORMAL) End Function Sub Main() Dim r As Long, msg As String r = StartDoc(CurDir() & "\target.html") 'エラーハンドリング省略 End Sub End Module

  • VBからExcelのテキストを指定して開きたい

     VBのアプリケーションから文書名を指定してエクセルを起動したいのですが 出来なくて困っています。ちなみにコードは下記のとおりです。どこに問題があ るのか教えていただけないでしょうか。 Private Sub Command1_Click() Dim lngReturnCode As Long Dim strFileName As String strFileName = "AllTitles.csv"   lngReturnCode = ShellExecute(Me.hwnd, _ "open c:\***\***.xls", _ strFileName, _ vbNullString, _ App.Path, _ SW_SHOWNORMAL) End Sub

  • ShellExecuteでURLのアドレス表示が変

    どなたか教えて下さい。 開発環境は vb6 windowsXP sp2 です。 例えば ShellExecute(0, "open", App.Path & "http://hoge.htm", 0, 0, SW_SHOW) でIEを開いています。 開発環境では、うまくIEが開くのですが、 サーバーで実行すると、アドレスが 『http://hoge.htm%20"http://hoge.htm"』となってしまい画面がエラーとなってしまいます。 原因はサーバーなのでしょうか。 プログラムなのでしょうか。 サーバーはwindows2003サーバーです。

  • VBによるExcelファイルの開き方を教えて下さい。

    ※VBプログラムからエクセルを起動し技術資料を作成するものです [1]新規ファイルをオープンした場合は、書き込みは正常に作動します。 [2]既設のファイルは、Shell関数でエクセルファイルをオープンしています。 [3]データ書き込みで、下記のエラーが発生します。 「NullReferenceExceptionはハンドルされませんでした。」 (オブジェクト変数又はWithブロック変数が設定されていません) [4]ファイルのオープンコードは下記のとうりです。 Private Sub newF_Open() Me.Hide() xlApp = CreateObject("Excel.Application") xlBook = xlApp.workbooks.add xlSheet = xlBook.sheets("sheet1") xlBook.application.Visible = True Me.Show() MsgBox("Excelファイルは開きましたか", 0, "確認") End Sub 'rbtNEWボタンでの変更記述 Private Sub oldF_Open() Dim Ret As Object Dim Shell As Object With OpenFileDialog1 .Title = "ファイルの選択" .CheckFileExists = True .RestoreDirectory = True End With Me.Hide() Ret = OpenFileDialog1.ShowDialog() If Ret = Windows.Forms.DialogResult.OK Then End If Shell = CreateObject("Shell.Application") Shell.shellexecute(OpenFileDialog1.FileName, , Application.StartupPath, "open", 1) MsgBox("Excelファイルは開きましたか", 0, "確認") Me.Show() End Sub 'rbtOLDボタンでの変更記述 ※既設ファイルへの認識が、新規オープンファイルと異なる為だと思い ますが、 解決方法を、教えてください。

  • VB6.0 CSVファイル読み込みについて

    VB6.0について質問です。 CSVファイルの読み込みを行いたいのですがうまくいきません。。。 以下のソースのどこに問題ありますでしょうか?>< 14個のカンマ区切りのCSVファイルを読み込んでいますが ファイルのデータを変更するとインデックスが有効範囲にありませんというエーラーがでます。。。 ファイルは3行で構成しているのですがヘルプを参照したら複数行の場合はLINE Input #1, MyString(i)と書いてありました。 しかしやってみると行ごとのデータを取得してカンマ区切りで取得してくれませんでした。。。 以下のソースで実行すると改行部でエラーになるようです。 改行を無視するようなロジックを入れる必要があるのでしょうか? Dim MyString(), i Open App.path & "\" & CSV_filename For Input As #1 ReDim MyString(13) Do While Not eof(1) Input #1, MyString(i) Label4(i).caption = MyString(i) i = i + 1 Loop Close #1

  • VB6.0同一プログラム上で複数のExcelファイルの編集をしたいのですが…

    目にとめていただき有難うございます。 VBについては初心者です。宜しくお願い致します。 VB6.0で、フォーム上で指定した2つのExcelファイルについて、それぞれ特定の行・列を削除してCSVとして保存、そのデータを使って処理を行うプログラムを作成しようとしています。 同じVB6.0のプログラム上で、複数のExcelファイルに対して編集をかけることは可能でしょうか。 プログラムの流れとしては (1)エクセルオブジェクトの新しいインスタンスを作成 (2)エクセルファイル1を開き、特定行を削除する (3)エクセルファイル1をCSVとして保存、閉じる (4)オブジェクトを解放する (5)エクセルオブジェクトの新しいインスタンスを作成 (6)エクセルファイル2を開き、特定行を削除する (7)エクセルファイル2をCSVとして保存する (8)オブジェクトを解放する というものです。 (1)~(4)と(5)~(8)は同じSubプロシージャでファイルのパスだけ変えるようにしています。 (1)~(5)迄は素直に行くのですが、(6)の削除行を指定する段階で ‘Rows’メソッドは失敗しました’_Global’オブジェクト と出てしまう状態です。 (1)~(4)は問題なく動き、ファイル1の編集もきちんと出来ているため、混乱しております。 同じコードでパスだけ変えてやろうという考えが無理な話なのか、コードの組み方が悪いのか… 質問で不明瞭点があれば説明させて頂きますのでご指摘下さい。 宜しくお願い致します。 #ソースまで出した方が良かったのでしょうか…

  • VB及びエクセルのVBAにて、

    VB及びエクセルのVBAにて、 300000行のCSVデータを読み込もうと試みました。 ファイルOpenで、Line InputやInputBを使用しましたが、 どちらもあまり処理速度は変わらないようです。 高速で1行ずつCSVデータを読み込む方法をご存じないでしょうか。 ご存知でしたら、関連するサイトを教えていただければ助かります。 お手数をおかけしますが、よろしくお願いします。

  • vb6です。 現在開いているフォームの次のウィンドウをアクティブにした

    vb6です。 現在開いているフォームの次のウィンドウをアクティブにしたいのです。 ただ、次のウィンドウはエクセルなど他のアプリケーションになります。 ハンドルとかはよくわからないのでハンドル以外の方法があればそちらを使いたいのですが、もしハンドルを取得するしかなければサンプルソースも教えてほしいです。 おねがいします。

  • VB6でEXCELをクローズ出来ない

    VB6でEXCELを使用した後クローズ処理をしたつもりですが、VBと別にEXCELを起動しVBで使ったEXCELを読み込もうとすると、「編集のためロックされています」とメッセージが出て、読み取り専用でしかオープン出来ません。また、VBでEXCELを繰り返しオープンするとメモリがいっぱいになってしまいます。 VBでのEXCELオープンは Dim fnm As String Dim exl As Object fnm = "EXCEL File名" 'フルパスで指定 Set exl = CreateObject("Excel.Application") exl.Application.Workbooks.Open FileName:=fnm クローズは Set exl = CreateObject("Excel.Application") exl.Application.Quit Set Sheet = Nothing Set BooK = Nothing Set ExcelApp = Nothing 以上です。なお、VBの参考書は入門書だけ持っていますが、このようなことは書いてありません。従って上のコードも意味もわからず、ネットから拾ってきたまま使用しています。参考書または、Webサイトを紹介して頂ければ有り難いです。

専門家に質問してみよう