VBAを実行するとVBA エラー 35「Sub または Function が定義されていません。」を見る機会はありませんか?
コードをみても誤った箇所がわからず途方に暮れる場合もあるかと思います。
そんな中で悩むことは、
・VBA エラー 35「Sub または Function が定義されていません。」の対処はどうすればよい?
ではないでしょうか?
今回は、
についてまとめます!
もくじ
VBA エラー 35「Sub または Function が定義されていません。」はどんなエラー?
Sub、Function、または Propertyプロシージャが定義されていないか、呼び出し先のプロシージャが存在しないときに発生します。
仮組したプロシージャを呼び出したい時に良く起きるエラーですね。
呼び出し先のプロシージャ名が間違っているという単純なミスである場合がほとんどなのではないでしょうか。
VBA エラー 35の原因①「プロシージャの名前のスペルが誤っている」
プロシージャの名前のスペルが誤っているときにエラー 35が発生します。
「そんなプロシージャは存在しないよ!」
と怒られているわけですね。
以下サンプルコードです。
Sub エラーテスト1()
Call 誤った呼び出し先プロシージャ
End Sub
Sub 呼び出し先プロシージャ()
MsgBox "呼び出されました"
End Sub
呼び出し先プロシージャのスペルが違うので、エラーとなりますね。
![](https://extan.jp/wp-content/uploads/2020/11/110120_0306_1.png)
—–
VBA エラー 35の原因②「ライブラリの参照設定が抜けていて現行にない処理を呼び出している」
ライブラリの参照設定が抜けていて現行にない処理を呼び出しているときにエラー 35が発生します。
例えばWordのVBAでExcel関数を呼び出す処理をするときに「Excel Object Library」の参照設定が抜けていたり、
Excel側からOutlookのメール送信機能を呼び出すときに「Outlook Object Library」の参照設定が抜けていたりする場合が該当します。
![タカヒロ](/wp-content/uploads/2020/11/taka_kao.gif)
こちらの記事のコードを使用します。
数字を漢数字に変換する処理となります。
以下サンプルコードをWord側に実装します。
Sub 数字を漢数字に変換する()
Dim strChangeWord As String
Dim strBuf As String
Dim objWord As Range
Dim objParagraph As Paragraph
'漢数字変換パターン(書式)を指定します。
'十、百、千、万⇒1
'拾、百、阡、萬⇒2
'一、二、三 ⇒3
Const intshoshikiNum = 1
'RegExpをオブジェクトにセットします。
Set objRegExp = CreateObject("VBScript.RegExp")
'全体の範囲から1行づつ文字列を読み込みます。
For Each objParagraph In ActiveDocument.Range.Paragraphs
'Range.Textで1行分読み取った文字列を変数に格納します。
strBuf = objParagraph.Range.Text
'検索条件を指定します。"([0-9]+)"は数字の塊の指定条件となります。
objRegExp.Pattern = "([0-9]+)"
'検索を実行し一致する限り処理を繰り返します。
For Each objMatchWord In objRegExp.Execute(strBuf)
'検索結果の値を漢数字へ変換し、変数へ代入します。
strChangeWord = Evaluate("NUMBERSTRING(" & objMatchWord.Value & "," & intshoshikiNum & ")")
'変換後の文字列と変換前の文字列を置き換え変数へ格納します。※1行に複数条件に該当する文字列があれば順に置換していきます。
strBuf = objRegExp.Replace(strBuf, strChangeWord)
Next
'作業bufが変更されていたら、1行をまるまる交換します。
If strBuf <> objParagraph.Range.Text Then
objParagraph.Range.Text = strBuf
End If
Next
MsgBox "数字を漢数字に変換しました!"
Set objParagraph = Nothing
Set objMatchWord = Nothing
Set objRegExp = Nothing
End Sub
NUMBERSTRING関数はExcelの関数で、Wordでは存在しない関数のためエラーとなります。
—–
VBA エラー 35の原因①「プロシージャの名前のスペルが誤っている」の対処方法は存在するプロシージャ名を確認し、修正
プロシージャの名前のスペルが誤っている場合の対処方法は
存在するプロシージャ名を確認し、そのプロシージャ名に訂正をしましょう。
VBA エラー 35の原因②「ライブラリの参照設定が抜けていて現行にない処理を呼び出している」の対処方法は必要なライブラリの参照設定をする
エラー 35の原因②「ライブラリの参照設定が抜けていて現行にない処理を呼び出している」の対処方法は必要なライブラリの参照設定をしていきます。
上記のWordの場合はExce lの関数「NUMBERSTRING」の定義があるライブラリを参照する必要があるため
VBE(Visual Basic Editor)を開き、「ツール」>「参照設定」から
「Microsoft Excel **.* Object Library」にチェックを入れOKをクリックして実装してください。
さいごに
今回は、
についてまとめました。
VBAのエラーはパターンを知っておくと発生した時に慌てず対応することができますので、
しっかりと対処方法を把握するようにしておきたいですね!
If~
Eles
のElesの方でコンパイルエラーが出るのはなぜでしょうか?
何も記入してないのに、何を要求されているのでしょう?
試しに条件を付けてみても同じでした
いつもご利用ありがとうございます。
ご質問のコンパイルエラーにつきまして、
Eles以下の処理によるものかと存じますので、処理内容について教えて頂けますでしょうか。
またコンパイルエラーは参照設定をしていない場合に多く発生しますので、
まずは、必要な参照設定がされているかご確認いただければと存じます。
お返事ありがとうございます
遅くなりすみません
もう少し長いマクロの一部分になる予定で、そこだけ抜き出して動作確認をしていたため、コピーミスがありました
修正して再度、動作確認したところ、ちゃんと動きました
お騒がせしました
今後もお世話になります