- 締切済み
「ByRef引数の型が一致しません」助けてください。
お世話になります。 現在VBAでHTMLの書き出し用プログラムを書いています。 書き出したHTMLをUTF-8に変換するため、 ■UTF-8ファイル作成 for VBA http://www.vector.co.jp/soft/dl/winnt/prog/se320375.html のクラスモジュールを利用させていただいております。 Sub testAで定義した内容を書き出すために、 Sub createTestでtestA fNum(i)とした場合、 「ByRef引数の型が一致しません」と怒られてしまいます…。 単数の生成であれば、testA f1で生成可能なのですが、 生成ファイルが複数あり、配列に格納して処理したいのです。 どなたかお力をお貸しください。 プログラムの知識はほぼ素人レベルですorz 宜しくお願いします。 ▼コード Option Explicit Public Sub createTest() Dim fNum As Variant Dim f1 As New TextFile, f2 As New TextFile, f3 As New TextFile, f4 As New TextFile, f5 As New TextFile, f6 As New TextFile Dim f7 As New TextFile, f8 As New TextFile, f9 As New TextFile, f10 As New TextFile, f11 As New TextFile, f12 As New TextFile Dim f13 As New TextFile, f14 As New TextFile, f15 As New TextFile, f16 As New TextFile, f17 As New TextFile Dim Header As String, BodyS_T As String, BodyS_L As String, GlNavi As String, Promo As String, Contents As String, PrNavi As String, SeNavi As String, Footer As String, BodyE As String Dim ContentsM As String, ContentsS As String Dim WBK As Workbook Dim SH2 As Worksheet Dim TplBox As Variant Dim createCurPath As String Dim i As Integer Set WBK = ThisWorkbook Set SH2 = WBK.Sheets(2) createCurPath = ThisWorkbook.path & "\" & UserForm1.TextBox1.Value fNum = Array(f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17) '<HEADER> Header = "Header" '<BODY-START> BodyS_T = "BodyS_T>" BodyS_L = "BodyS_L" '<GLOBAL NAVI> GlNavi = "GlNavi" '<PROMO> Promo = "Promo" '<CONTENTS> Contents = "Contents" ContentsM = "ContentsM" ContentsS = "ContentsS" '<PRIMRY NAVi> PrNavi = "PrNavi" '<SECONDARY NAVI> SeNavi = "SeNavi" '<FOOTER> Footer = "Footer" '<BODY-END> BodyE = "BodyE" For i = 0 To 16 If i = 0 Then fNum(i).FileCreate createCurPath & "\index.html", "UTF-8" ElseIf UserForm1("TextBox" & i + 1).Value <> "" Then fNum(i).FileCreate createCurPath & "\" & UserForm1("TextBox" & i + 1).Value & "\index.html", "UTF-8" End If fNum(i).TextWriteLine Header If i = 0 Then fNum(i).TextWriteLine BodyS_T ElseIf UserForm1("TextBox" & i + 1).Value <> "" Then fNum(i).TextWriteLine BodyS_L End If TplBox = SH2.Range("C" & i + 3).Value If TplBox <> "" Or TplBox <> "選択" Then If InStr(TplBox, "-TA-") > 0 Then testA fNum(i) fNum(i).TextWriteLine Promo fNum(i).TextWriteLine PrNavi ElseIf InStr(TplBox, "-TB-") > 0 Then testA fNum(i) fNum(i).TextWriteLine "<hr />" ElseIf InStr(TplBox, "-TC-") > 0 Then fNum(i).TextWriteLine ContentsS End If End If fNum(i).FileClose Next i End Sub Public Sub testA(f As TextFile) f.TextWriteLine "テスト1" End Sub
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
> ByRef(参照渡し)からByVal(値渡し)に変更した際に > 出てくる問題点等ありますでしょうか。 たぶん大丈夫だと思います ・・・ ByValにした場合メモリー上で引数がコピーされてこれが渡されることのなります このコピーは必要が無くなればVBが後片付けをしますが 後片付けがいつ行われるかは プログラム上で制御するのが不能です これが原因でメモリーを圧迫してOutOfMemoryなどのエラーが発生する可能性はありますが 今回ぐらいの規模なら大丈夫でしょう
- redfox63
- ベストアンサー率71% (1325/1856)
VBAではユーザーが型定義したオブジェクトを引数に持つプロシージャは暗黙的に ByRef(参照渡し)で行われます Public Sub TestA( f as TextFile) と記述した場合 Public Sub TestA(ByRef f as TextFile) と記述したのと同じになります このByRefでは呼び出し元と呼び出し先で型が一致している必要があります しかしお示しのコードでは fNumはVariant型なのに対し TestAの引数はTextFile型になっているので一致していない といっているのでしょう TestA側を Public Sub TestA( ByVal f as TextFile) といった具合に ByVal(値渡し)で上手くいかないでしょうか
お礼
redfox63様 ご回答ありがとうございます。 >TestA側を >Public Sub TestA( ByVal f as TextFile) 上記で試したところ無事解決できました!! 本当にありがとうございました! あと一点ご質問なのですが、 ByRef(参照渡し)からByVal(値渡し)に変更した際に 出てくる問題点等ありますでしょうか。
お礼
大変参考になりました。 本当にありがとうございました!!