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

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 困りましたね~  (社会人) 投稿日時 2018/10/16 21:32:23
こんにちは。

魔界の弁士さんへ


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


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

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

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


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


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

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


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


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

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


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

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

投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 15:18:37
(削除されました)
投稿者 (削除されました)  () 投稿日時 2018/10/16 10:43:52
(削除されました)
投稿者 困りましたね~  (社会人) 投稿日時 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



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