VBからエクセルを起動して引数を渡し方は?

解決


かみや  2005-01-11 20:59:17  No: 118745

VBのフォームで、csvファイルをコモンダイアログで指定し、
テキストボックスにそのファイルのパスを表示させます。

次にコマンドボタンを押すとエクセルのマクロが起動し
そのテキストボックスに書かれているパスのファイルを
引数として渡し、エクセルマクロ側でそのファイルを使って
処理させようと思っています。

この際の、VBからエクセルへの引数の渡し方が色々調べたのですが
分かりませんでしたので、どなたかご教授ください。
よろしくお願いします。

--------以下ソース--------

Private Sub DB_UpLoad_Sarch_Click()
    
Dim pathdata As String
Dim pathlengs As Integer

    'コモンダイアログを開く
    CommonDialog1.FileName = ""        '選択ファイル名の表示をクリア
    CommonDialog1.FilterIndex = 0      
    CommonDialog1.Filter = "csvファイル(*.csv)|*.csv|すべてのファイル(*.*)|*.*"  'ファイルの種類
    CommonDialog1.InitDir = CurentPath 
    CommonDialog1.ShowOpen
    
    If (CommonDialog1.FileName <> "") Then    'ユーザーがファイルを選択した
        
        pathdata = CommonDialog1.FileName
        pathlengs = Len(pathdata)             'パス情報の文字数を取得
        
        '選択したPath情報をテキストボックスに表示
        Comp_Directry1.Text = pathdata       '選択されたファイル
    
    End If
End Sub

Private Sub Command3_Click()

    Dim xlApp   As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    Set xlApp = CreateObject("Excel.Application")

    'エクセル起動
    Set xlBook = xlApp.Workbooks.Open(C:\test2.xls)
    Set xlSheet = xlBook.Worksheets(1)    
        xlApp.Visible = True
       'マクロ起動
        xlApp.Run ("READ_TextFile")
        xlApp.DisplayAlerts = False
        
End Sub


かみや  2005-01-11 21:07:25  No: 118746

すいません、エクセルマクロ側のソースを忘れました。

Option Explicit
Sub READ_TextFile()
    Dim APP As Application          ' Applicationオブジェクト
    Dim s_FILENAME As String        ' ファイル名
    Dim s_REC As String             ' 読み込んだレコード内容
    Dim GYO As Long                 ' セルの行
    Dim freenum As Integer
    Dim flg As Integer              'フラグ
    Dim i As Integer
    Dim j As Integer

    Range("A1").Select
    With ActiveSheet.QueryTables.Add(Connection:="TEXT;指定したcsvファイル名", _
        Destination:=Range("A1"))
        .Name = "NITC"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
'以下、処理続く・・・。

よろしくお願いします。


いな  2005-01-11 22:25:51  No: 118747

引数の受け取りには、Command 関数を使用できると思います。

次の例は、Command 関数を使って、
配列を格納したバリアント型 (Variant) を返す関数のコマンドラインの
引数を取得します。

Function GetCommandLine(Optional MaxArgs)
   ' 変数を宣言します。
   Dim C, CmdLine, CmdLnLen, InArg, I, NumArgs
   ' MaxArgs が提供されるかどうかを調べます。
   If IsMissing(MaxArgs) Then MaxArgs = 10
   ' 現在のサイズの配列にします。
   ReDim ArgArray(MaxArgs)
   NumArgs = 0: InArg = False
   ' コマンド ラインの引数を取得します。
   CmdLine = Command()
   CmdLnLen = Len(CmdLine)
   ' 同時にコマンド ラインの引数を取得します。
   For I = 1 To CmdLnLen
      C = Mid(CmdLine, I, 1)
      ' スペースまたはタブを調べます。
      If (C <> " " And C <> vbTab) Then
         ' スペースまたはタブのいずれでもありません。
         ' 既に引数の中ではないかどうかを調べます。
         If Not InArg Then
         ' 新しい引数が始まります。
         ' 引数が多すぎないかを調べます。
            If NumArgs = MaxArgs Then Exit For
               NumArgs = NumArgs + 1
               InArg = True
            End If
         ' 現在の引数に文字を追加します。
         ArgArray(NumArgs) = ArgArray(NumArgs) & C
      Else
         ' スペースまたはタブを見つけました。
         ' InArg フラグに False を設定します。
         InArg = False
      End If
   Next I
   ' 引数がすべて格納できるように配列のサイズを変更します。
   ReDim Preserve ArgArray(NumArgs)
   ' 関数名に配列を返します。
   GetCommandLine = ArgArray()
End Function


特攻隊長まるるう  2005-01-11 22:30:56  No: 118748

>        xlApp.Run ("READ_TextFile")
の第2引数以降で指定でもいいかなぁ(?)。
詳しくはエクセル VBA のヘルプでご確認下さい。


かみや  2005-01-11 23:24:32  No: 118749

いなさん、特攻隊長まるるうさんお答えありがとうございます。

色々試してみた結果、
xlApp.Run ("READ_TextFile",abcde)  'abcdeの中身はパス名
これで引数は渡せそうです。

問題は、この渡した引数をどのようにして
エクセルマクロ側で受け取るかです。

With ActiveSheet.QueryTables.Add(Connection:="TEXT;abcde",Destination:=Range("A1"))

このabcdeの部分に渡したいのですけれど、いい答えが見つかりません。
聞いてばかりで申し訳ありませんが、よろしくお願いします。


特攻隊長まるるう  2005-01-12 02:26:45  No: 118750

…問題も何も(^^;)
>xlApp.Run ("READ_TextFile",abcde)  'abcdeの中身はパス名
の時点でエクセル VBA 側に処理は移ってます。[VB6.0]側から
特別な処理を何かする必要はありません。
普通に関数(READ_TextFile)の引数として受け取って下さい。


かみや  2005-01-12 03:01:58  No: 118751

すいません、勘違いしていました。
問題も何も無いですよね^^;
そして、無事に処理が完成しました。

特攻隊長まるるうさん、いなさんありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加