こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルマクロでEnd Subが見つからないとでる

Excelのマクロ記述についての質問です.
 以下のマクロはエクセルにない関数「IMMULT」をあらかじめ定義するためのものです.(技術計算のHPより入手し,コピーして貼り付けたものです)
 これを実行すると「End Subがみつからない」と出てしまいます.End Subは記述しているのになぜでしょうか,どなたか解決策を教えて頂けませんか!

Sub 関数定義()
Public Function IMMULT(a As Range, b As Range) As Variant
Dim r1 As Integer, r2 As Integer, c1 As Integer, c2 As Integer, nn As Integer
Dim r As Integer, c As Integer
Dim cr As Integer, cc As Integer
Dim n As Integer
Dim mm() As Variant
r1 = a.Rows.Count
r2 = b.Rows.Count
c1 = a.Columns.Count
c2 = b.Columns.Count
If (c1 = r2) Then nn = c1 Else Exit Function
End If
cr = r1
cc = c2
ReDim mm(1 To cr, 1 To cc)
For r = 1 To cr
For c = 1 To cc
mm(r, c) = 0
For n = 1 To nn
mm(r, c) = IMSUMa(mm(r, c), IMPRODUCTa(a.Cells(r, n), b.Cells(n, c)))
Next
Next
Next
IMMULT = mm
End Sub

投稿日時 - 2019-01-27 19:44:52

QNo.9581997

困ってます

質問者が選んだベストアンサー

こちらも必要のようですよ
http://www.geocities.jp/tomtomf/denki/AC1/ac1.htm
先ずエクセルで複素数を扱えるようにする
vbaで、利用する場合は、以下のコードを、標準モジュールに作っておく必要があります。コピーペーストで、貼り付けてください。
Public Function COMPLEXa(a As Double, b As Double) As Variant
・・・・・

投稿日時 - 2019-01-27 21:19:15

お礼

あの質問の内容で,この記事をよく見つけられましたね!
これで仕事が進みそうです.ありがとうございました!!

投稿日時 - 2019-01-29 00:22:38

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

プロシージャには
・SUB プロシジュアー  と
・Function プロシジュアー
とあります。
それぞれは
Sub()
End Sub

Function()
End Function
(左括弧と右括弧のように)囲われる形になります。
質問のコードは
Sub()
Function()
End Sub
となっており、
(誤り原因A)End Function がありません。
質問のようなことをするなら
Function IMMULT()
End Function
で定義し、IMMULTを使う(実行する、呼び出す)なら
(誤り原因B)
SUB XXX()
IMMULT(引き数)  ’Callを省略した方式の場合
End Sub
のような書き方をします。IMMULT()のすぐ前には、Function()はつけません。VBAやVBはそういう約束です。Callで呼び出すのが標準方法。
参考
https://www.sejuku.net/blog/28904
VBA入門】Functionの使い方(呼び出し、引数、戻り値)
Googleで「vba 関数の実行」で照会して記事を読むこと。
ーー
質問者は、独習の弊害が現れているように推測される。VBAとかプログラムの、学習で、何事によらず、注意が必要と思う。

投稿日時 - 2019-01-27 21:21:38

お礼

ご指摘のとおり,関数を定義したいだけに単にコピペしてしまいました.
詳細な解説を頂きました.今の私にはまだ解らない言葉がありますが,これで理解が進みそうです.ありがとうございました!!

投稿日時 - 2019-01-29 00:33:48

ANo.2

私はマクロにうとい人間です。

Sub 関数定義()
End Sub

としたら、エラーは出なくなりました。

そこから類推すれば、メインプロシージャーとサブプロシージャーの区別が無いのが問題なのではないでしょうか?
ま、マクロ自体が謎が多いけど・・。

私じゃこれが限界です。

投稿日時 - 2019-01-27 20:14:09

お礼

まだマクロの言葉も解らない私です.勉強します.ありがとうございました!

投稿日時 - 2019-01-29 00:16:16

ANo.1

>以下のマクロはエクセルにない関数「IMMULT」をあらかじめ定義するためのものです.
正しく貼り付けましょう
http://www.geocities.jp/tomtomf/denki/AC2/ac2.htm
Public Function IMMULT(a As Range, b As Range) As Variant
 Dim r1 As Integer, r2 As Integer, c1 As Integer, c2 As Integer, nn As Integer
 Dim r As Integer, c As Integer
 Dim cr As Integer, cc As Integer
 Dim n As Integer
 Dim mm() As Variant

 r1 = a.Rows.Count
 r2 = b.Rows.Count
 c1 = a.Columns.Count
 c2 = b.Columns.Count
 If (c1 = r2) Then
  nn = c1
 Else
  Exit Function
End If
cr = r1
cc = c2
ReDim mm(1 To cr, 1 To cc)

 For r = 1 To cr
  For c = 1 To cc
   mm(r, c) = 0
   For n = 1 To nn
    mm(r, c) = IMSUMa(mm(r, c), IMPRODUCTa(a.Cells(r, n), b.Cells(n, c)))
   Next
  Next
 Next
 IMMULT = mm
End Function

投稿日時 - 2019-01-27 20:14:02

お礼

意味も解らずSub**()とEnd Subの間に張り付けていました
Subが必要ないマクロもあったんですね!
早々に教えて頂きありがとうございました!!

投稿日時 - 2019-01-29 00:14:03

あなたにオススメの質問