VBA初心者必見!ユーザー定義関数の使用方法とエラー対策

このQ&Aのポイント
  • VBA初心者の方でもわかりやすく解説します!ユーザー定義関数の基本的な使い方からエラーの対処法までを紹介します。Excelでの使用例を交えて解説するので、具体的なイメージが湧きやすいです。まずは正常な実行例からスムーズにエラーが出る例への変更方法を解説します。詳しくは記事をご覧ください!
  • ユーザー定義関数を利用している際にエラーが発生する場合、画像の変更によってエラーが発生することがあります。具体的なエラーの内容や発生原因について詳しく解説します。エラーを解消するための対処法を紹介するので、参考にしてください。
  • ユーザー定義関数の引数や処理内容に注意しながら、画像の変更時に#エラーが発生しないようにする方法について解説します。具体的な修正方法や注意点を紹介するので、初心者の方でも理解しやすいです。エラーが発生しないようにすると、スムーズなプログラムの実行が可能です。
回答を見る
  • ベストアンサー

ユーザー定義関数について

ユーザー定義関数について VBA初心者です。画像1は正常、画像2に変更したときに空白レコードに#エラーが出るようになってしまいました。変更点は、ByVal gと(1)削除したのですが、どのような式を入れれば良いのでしょうか。宜しくお願い致します。 画像1: (正常です) link(T_photo!photo1,T_photo!folder1,T_photo!folder2,T_photo!folder3,T_photo!year,T_tag!domain,T_photo!folder4) Public Function link _ (ByVal a, ByVal b, ByVal c, ByVal d, ByVal e, ByVal f As String, ByVal g) As String link = IIf(Trim("" & a) = "", "", _     (1) IIf(Trim("" & b & c & d & e & a) = "", "", "" & f) & _ IIf(Trim("" & b) = "", "", "" & b & "/") & _ IIf(Trim("" & c) = "", "", "" & c & "/") & _ IIf(Trim("" & d) = "", "", "" & d & "/") & _ IIf(Trim("" & e) = "", "", "" & e & "-link/") & _ IIf(Trim("" & a) = "", "", "" & g & "-" & a)) 画像2: (#エラー) link_ec(T_photo!photo1,T_photo!folder1,T_photo!folder2,T_photo!folder3,T_photo!year,T_photo!folder4) Public Function link_ec _ (ByVal a, ByVal b, ByVal c, ByVal d, ByVal e, ByVal f As String) As String link_ec = IIf(Trim("" & a) = "", "", _ IIf(Trim("" & b) = "", "", "" & b & "/") & _ IIf(Trim("" & c) = "", "", "" & c & "/") & _ IIf(Trim("" & d) = "", "", "" & d & "/") & _ IIf(Trim("" & e) = "", "", "" & e & "-link/") & _ IIf(Trim("" & a) = "", "", "" & f & "-" & a))

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

  • ベストアンサー
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

>空白レコードに#エラーが出るようになってしまいました。 エラーになるのは空白レコードのときだけなんでしょうか? もし、すべてのデータでエラーになるのなら、 link_ecのパラメータのfの型宣言が影響しているのではないですか。 T_photo!folder4の型はどうなっていますか?

ta_003
質問者

お礼

ご回答有難うございました。 型を再度確認したらAs Stringが多かったです。 現状 Public Function link_ec _ (ByVal a, ByVal b, ByVal c, ByVal d, ByVal e, ByVal f As String) As String 正解 Public Function link_ec_ (ByVal a, ByVal b, ByVal c, ByVal d, ByVal e, ByVal f) As String とても助かりました。有難うございました。今後とも宜しくお願い致します。

関連するQ&A

  • accessのユーザー定義関数記述について

    VBAでユーザー定義関数を記述しようと思って勉強中です。 以前、アドバイスして頂きすばらしい関数式で合計8フィールドに入力後、 同一クエリ上で再度結合して1つのフィールドにまとめることが出来ました。 そして最後にもう1つクエリでファイルを作成しCSVファイル出力です。 目的は、文字列とtag(htmlタグ)と組合わせて1つのHTMLテキストにしようとして下ります。 そこでまた問題が発生いたしました。 1つのフィールドが1024文字のため分割して結合しておりましたが、クエリとクエリとクエリの3段階のため 「クエリが複雑すぎます」 というエラーが出ててしまいました。 VBAのユーザー定義関数に変換しなければならないのですが、かなり複雑になってきました。一体どのような記述になるのでしょうか。 大変お手数をお掛けいたしますが、よろしければアドバイスお願いいたします。 最終目的 block1 + block2 + block3 + block4 + block5 + block6+ block7+ block8を連結して html文を作成するためVBAでユーザー関数定義で保存したいのです。 クエリ関数整理後の今回の連結 フィールド名 block3 & block4 & block5 & 以後省略 IIF(TRIM("" & [A] & [B] & [C])="","",[T_shop]![tg6])& MID(IIF(TRIM("" & [A] & [B] & [C])="","<BR><BR>","")& IIF(TRIM("" & [A])="","","<BR><BR>" & [A])& IIF(TRIM("" & [B])="","","<BR><BR>" & [B])& IIF(TRIM("" & [C])="","","<BR><BR>" & [C])& IIF(TRIM("" & [A] & [B] & [C])="","","</FONT>"),9) & IIF(TRIM("" & [D] & [E] & [F])="","",[T_shop]![tg7])& MID(IIF(TRIM("" & [D] & [E] & [F])="","<BR><BR>","")& IIF(TRIM("" & [D])="","","<BR><BR>" & [D])& IIF(TRIM("" & [E])="","","<BR><BR>" & [E])& IIF(TRIM("" & [F])="","","<BR><BR>" & [F])& IIF(TRIM("" & [D] & [E] & [F])="","","</FONT>"),9) & IIF(TRIM("" & [G] & [H] & [I])="","",[T_shop]![tg8])& MID(IIF(TRIM("" & [G] & [H] & [I])="","<BR><BR>","")& IIF(TRIM("" & [G])="","","<BR><BR>" & [G])& IIF(TRIM("" & [H])="","","<BR><BR>" & [H])& IIF(TRIM("" & [I])="","","<BR><BR>" & [I])& IIF(TRIM("" & [G] & [H] & [I])="","","</FONT>"),9)

  • フィールド数をあと1個増やしたいのですが。。。

    フィールド数をあと1個増やしたいのですが。。。 初心者ですが、宜しくお願い致します。環境は、Access2002 Windows XP です。 13テーブルよりクエリを作成中なのです。保存の時に  定義されているフィールドが多すぎます というメッセージが出ます。 目的は、CSVに出力してファイルを作成することです。 現状は、52フィールドあと1つ ●カテゴリーID● というフィールドを増やし 保存できれば完成なのですが・・・・ Accessでのフィールド数の上限は255フィールドとなっていると思うのですが 変更の仕方が解りません。SQLも解らないので宜しくお願い致します。 SELECT T_ec_no.商品ID, T_ec_no.規格ID, T_ec_no.規格名1, T_ec_no.規格名2, IIf(Trim("" & T_price!stock_number)="","" & "未出品","") & Mid(IIf(Trim("" & T_maker!maker1)="",""," " & T_maker!maker1) & IIf(Trim("" & T_maker!maker2)="","","" & " " & T_maker!maker2) & IIf(Trim("" & T_price!stock_number)="","","" & " " & T_price!stock_number) & IIf(Trim("" & T_price!item_brandname)="",""," " & T_price!item_brandname) & IIf(Trim("" & T_price!item_name)="",""," " & T_price!item_name) & IIf(Trim("" & T_price!path_2)="",""," " & T_price!path_2) & IIf(Trim("" & T_material!color1)="",""," " & T_material!color1) & IIf(Trim("" & T_original!made)="",""," " & T_original!made) & IIf(Trim("" & T_original!capacity)="",""," " & T_original!capacity) & IIf(Trim("" & T_material!weight1)="",""," " & T_material!weight1) & IIf(Trim("" & T_delivery!postage7)="",""," " & T_delivery!postage7),2) AS 商品名, IIf(Trim("" & T_category!sold)="",1,0) AS 公開フラグ, T_ec_point.商品ステータス, IIf(Trim("" & T_price!fixed_price)="",""," " & T_price!fixed_price) AS 通常価格, IIf(Trim("" & T_price!開始価格)="",""," " & T_price!開始価格) AS 販売価格, T_ec_point.在庫数, [T_delivery!ec送料] AS 送料, T_ec_point.ポイント付与率, T_ec_point.購入制限, T_maker.url, Trim(StrConv(LeftB(StrConv(Mid(IIf(Trim(" " & T_maker!maker1)="","","" & T_maker!maker1 & ",") & IIf(Trim(" " & T_maker!maker2)="","","" & T_maker!maker2 & ",") & IIf(Trim(" " & T_price!path_1)="","","" & T_price!path_1 & ",") & IIf(Trim(" " & T_price!path_2)="","","" & T_price!path_2 & ",") & IIf(Trim(" " & T_price!stock_number)="","","" & T_price!stock_number & ",") & IIf(Trim(" " & T_price!item_brandname)="","","" & T_price!item_brandname & ",") & IIf(Trim(" " & T_price!item_name)="","","" & T_price!item_name & ",") & IIf(

  • VB2005での関数への配列の参照渡しの方法

    Visual Basic 2005で、 =============================================================== Function func(ByVal a As Integer, ByRef b() As Integer) As Integer  a += 1 : b(0) = 1 : b(1) = 2 : b(2) = 3 Return 0 End Function ============================================================== という関数があったとしてメインのプロシージャに ================================================================ Dim c As Integer Dim d As Integer Dim e() As Integer = Array.CreateInstance(GetType(Integer), 10) d=7 c = func(d, e) ================================================================ と書き入れると結果はd=7(∵値渡し)、e(0)=1,e(1)=0,e(2)=0(∵参照渡し)となってしまうと思います。 e(0)=1,e(1)=2,e(2)=3としたい場合はどのように記述すればよいのでしょうか?

  • 配列を返すVBAユーザー定義関数の書き方

    VBAで、商と余りを返す整数割算のユーザー定義関数を書こうとしています。セルA1に割られる数、B1に割る数が書いてあり、C1とD1に「=xdiv("A1:B1")」をCtrl+Shift+Enterで入力します。C1に商、D1に余りを返すようにしたいと思ってます。 以下のように書いてみたのですが、戻り値の書き方がどうもよくわかりません… Function xdiv(ByRef d() As Integer) As Integer   ............. End Function よろしくお願いします。

  • コードの簡略化 VBA

    dim a as string dim b as string dim c as string dim d as string dim e as string dim f as string dim g as string dim h as string dim i as string a = "○○" b = "○○" c = "○○" d = "○○" e = "○○" f = "○○" g = "○○" h = "○○" i = "○○" 上記のような形でたくさん宣言しているのですが、 実際はもっとあり、これだととても長いコードになってしまいます(・・;) なんとか簡略化したいとは考えたのですがよい方法が見つからず 皆さんよろしくお願いいたします_(_^_)_

  • Accessのクエリで複数カラムの最大値表示

    Accessのクエリで複数カラムの中から最大のカラムデータを表示させる方法をお教えください。 テーブル名:TBL カラムA,B,Cがあっていずれも整数です。 カラムA,B,Cの最大のデータを表示したいのです。 データの例 A B C 10 14 12 → 14 21 18 19 → 21 15 11 17 → 17 このときSQL文でいえば次のようにすればできるのでしょうが、IF関数2回使わないで一発で最大値を表示させられないでしょうか。 Select iif(A>=B,A,B) as D, iif(D>=C,D,C) as E from TBL; Select Max(A,B,C) as D from TBL; のようなのがないでしょうか?

  • 配列から指定した値を取得する関数

    $itemから["a"]の値だけを取り出した配列を呼び出す関数を作成したいのですが、この様な配列の場合はどうしたら良いのでしょうか? $item var_dump( $item ); array(1) { [0]=> object(data)#1 (5) { ["a"]=> int(1) ["b"]=> string(1) "2" ["c"]=> string(7) "string1" ["d"]=> string(7) "string2" ["e"]=> string(8) "keyword1" } [1]=> object(data)#2 (5) { ["a"]=> int(3) ["b"]=> string(1) "4" ["c"]=> string(7) "string3" ["d"]=> string(7) "string4" ["e"]=> string(8) "keyword2" } }

    • ベストアンサー
    • PHP
  • エクセルの関数で2つの条件に合うものを探す。

    エクセルの関数で下記のことをしたいのです。 表(1) T>=0.6  0.6>T>=0.3  0.3>T>=0.15 U<2   A     B       C 2<=U<3  B     B-C     D 3<=U<4  C      C      D 4<=U<6  D     C-D     D 6<=U    E      D      D 別の表(2)に U   T         1.5  0.3         0.9  0.8             5.9  0.13         ・   ・         ・   ・ とあります。 そのためUの値とTの値で表(1)のAからE値を抽出し別の表にAからEを表示したいのです。エクセルの関数(IF,AND,LOOKUP等)を試してみたのですがうまくいきません。できるだけエクセルの関数のみで、よい方法があれば教えてください。よろしくおねがいします。     

  • 正規分布に関連する関数にNormDist(VisualBasic)というのがありますが、

    NormDensと言う関数はいったいどんな関数なのでしょう? ご存知の方ヒントをお願いします。 現在、金融関係の会社で金融派生商品オプションのプライスを計算するブラックショールズ式(人が作ったエクセルマクロを解析)に奮闘しています。 その中のガンマ(現物の価格変化に対するデルタの変化率)を求める式にNormDensという関数が出現していてそれが何だかわからないでいます。本に書いてあるガンマの式と若干違うし関数がVisualBasicのリファレンスにでてきません。 ちなみに内容は、 Public Function Value_BS( _ ByVal ValueType As Integer, _ ByVal IsCall As Integer, _ 'call:1 put:-1 ByVal T As Double, _ '残存年数 ByVal r As Double, _ '金利 ByVal d As Double, _ '配当 ByVal S As Double, _ '現物株価 ByVal k As Double, _ '行使価格 ByVal V As Double 'ボラティリティ ) As Double Dim A1 As Double, A2 As Double, d2 As Double d2 = Log(d / S + 1) / T A1 = (Log(S / k) + (r - d2 + V * V / 2) * ) / V / (T ^ 0.5) A2 = A1 - V * (T ^ 0.5) Select Case ValueType Case 0 '*** <PL> *** Value_BS = IsCall * S * Exp(-d2 * T) * NormDist(IsCall * A1) - IsCall * k * Exp(-r * T) * NormDist(IsCall * A2) Case 1 '*** <DELTA> *** Value_BS = IsCall * Exp(-d2 * T) * NormDist(IsCall * A1) Case 2 '*** <GAMMA> *** Value_BS = Exp(-d2 * T) / (S * V * (T ^ 0.5)) * NormDens(IsCall * A1) ・・・とこんな感じです。

  • ユーザ定義関数がうまく動きません。

    ユーザ定義関数がうまく動きません。 2月のA1セル値が1になっていたりします。 どこがおかしいのかわかりません。解決方法を教えていただけませんでしょうか。 よろしくお願いします。 【シートの設定】 シート名は1月・・・12月です。 各シートの A1セルは「=sheetname()」 B1セルは「月のチェックシート」 が入っています。 【VBAの設定】 Function SheetName() As String 'Application.Volatile If Len(ActiveSheet.Name) = 3 Then SheetName = Left(ActiveSheet.Name, 2) Else SheetName = Left(ActiveSheet.Name, 1) End If End Function