vba クラスの作成時に「構文エラー」が表示されてしまう への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2018/10/16 18:30:01
> dim ~ as New クラス名
『Dim ~ As New クラス名』ですよね。
大文字小文字をきちんと使い分けた方が良いですよ。
それと、プログラムコードに適切なインデント(字下げ)を入れることをお奨めします。
たとえば
ではなく
とします。
> '//下記の部分で構文エラーになる
> fl.readfl(flName,txt1)
VBA におけるメソッドの呼び出しは、下記のいずれかの構文でなければなりません。
今回のケースでは、① または ② に書き直してみてください。
★Sub プロシージャなメソッドの呼び出しには、① または ② の構文を使います。
今回の readfl は Sub なので、① (あるいは②)が必要であるということです。
① の構文を使う場合には、引数全体を丸括弧で囲んではいけませんのでご注意ください。
② の構文を使う場合はその逆で、引数全体を丸括弧で囲む必要があります。
ただし渡すべき引数が無い場合 (引数が 0 個の場合) には、②でも丸括弧を記述しません。
提示いただいたコードで言うと、下記の部分で ① の構文が利用されています。
★Function プロシージャなメソッドの呼び出しには、① ~ ④ が利用できます。
メソッドの戻り値を無視する場合は、① または ② の構文です。たとえば下記がそうですね。
一方、戻り値を受け取る必要がある場合は、③ または ④ を用います。
たとえば下記が、③ の構文による表記になっていますね。
★引数を受け取るプロパティの呼び出しも同様に、③ または ④ を使います。
今回のコードでは、引数付きのプロパティを読み取っている行は無いようですが。
★なお戻り値の型が、数値・日付・Boolean・文字列・配列・ユーザー定義型などの場合は
③ または ④ が使われますが、戻り値がオブジェクト型である場合は ⑤ を使う必要があります。
今回のケースで言うと、下記で ⑤ の構文による表記が用いられていますね。
> クラスを作成する際に、
> 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® などが有名ですね。
『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()のコードは下記の通りです。
ユーザーフォームのコードです
ファイル処理のクラスです、
オブジェクト名はflegetです。
構文エラーの原因がわかりませんので、
大変申し訳ありませんが、
原因と解決策をご教示頂ければ、
幸いです。
困りましたね~です。
今回理由がありまして、
初めて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
構文エラーの原因がわかりませんので、
大変申し訳ありませんが、
原因と解決策をご教示頂ければ、
幸いです。
魔界の弁士さんへ
「困りましたね~」です。
お返事ありがとうございます。
なるほどぉ~です。
fl.readfl(引数,引数)のヒントが、
表示されましたので、
クラスに値を送る構文は、
丸かっこでいいのかと思っていました。
魔界の弁士さんが教えてくださった、
①でズバリとおりました!
C#だとクラスのインスタンスは
クラス名 変数 =New クラス名(引数)
でしたので、
真似をして記述したところ、
すんなりできましたので、
おっけーと思いましたが、
VBAでは違うんですね。
大文字小文字の使い分けは、
注意したいと思います。
インデントも、
普通のビジュアルスタジオなら、
完全自動なので、
あまり気にしてませんでしたが、
少し気にします。
バージョンも必要ですよね。
上記身に着けて、
質問上手になりたいと思います。
まだまだ、
完成には程遠いのですが、
難関突破の気分です。
あと、
このスレッドは、
呼び出し方法が、
詳細に書かれていますので、
貴重なスレッドだと思います。
沢山教えてくださり、
有難うございました。
また、
よろしくお願い致します。