質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

8362閲覧

Functionプロシージャで”修飾子が不正です。”のコンパイルエラーが出る

OugaiMori

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/02/25 07:10

Excelでデータを集めるツールを作成しています。
集めるところまではできたので、そのデータから文字列を抽出する関数を作成しているところで、エラーとなってしまいました。

エラーの内容

"修飾子が不正です。"といった内容のコンパイルエラーでした。
Logという引数に問題があるかと思ったのですが、
原因がよくわかりません。

実現したいこと

[000543]2019-07-02(2019-08-03/2020-02-14)
となっているデータを
2020-02-14
といったように抽出してセルに記載する。

コード

vba

1Dim Log As String 2Dim Row, cntTd As Long 3  略 4       '記事のDate情報を取得 5 For i = 0 To cntTd - 1 6 If InStr(objIE.document.getElementsByTagName("td")(i).innerText, "Article Detail") > 0 Then 7 Log = objIE.document.getElementsByTagName("td")(i + 7).innerText 8 Cells(Row, 44).Value = Cleansing(PLog) 9 Exit For 10 End If 11 Next i 1213 14Function Cleansing(ByVal Log As String) As String 15'最終日のみ抽出する 16Dim Str As Long 17Dim Gal As Long 18 Str = InStr(Log.Value, "/") 19 Gal = InStr(Log.Value, ")") 20 21 If Log = "" Then 22 Exit Function 23 Else 24 Log.Value = Right(Log, Str) 25 Log.Value = Replace(Log.Value, ")", "") 26 End If 27End Function 28

VBAについてはまだ勉強中なので、
いろいろおかしいところがあるかと思いますが、
ご助力いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Logという関数があるので、別名を使った方がよいでしょう。
名前を変えてどうなるかご確認ください。
またCleansing関数に渡しているPLogという変数がいきなり表れていますが大丈夫ですか?
直前の行ではLogに入れているようですが。
このような間違いを防ぐために、ファイル内行頭でOption Explicitを宣言するのをお勧めします。

投稿2020/02/25 07:30

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

エラーの原因は下記です。

vba

1Function Cleansing(ByVal Log As String) As String 2 '↑ Logは文字列(String) 3 4'最終日のみ抽出する 5Dim Str As Long 6Dim Gal As Long 7 Str = InStr(Log.Value, "/") 8 '↑ 文字列にValueプロパティはないのでエラーになる 9 Str = InStr(Log, "/") 10 '↑ これでOK 11 12'以下 Log.Value は Log に修正

Logという変数名は避けた方かいい、
Option Explicitを宣言すべき、
という点はttyp03さんも指摘している通りです。


さらに Cleansing関数ですが、.Valueを削除すればエラーはでなくなりますが、戻り値を設定していないので結果は常に""(空文字列)です。あと、"/"以降の切り出しはRightではなくMidです。これらを修正した関数が下記です。

vba

1Function Cleansing(ByVal Log As String) As String 2'最終日のみ抽出する 3Dim Str As Long 4'Dim Gal As Long '未使用なので不要 5 Str = InStr(Log, "/") 6' Gal = InStr(Log, ")") ' 未使用なので不要 7 8 If Log = "" Then 9 Exit Function 10 Else 11 Log = Mid(Log, Str + 1) 'Midに修正 12 Log = Replace(Log, ")", "") 13 End If 14 Cleansing = Log '関数の戻り値を設定 15End Function

自分が作成するなら下記のような感じにします。

vba

1Function Cleansing(ByVal vLog As String) As String 2'最終日のみ抽出する 3 If vLog = "" Or Not vLog Like "*/*" Then Exit Function 4 5 Cleansing = Split(vLog, "/")(1) 6 Cleansing = Replace(Cleansing, ")", "") 7 8End Function

投稿2020/02/25 07:45

編集2020/02/26 00:43
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問