dポイントプレゼントキャンペーン実施中!

お世話になります。
現在VBAでHTMLの書き出し用プログラムを書いています。

書き出したHTMLをUTF-8に変換するため、
■UTF-8ファイル作成 for VBA
http://www.vector.co.jp/soft/dl/winnt/prog/se320 …
のクラスモジュールを利用させていただいております。

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

A 回答 (2件)

> ByRef(参照渡し)からByVal(値渡し)に変更した際に


> 出てくる問題点等ありますでしょうか。
たぶん大丈夫だと思います ・・・

ByValにした場合メモリー上で引数がコピーされてこれが渡されることのなります
このコピーは必要が無くなればVBが後片付けをしますが
後片付けがいつ行われるかは プログラム上で制御するのが不能です
これが原因でメモリーを圧迫してOutOfMemoryなどのエラーが発生する可能性はありますが
今回ぐらいの規模なら大丈夫でしょう
    • good
    • 0
この回答へのお礼

大変参考になりました。
本当にありがとうございました!!

お礼日時:2008/11/25 21:12

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(値渡し)で上手くいかないでしょうか
    • good
    • 1
この回答へのお礼

redfox63様
ご回答ありがとうございます。

>TestA側を
>Public Sub TestA( ByVal f as TextFile)

上記で試したところ無事解決できました!!
本当にありがとうございました!

あと一点ご質問なのですが、
ByRef(参照渡し)からByVal(値渡し)に変更した際に
出てくる問題点等ありますでしょうか。

お礼日時:2008/11/25 19:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!