Access 2013環境でVBAを使用してFunctionの使い方が分からない

このQ&Aのポイント
  • Access 2013環境でVBAを使用してFunctionの使い方が分からず困っています。
  • 二つのテキストボックスに入力された文字を組み合わせて文字列を生成するプロシージャを作成していますが、うまく行きません。
  • 現在のコードはSelect Case文が長くなり、複数のボタンに同じコードが記述されているため、Accessの起動が遅くなっています。Functionを使用してコードを短縮し、モジュールから呼び出す方法を知りたいです。
回答を見る
  • ベストアンサー

Functionの使い方が分かりません。

ACCESS 2013環境でVBAを使用しています。 プログラムが長い上、使用する箇所が多くて困っています。 Functionで、使いたい時だけ呼び出したいのですが うまく行きません。 二つのテキストボックスに入力された、文字を組み合わせて 文字列を生成するプロシージャを作成しています。  txt1の値が、岡山  txt2の値が、オカヤマ の時 先頭の文字列が ア行、続きは _岡山 となるよう AscW関数で文字コードで一度抽出し, select文で判別しています。 コードは --------------------------------------------- Private Sub コマンド1_Click() Dim kanji As String Dim katakana As Integer Dim sento As String Dim hensuu As String kanji = Me.txt1 katakana = AscW(Left(Me.txt2,1)) Select Case katakana Case 12450 To 12458 sento = "ア行" Case 12459 To 12468 sento = "カ行" ~(中略)~    Case Else End Select hensuu = sento & "_" & kanji MsgBox hensuu End Sub --------------------------------------------- となっています。 Select Case文が長いのと、複数のフォーム上で実行させるボタンごとに 同じコードを記述していて、最近Accessの起動が遅くなってきました。 Select文をFunctionから呼び出し、最終的にはモジュールから呼び出しに 書き換えたいのですが、書き方が良く分かりません。 試したコード --------------------------------------------- Function moji(ByRef katakana As Integer,sento As String) Select Case katakana Case 12450 To 12458 sento = "ア行" Case 12459 To 12468 sento = "カ行" ~(中略)~    Case Else End Select End Function Private Sub コマンド1_Click() Dim kanji As String Dim katakana As Integer Dim sento As String Dim hensuu As String kanji = Me.txt1 katakana = AscW(Left(Me.txt2,1)) sento = moji(katakana) hensuu = sento & "_" & kanji MsgBox hensuu End Sub --------------------------------------------- 多分、大きく間違っているのではないかと思うのですが どのように修正したらよいでしょうか

  • jjj22
  • お礼率58% (17/29)

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

  • ベストアンサー
  • ap_2
  • ベストアンサー率64% (70/109)
回答No.1

戻り値かえしてないんじゃないかな その"関数名"に代入する形で、値を返します。 Function moji()  '~処理~  moji = "結果" '←戻り値 End function 一応、Subでも引数に代入することで値を返すことはできますが、Functionなら式に組み込めます。違いはそのくらい。

jjj22
質問者

お礼

呼び出しを Function moji(ByRef katakana As Integer) As String 戻り値を moji = sento ボタンの動作を sento = moji(katakana) に変えたら動きました。 ありがとうございました。

jjj22
質問者

補足

書き換えましたが上手くいきません。 以下、型が一致しません。 Function moji() Dim katakana As Integer Dim sento As String Select Case katakana Case 12450 To 12458 sento = "ア行" Case 12459 To 12468 sento = "カ行" Case Else End Select moji = sento End Function Private Sub コマンド1_Click() Dim kanji As String Dim katakana As String Dim sento As String Dim hensuu As String kanji = Me.txt1 katakana = AscW(Left(Me.txt2, 1)) → sento = moji(katakana) hensuu = sento & "_" & kanji MsgBox hensuu End Sub → sento = moji(katakana)   sento = moji()にすると、因数を要求されます。 他に試したところ、ボタンクリック後、MSGボックスが反応しなかったり Functionの計算部分がスキップ?されています。 どうしたらよいでしょうか。

その他の回答 (2)

回答No.3

If Then - Else文、Select Case文は次のように論理式に置き換えることもできます。 Public Function GetKanaRow(ByVal S As String) As String   Dim N As Integer      N = (S Like "[ア-オ]*") * 1   N = N + (S Like "[カ-ゴ]*") * 2   N = N + (S Like "[サ-ゾ]*") * 3   N = N + (S Like "[タ-ド]*") * 4   N = N + (S Like "[ナ-ノ]*") * 5   N = N + (S Like "[ハ-ポ]*") * 6   N = N + (S Like "[マ-モ]*") * 7   N = N + (S Like "[ヤ-ヨ]*") * 8   N = N + (S Like "[ラ-ロ]*") * 9   N = N + (S Like "ワ*") * 10        GetKanaRow = Mid(Chr(0) & "アカサタナハマヤラワ", Abs(N) + 1, 1) End Function 【お願い】Like文の対応は確認されて下さい!

回答No.2

日本語で先頭の一文字目が拗音、促音、撥音は無いでしょうから hatena さんの http://hatenachips.blog34.fc2.com/blog-entry-262.html でオッケーかと思います。 ※旧仮名遣いの「ゐゑ」がちと心配。

jjj22
質問者

補足

「ゐ、ゑ」は無いのですが、拗音、促音、撥音には対応する形を取っています。 例えば後藤さん→カ行_後藤、パトリック→ハ行_パトリックなど。 問題になっているところなんですが、戻り値の設定の仕方が分かりません。 いろいろな事例がネットに出ているのですが、どのように使っているのか 理解が追いつかないのです。

関連するQ&A

  • VBAでFunctionの使い方

    エクセルのVBAでFunctionの使い方がいまいちよくわかりません。 Function msg() Dim h As Integer h = Hour(Time) Select Case h Case Is < 12: msg = "おはようございます。" Case Is < 17: msg = "こんにちは。" Case Else: msg = "こんばんは。" End Select End Function Sub 挨拶() MsgBox msg End Sub とやってみたら一応正しく動くようですが、これであっているのでしょうか? 他の例などを見るとFunction msg()の()内にも何か入れなければならないようなのですが、わかりません。

  • エクセルVBAのFunction簡素化したいのです・・・。

    時間により挨拶の内容を変えるCODEを作りました。一応、当初の目的どおりのは答えを返すのですが、時間と分で2つFunctionが出来てしまいます・・・・。 あと、もっとスマートなやり方はないものかと質問させていただきました。 くだらないと思われそうですがなにとぞよろしくお願いします。 Sub 挨拶test() MsgBox hmsg(Time) & Chr(10) & messe(Time), , "*・゜゜・*:.。. .。.:*・゜゜・*" End Sub Function messe(t) As String t2 = Hour(t) t3 = Hour(TimeValue(t) + TimeValue("01:00")) m = Minute(t) Select Case m Case Is < 15: messe = t2 & "時を回りましたね。 。(^o^)/" Case Is < 30: messe = "もうすぐ" & t2 & "時半になりますね。 (〃^∇^〃) " Case Is < 45: messe = t2 & "時半を過ぎてますね。 (=´▽`)ゞ" Case Else: messe = "もうすぐ" & t3 & "時になるんですね。(^∇^)" End Select End Function Function hmsg(t) As String Select Case Hour(t) Case Is <= 11: hmsg = "おはようございます。" Case Is < 17: hmsg = "こんにちは。" Case Else: hmsg = "こんばんは。" End Select hmsg = UCase(Environ("UserName")) & "さん、" & hmsg End Function

  • エクセルVBAのFunctionについて

    エクセル2000です。 以下は、時間を与えれば、それに相当する挨拶が返ってくるFunctionのつもりです。 一応期待通りの働きはしてくれます。 質問は、Functionから ”messe” として返ってくる文字列を、Function内部で生成している、”hmsg”、”mes”、”s”、”kao(i)” にわけて取得できないかということです。 もちろん Functionを複数つくったり、返ってくる文字列”messe”を、”。”の位置を取得してMID関数等で分ければ取得できるのはわかるのですが、そんな手間をかけず、たとえば、MsgBox hmsg のような感じで簡単に ”hmsg”、”mes”、”s”、”kao(i)” それぞれの文字列を取得する方法があったらご教示くださいませ。 Sub test01() MsgBox messe(TimeValue("17:46")) End Sub Function messe(t As Date) As String Dim t2 As Integer, t3 As Integer, m As Integer, i As Integer, n As Integer Dim kao Dim s As String t2 = Hour(t) t3 = Hour(TimeValue(t) + TimeValue("01:00")) m = Minute(t) kao = Split("o(^o^)/,(*^o^*),(*´∇`*),(= ̄▽ ̄=)V,(〃^∇^〃),(=´▽`)ゞ,(^∇^),(〃^∇^)o,ヾ(@⌒ー⌒@)ノ, (#^。^#),o(^-^)o,ヾ(=^▽^=)ノ, \(*^▽^*)/ ,( ̄ー ̄)v", ",") Select Case t2 Case Is < 11: hmsg = "おはようございます。" Case Is < 17: hmsg = "こんにちは。" Case Else: hmsg = "こんばんは。" End Select Select Case m Case Is < 15: mes = t2 & "時を回りましたね。 " Case Is < 30: mes = "もうすぐ " & t2 & "時半になりますね。 " Case Is < 45: mes = t2 & "時半を過ぎてますね。" Case Else: mes = "もうすぐ " & t3 & "時になるんですね。 " End Select Select Case t2 Case 0: s = "とうとう日付が変わりました。 " Case 1, 2, 3, 4: s = "からだに気をつけてね。 " Case 5, 6: s = "朝になっちゃいました。 " Case 7, 8, 9: s = "また一日が始まりましたね。 " Case 10: s = "お昼にはまだもうちょっと・・・。 " Case 11: s = "おなかが空いちゃいました。 " Case 12: s = "お昼ですよ~。 " Case 13: s = "食後は眠くなっちゃいます。 " Case 14: s = "そろそろおやつが欲しいかも。 " Case 15, 16: s = "午後は長いですね。 " Case 17: s = "お疲れさまです。 " Case 18: s = "残業、お疲れさまです。 " Case 19, 20: s = "そろそろ切り上げませんか。 " Case 21, 22: s = "こんな遅くまで大変ですね。 " Case 23: s = "日付が変わっちゃいますよ。 " Case Else: s = "がんばってね。 " End Select Randomize i = Int(Rnd() * 14) messe = hmsg & mes & s & kao(i) End Function

  • ファンクションキーで命令を実行させたい

    よろしくお願いします。 ACCESS2000を使用しています。 ファンクションキーで命令を実行したく、下記のコマンドを書いて実行しましたが動作しません。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Me.メインsub.Form.SetFocus Select Case KeyCode Case vbKeyF5 Me.btn帰社.SetFocus Call btn帰社_Click Case Else KeyCode = 0 End Select End Sub Private Sub Form_Load() Me.KeyPreview = True End Sub フォームプロパティのキーボードイベント取得は「はい」で設定してあります。 2週間位、いろいろやってみましたがうまくいきません。はまっています。回答・ヒントをよろしくお願いします。

  • VBA 関数(Function) カッコの後のデータ型は必要?

    Function あ() あ = "あああ" End Function Sub test3() MsgBox あ End Sub と、 Function あ() As String あ = "あああ" End Function Sub test3() MsgBox あ End Sub は同じ動作をするのですがやはり「As String」をつけたほうがいいのですか? ウォッチウインドウで確認すると 「As String」がないほうは「Variant/ String」型ですが あるほうは「String」型のみです。

  • VBA Functionプロシージャで複数の値を

    エクセルでVBAのFunctionプロシージャについて複数の値を戻り値として 受け取る方法を考えています。 下記のようなサンプルプログラムを作りました。 --------------------------------------------------------------------------------- Option Explicit Private Sub CommandButton1_Click() Dim kekka(3) As Double Dim txt As String txt = "12.12A,34.34B,56.56C,78.78D" kekka(0) = test(txt) End Sub Public Function test(ByVal text As String) As Double Dim txt_kakou(3) As String '## 渡された「txt = "12.12A,34.34B,56.56C,78.78D"」を加工し、数値のみを取り出し '## 下記のように配列txt_kakou(3)に振り分ける '## 加工方法は割愛 txt_kakou(0) = 12.12 txt_kakou(1) = 34.34 txt_kakou(2) = 56.56 txt_kakou(3) = 78.78 'string型からdouble型に変換する。 txt_kakou(0) = CDbl(txt_kakou(0)) txt_kakou(1) = CDbl(txt_kakou(1)) txt_kakou(2) = CDbl(txt_kakou(2)) txt_kakou(3) = CDbl(txt_kakou(3)) test = txt_kakou() End Function ----------------------------------------------------------------------------------- まず、呼び出し側のプロシージャでkekka(3)という配列を宣言します。 次に変数txtに「"12.12A,34.34B,56.56C,78.78D"」の文字列を代入します。 そして変数txtをFunctionプロシージャに投げます。 Functionプロシージャでは、受け取った「"12.12A,34.34B,56.56C,78.78D"」 を数値のみに分解し、4つの変数に代入します。 この4つの変数も配列で用意し、txt_kakou(3)とします。 このtxt_kakou(3)を呼び出し元に返し、呼び出しもとの変数kekka(3)に入れたいのです。 また、はじめ変数txtに代入される値は文字列ですが、この文字列をFunctionプロシージャで分解し、 分解した値は、最終的には数値として扱いたいので、途中でdouble型に変換しています。 これを実行すると、Functionプロシージャの最後のtest = txt_kakou()で、型が一致しません といわれてしまいます。 どのように書き直せばいいのでしょうか。 よろしくお願いします。

  • Functionでの戻り値のとり方

    こんばんわ。 以下のように、Functionで引数に配列を指定して、戻り値も配列で取得したいのですが、方法としては以下のようにしかできないのでしょうか? ------------------------- '配列を宣言 dim Ary() as string dim AryRet() as string '戻り値の配列 Call Get_Ary(Ary(),AryRet()) ------------------------- Function Get_Ary(Ary() as string , AryRet() as string) 'Ary()を参照して、AryRet()を取得する End Function という風に書いているのですが、Functionのところを以下のように 書くのは無理でしょうか? うまく取れないというのはやっぱ無理なのかな・・ ------------------------- '配列を宣言 dim Ary() as string dim AryRet() as string '戻り値の配列 AryRet() = Get_Ary(Ary()) Function Get_Ary(Ary() as string) As string 'Ary()を参照して、AryRet()を取得する 'それを関数の戻り値とする Get_Ary = AryRet(index) End Function このように書くと、配列の最後のインデックスの値だけ取れてしまう ようなんですが、、やっぱ配列で返すというのは上記のやり方でないと 無理なのでしょうか? 詳しい方ご教示願います。

  • VBAでプロシージャ間のデータを渡したい

    VBAでプロシージャ間のデータを渡したい main関数の中でget_Recordという関数を呼んでいます。この中でアクセスの テーブルからデータを取得して、「this_Hensuu」という変数に格納します。 やりたいことは、get_Recordで取得した変数をmain関数の中で利用したいです。 main()関数外で変数を宣言してグローバル変数とすれば解決するのは わかりますが、その他の方法でmain関数に値を渡すことは可能でしょうか? Sub main() Dim x = 10 Call get_Record(x) ... ... end sub Sub get_Record(Byref x As Integer) Dim rs As Dao.recordset Dim this_Hensuu As String Dim this_Hensuu2 As String get_SQL As String get_SQL ="" get_SQL="Select * from TABLE1 where ID='" & x & "'" rs = Openrecordset(get_SQL,opendynaset) this_Hensuu = rs!名前 this_Hensuu = rs!名前2 end sub

  • select case 大文字小文字を区別しないよ

    select case 大文字小文字を区別しないようにするには? Sub test01() Dim str As String str = "A" Select Case str Case "a" MsgBox "aです" Case "A" MsgBox "aです" End Select End Sub これだと、半角全角がヒットしないのはなんとなくしょうがないかな、と思うのですが 大文字小文字がちがくてもヒットさせるにはどうすればいいですか? Sub test01() Dim str As String str = "A" Select Case str Case "a", "A" MsgBox "aです" End Select End Sub とするしかないでしょうか? 大文字小文字区別なく評価する方法があれば教えてください。よろしくお願いします。

  • Word VBA テキストボックスのフォントサイズ

    Wordでマクロを組んでいます。 文書内から取得した値を変数へ格納し、複数の変数をつないでテキストボックスに入れ、文書へ追加しています。 このテキストボックスの文字のフォントサイズを前と後ろで変えたいのですが、色々試していますがうまくいきません。 お分かりになる方がいらっしゃいましたら教えてください! 以下コードです。 下記の「EIJI」のみフォントサイズを20ptにしたいのです。 変数に格納する文字列は都度変化し、文字数も変わります。 よろしくお願いします! Sub try() Dim KANA As String, KATAKANA As String, EIJI As String KANA = "あああ" KATAKANA = "アアア" EIJI = "AAA" Dim myTxt As String myTxt = KANA & "/" & KATAKANA & "/" & EIJI Dim objTextBox As Object Set objTextBox = ActiveDocument.Shapes.AddTextbox(msoTextOrientationHorizontal, 25, 20, 530, 25) objTextBox.Select With Selection .Font.Size = 16 .TypeText Text:=myTxt End With End Sub