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
すいません、エクセルマクロ側のソースを忘れました。
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
'以下、処理続く・・・。
よろしくお願いします。
引数の受け取りには、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
> xlApp.Run ("READ_TextFile")
の第2引数以降で指定でもいいかなぁ(?)。
詳しくはエクセル VBA のヘルプでご確認下さい。
いなさん、特攻隊長まるるうさんお答えありがとうございます。
色々試してみた結果、
xlApp.Run ("READ_TextFile",abcde) 'abcdeの中身はパス名
これで引数は渡せそうです。
問題は、この渡した引数をどのようにして
エクセルマクロ側で受け取るかです。
With ActiveSheet.QueryTables.Add(Connection:="TEXT;abcde",Destination:=Range("A1"))
このabcdeの部分に渡したいのですけれど、いい答えが見つかりません。
聞いてばかりで申し訳ありませんが、よろしくお願いします。
…問題も何も(^^;)
>xlApp.Run ("READ_TextFile",abcde) 'abcdeの中身はパス名
の時点でエクセル VBA 側に処理は移ってます。[VB6.0]側から
特別な処理を何かする必要はありません。
普通に関数(READ_TextFile)の引数として受け取って下さい。
すいません、勘違いしていました。
問題も何も無いですよね^^;
そして、無事に処理が完成しました。
特攻隊長まるるうさん、いなさんありがとうございました。
ツイート | ![]() |