vba クラスの作成時に「構文エラー」が表示されてしまう

タグの編集
投稿者 困りましたね~  (社会人) 投稿日時 2018/10/16 00:07:45
こんにちは。

困りましたね~です。

今回理由がありまして、
初めてvbaを使うことになりました。

vbaはjava系やc#と少し勝手が違いますので、
苦戦しております。


質問ですが、
クラスを作成する際に、
dim ~ as New クラス名
でいいと思いますが、
この方法ですと、
構文エラーが表示されてしまいます。

構成は、
エントリーポイントが、
sub main()で
ユーザーフォームを使用しています。

エクセルのvbaではなく、
3d-cadのvbaです。

バージョンは、
Microsoft Visual Basic for Application 7.1
ウィンドウズ10
です。

sub main()のコードは下記の通りです。
'一番初めに読み込むプロシージャ 
Sub main()
'お決まりの文句 
Dim swApp As Object
Dim Part As Object
Dim boolstatus As Boolean
Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc

Dim myView As Object
        
Set myView = Part.ActiveDrawingView
 
If myView Is Nothing Then

MsgBox "ビューをアクティブにして" & vbNewLine & "やり直してください。"

Exit Sub

End If

'ユーザーフォームの作成 
Dim uf1 As New UserForm1
uf1.Show

myView.FocusLocked = True

Dim myNote As Object
Dim myAnnotation As Object

'注記の挿入 
Set myNote = Part.InsertNote("P/C  2")

Set Annotation = myNote.GetAnnotation()

boolstatus = Annotation.SetPosition(0.2, 0.2, 0)

Part.ClearSelection2 True

myView.FocusLocked = False

'念のため再構築 
Part.WindowRedraw
End Sub



ユーザーフォームのコードです
'選択したファイル名 
Dim flName  As String

'ファイルの選択 
Private Sub CommandButton2_Click()

Dim Filter As String

Dim fileConfig As String

Dim fileDispName As String

Dim fileOptions As Long
 
Set swApp = Application.SldWorks

' This following string has three filters associated with it; note the use 
'次の文字列には3つのフィルタが関連付けられています。 使用に注意する 

' of the | character between filters 
'フィルター間の文字 
Filter = "CSVファイル (*.csv; *.CSV)|*.csv;*.CSV"

flName = swApp.GetOpenFileName("File to Attach""", Filter, fileOptions, fileConfig, fileDispName)

' In the dialog, click the down-arrow associated with Files to Type to see the filters 

' dialogFiles of Type down arrow key 

If flName = vbNullString Then

MsgBox "ファイルが選択されていません。"

Else

'ファイルが選択されている場合はラベルに表示 
Label4.Caption = flName

End If
 
End Sub

Private Sub CommandButton1_Click()

Dim str1 As String

Dim txt1 As String

Dim num1 As Integer

txt1 = TextBox1.Text

num1 = Len(txt1)

'テキストボックスが空欄の場合は、 
'直ちに終了する 
If num1 = 0 Then

MsgBox "テキストボックスが空欄になっています、" & vbNewLine & "部品名をコピーして、" & vbNewLine & "やり直してください。"

End

End If

'if分で終了しない場合はファイル処理のクラスを作成する 
Dim fl As New fleget

'//下記の部分で構文エラーになる 
fl.readfl(flName,txt1)

Unload Me

End Sub



ファイル処理のクラスです、
オブジェクト名はflegetです。
Dim p_count As String

Public Sub readfl(fnm As String, pnm As String)

Dim fso As New Scripting.FileSystemObject
Dim csvFile As Object
Dim csvData As String
Dim splitcsvData As Variant
Dim i As Integer
Dim j As Integer

Set csvFile = fso.OpenTextFile(fnm, 1)
i = 1
Do While csvFile.AtEndOfStream = False
csvData = csvFile.ReadLine
splitcsvData = Split(csvData, ",")
j = UBound(splitcsvData) + 1
If pnm = splitcsvData(2) Then

MsgBox splitcsvData(2)

End If

i = i + 1
Loop

csvFile.Close
Set csvFile = Nothing
Set fso = Nothing

End Sub



構文エラーの原因がわかりませんので、
大変申し訳ありませんが、
原因と解決策をご教示頂ければ、
幸いです。


投稿者 (削除されました)  () 投稿日時 2018/10/16 10:43:52
(削除されました)
投稿者 (削除されました)  () 投稿日時 2018/10/16 15:18:37
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/10/16 18:30:01
> dim ~ as New クラス名
『Dim ~ As New クラス名』ですよね。
大文字小文字をきちんと使い分けた方が良いですよ。

vba → VBA、c# → C#、sub → Sub、cad → CAD なども同様に。



それと、プログラムコードに適切なインデント(字下げ)を入れることをお奨めします。
たとえば

If myView Is Nothing Then
MsgBox "ビューをアクティブにして" & vbNewLine & "やり直してください。"
Exit Sub

ではなく

If myView Is Nothing Then
    MsgBox "ビューをアクティブにして" & vbNewLine & "やり直してください。"
Exit Sub

とします。



> '//下記の部分で構文エラーになる 
> fl.readfl(flName,txt1)
VBA におけるメソッドの呼び出しは、下記のいずれかの構文でなければなりません。
今回のケースでは、① または ② に書き直してみてください。

fl.readfl flName, txt1               '①引数を 2 つ渡す。戻り値を受け取らない。 
Call fl.readfl(flName, txt1)         '②引数を 2 つ渡す。戻り値を受け取らない。 
result = fl.readfl(flName, txt1)     '③引数を 2 つ渡し、戻り値を受け取る。 
Let result = fl.readfl(flName, txt1) '④引数を 2 つ渡し、戻り値を受け取る。(非推奨な構文) 
Set result = fl.readfl(flName, txt1) '⑤引数を 2 つ渡し、戻り値としてオブジェクトを受け取る。 



★Sub プロシージャなメソッドの呼び出しには、① または ② の構文を使います。
 今回の readfl は Sub なので、① (あるいは②)が必要であるということです。
 ① の構文を使う場合には、引数全体を丸括弧で囲んではいけませんのでご注意ください。
 ② の構文を使う場合はその逆で、引数全体を丸括弧で囲む必要があります。
 ただし渡すべき引数が無い場合 (引数が 0 個の場合) には、②でも丸括弧を記述しません。

 提示いただいたコードで言うと、下記の部分で ① の構文が利用されています。

'Sub メソッドに引数 1 個を渡して呼び出している箇所 
 Part.ClearSelection2 True

'Sub メソッドを引数なしで呼び出している箇所 
 Part.WindowRedraw
 uf1.Show
 csvFile.Close




★Function プロシージャなメソッドの呼び出しには、① ~ ④ が利用できます。
 メソッドの戻り値を無視する場合は、① または ② の構文です。たとえば下記がそうですね。

'Function メソッドに引数 1 個を渡して、戻り値を読み捨てている箇所 
 MsgBox "ビューをアクティブにして" & vbNewLine & "やり直してください。"


 一方、戻り値を受け取る必要がある場合は、③ または ④ を用います。
 たとえば下記が、③ の構文による表記になっていますね。

'Function メソッドに引数 1 個、2 個、3 個、6 個を渡し、戻り値を変数に受け取っている箇所 
 num1 = Len(txt1)
 splitcsvData = Split(csvData, ",")
 boolstatus = Annotation.SetPosition(0.2, 0.2, 0)
 flName = swApp.GetOpenFileName("File to Attach""", Filter, fileOptions, fileConfig, fileDispName)



★引数を受け取るプロパティの呼び出しも同様に、③ または ④ を使います。
 今回のコードでは、引数付きのプロパティを読み取っている行は無いようですが。


★なお戻り値の型が、数値・日付・Boolean・文字列・配列・ユーザー定義型などの場合は
 ③ または ④ が使われますが、戻り値がオブジェクト型である場合は ⑤ を使う必要があります。
 今回のケースで言うと、下記で ⑤ の構文による表記が用いられていますね。

'オブジェクトを返す Function に、引数 0 個、1 個、2 個を渡して呼び出している箇所 
 Set Annotation = myNote.GetAnnotation()
 Set myNote = Part.InsertNote("P/C  2")
 Set csvFile = fso.OpenTextFile(fnm, 1)




> クラスを作成する際に、
> dim ~ as New クラス名
> でいいと思いますが、
実はあまり良くないのです。詳細は下記参照。
https://thom.hateblo.jp/entry/2016/09/27/221527


> エクセルのvbaではなく、
> 3d-cadのvbaです。
どの 3D-CAD 製品を使用しているか、
質問時にはバージョンと製品名もはっきり記載した方が良いですよ。


> Set swApp = Application.SldWorks
なるほど、SolidWorks シリーズですか。(私は使ったことが無いのですが)

VBA 搭載の 3D CAD というと、他にはオートデスク社の
Inventor® や AutoCAD® などが有名ですね。 
投稿者 困りましたね~  (社会人) 投稿日時 2018/10/16 21:32:23
こんにちは。

魔界の弁士さんへ


「困りましたね~」です。


お返事ありがとうございます。
なるほどぉ~です。

fl.readfl(引数,引数)のヒントが、
表示されましたので、
クラスに値を送る構文は、
丸かっこでいいのかと思っていました。

魔界の弁士さんが教えてくださった、
①でズバリとおりました!


C#だとクラスのインスタンスは
クラス名 変数 =New クラス名(引数)
でしたので、
真似をして記述したところ、
すんなりできましたので、
おっけーと思いましたが、
VBAでは違うんですね。


大文字小文字の使い分けは、
注意したいと思います。

インデントも、
普通のビジュアルスタジオなら、
完全自動なので、
あまり気にしてませんでしたが、
少し気にします。


バージョンも必要ですよね。
上記身に着けて、
質問上手になりたいと思います。


まだまだ、
完成には程遠いのですが、
難関突破の気分です。

あと、
このスレッドは、
呼び出し方法が、
詳細に書かれていますので、
貴重なスレッドだと思います。


沢山教えてくださり、
有難うございました。

また、
よろしくお願い致します。