「Sub または Function が定義されていません。」はプロシージャを呼び出そうとした時に、そのプロシージャが見つからない場合に出るエラーです。単純なスペルの書き間違いや、モジュール間のアクセスが禁止されている事が原因である事が殆どでしょう。
プロシージャ名の書き間違い以下の例は、単純なプロシージャ名の書き間違いです。プロシージャ名を修正する事で解決しますが、書き間違いによるエラーは気づきにくい場合があるので侮れません。
Sub Error1()Call myFunc22'スペルを間違えたEnd SubSub myFunc2()Range("A1") = 123End Subプロシージャの参照不備通常、標準モジュール間でのプロシージャの呼び出しは自由にできますが、シートモジュール、ThisWorkbookモジュールなどはPrivate扱いなので参照する事ができません。また、標準モジュールでもPrivateなどのアクセス指定子を付けているとプロシージャを参照する事が出来ずエラーとなります。
まとめ「Sub または Function が定義されていません。」の原因については比較的見つけやすいエラーと言えます。ただ、モジュール間でアクセスできない場合があるなど、参照できないルールを知らないと困惑するでしょう。そもそもPrivateなどのアクセス指定子は、勝手なアクセスを禁止してエラー喚起させるものですので、標準モジュールのPrivateアクセス指定子なども、その意図を汲み取って対処するべきでしょう。
関連記事:プロシージャの使い方プロシーシャの引数と返り値現在の年齢を出力する「型が一致しません。」の原因と対策「アプリケーション定義または オブジェクト定義のエラーです。」の原因シート上でのクリックイベントの処理ExcelVBA変数ExcelVBA 関数(プロシージャ)