• 受付
  • 困ってます

ExcelのVBAでセルに指定したユーザ関数につい

  • 質問No.9675962
  • 閲覧数67
  • ありがとう数1
  • 気になる数0
  • 回答数2

お礼率 80% (106/131)

ExcelのVBAのユーザ関数について

例えば、
Excelのあるセル、例えば、C1セルの値を引数として、「Function 練習()」
という、ユーザ関数に渡します。
関数内では、引数で渡されてきた値のセル番号を判断し、その次のセルに
値を設定します。
つまり、C1セル(1,4)の値をわたしているので、D1セル(1,5)に値を
設定したいのですが、うまくいきません。

「1つ以上の循環参照が発生しています。循環参照とは、数式が直接的
または間接的に自身のセルを参照している状態を指します。これにより、
計算が正しく行われない可能性があります。
循環参照を削除または変更するか、数式を別セルに移動してください。」

が最初に表示されますが、その後、期待した結果になっていません。

何が起きていて、何がたりないのでしょうか。
よろしくお願いします。

■内容
ABCD
1111222あ =練習(C1,"-")
2333444い
3555666う
4777888え
5999000お

■関数
Function 練習(myTar As Range, word As String) As String

If Len(myTar) = 0 Then
練習 = ""
Exit Function
End If

On Error GoTo era

CurRow = myTar.Row
CurCol = myTar.Column
MsgBox CurRow & ":" & CurCol & ":" & Cells(CurRow, CurCol)
Cells(CruRow, CurCol + 1) = "a"

練習 = "○"

Exit Function

era:
練習 = "#VALUE!"
End Function

回答 (全2件)

  • 回答No.2

ベストアンサー率 67% (834/1231)

他カテゴリのカテゴリマスター
>つまり、C1セル(1,4)の値をわたしているので、
>D1セル(1,5)に値を設定したいのですが、
(1,4)は(1,3)、(1,5)は(1,4)の間違いでしょうか。

また、質問の■内容が区切りが無く、よく分かりませんが、添付図の状態を想定しました。

>何が起きていて、何がたりないのでしょうか。
問題点1
 関数(当然、ユーザー定義関数も)は演算結果を自身に返すもので、「基本的には」他セルにその影響(値の代入)を与えません。
また、提示のコードは、「word」が未使用で、一部の抜粋でしょうか。
行ないたいことは、第一引数の内容によって、自身のセルと、右隣りのセルに、「○」と「a」を表示したいと読めます。
この中の「Cells(CruRow, CurCol + 1) = "a"」 が右隣りのセルを操作しており、できないことです。しかも、CruRowはスペルミスです。0行目で右の列を指定しています。行・列ともできない指定です。

しかし、最初に「基本的には」と書いています。できないことでもないです。
 1.下のユーザー定義関数を作ります。不必要な箇所は削りました。
   提示のコードと同じ動きのはずです。
 2.コードを入力したら、シートに戻り、セルD1:E1を選択し、
   「=練習2(C1,"-")」と入力し、Ctrl+Shift+Enterとします。
   ユーザー定義関数を配列数式にしています。数式バーの
   算式が「{ }」で囲まれています。

Function 練習2(myTar As Range, word As String) As Variant
 Dim Ans(1) As Variant '// 返り値
 Ans(0) = "": Ans(1) = ""
 If Len(myTar.Text) = 0 Then 練習2 = Ans: Exit Function

 On Error GoTo era

 Ans(0) = "○"
 Ans(1) = "a"
 練習2 = Ans
 
 Exit Function
era:
 練習2 = "#VALUE!"
End Function


問題点2
 上記のように隣のセルにも出力できたとして、2つのセルは「セルの結合」よりも強く結びつけられています。操作性はものすごく悪くなります。
このようにできるのは知っていますが、使ったことはありません。
セルD1、セルE1に個別のユーザー定義関数を書くべきです。


問題点3
 最初に気が付いたのですが、変数の宣言がされていません。「練習」という関数名から想像すると、VBAの習得中でしょうか。
VBE画面で、ツール>オプション>編集タブの「変数の宣言を強制する」をチェックすべきです。コードウインドウの先頭に「Option Explicit」が表示され、変数を使うには「Dim宣言など」が必要になります。色々開発効率が上がります。
提示のコードでは、CurRow、CurColが宣言なしで使われており、CruRowはスペルミスです。宣言を強制しておけば、このようなことをVBEが教えてくれます。

当方、Win10、Excel2010です。ご参考に。
  • 回答No.1

ベストアンサー率 54% (593/1087)

[技術者向] コンピューター カテゴリマスター
ユーザー定義関数で他のセルに結果を表示することはできません。
お礼コメント
abc999xyz

お礼率 80% (106/131)

できないんですね。
ありがとうございます。
投稿日時:2019/11/07 12:47
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ