VBAのFunctionでCells.Valueに値が入力されない問題について

このQ&Aのポイント
  • VBAのFunctionで定義したCells(i, "○").Valueに値が入力されません。iのカウントアップまでは正常に行われています。
  • このFunctionはExcel上で関数で「=Order_Buy(1111,テスト)」のようにして呼び出しています。ちなみにSubで定義して単体で実行すると該当セルに値が入力されました。
  • 何が問題か、ご教授いただけないでしょうか
回答を見る
  • ベストアンサー

【VBA】Function内のValueについて

VBAについて教えてください。 以下のFunctionで定義したCells(i, "○").Valueに値が入力されません。 iのカウントアップまでは正常に行われています。 このFunctionはExcel上で関数で「=Order_Buy(1111,テスト)」のようにして呼び出しています。 ちなみにSubで定義して単体で実行すると該当セルに値が入力されました。 何が問題か、ご教授いただけないでしょうか Public Function Order_Buy(ByVal code As String, ByVal meigara As String) As String Dim i As Integer i = 3 Do Until Cells(i, "M") = "" i = i + 1 Loop Cells(i, "M").Value = Now Cells(i, "N").Value = code Cells(i, "O").Value = meigara Order_Buy = "test" End Function

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

  • ベストアンサー
  • SI299792
  • ベストアンサー率48% (715/1481)
回答No.1

Excel のユーザー定義関数の制限で、セルから呼び出した場合、セルの値の変更はできません。 別の手段を考えるしかないですね。

参考URL:
https://support.microsoft.com/ja-jp/help/170787/description-of-limitations-of-custom-functions-in-excel

関連するQ&A

  • マクロ Value=Valueで複写できない

    いつも回答して頂きありがとうございます。 たぶん基本的な質問だと思うのですが、どうしたら上手くいくのか分かりません。御指導の程よろしくお願いします。以下の記述でエラーがかかります。 『コンパイルエラー:SubまたはFunctionが定義されていません』 Worksheets("一覧").Cells(d, 5).Value = Wokrsheets("編集用一覧").Cells(e, 5).Value 記述全体 Sub TEST() Dim d As Integer Dim e As Integer Worksheets("一覧").Activate d = 3 e = 6 Do While Worksheets("一覧").Cells(d, 2).Value <> "" Worksheets("一覧").Cells(d, 5).Value = Wokrsheets("編集用一覧").Cells(e, 5).Value d = d + 1 e = e + 4 Loop End Sub

  • VBA(Excel2003)で文字列の切り出し

    下のプロシージャーで全角半角混じりの文字列を切り出し、別の文字列で結合しようと思いますがうまくいく場合といかない場合があります。 イミディエイト・ウィンドウ上とCell上で動作が違います。 Cell上でうまく表示させるにはどうしたらいいでしょうか? Sub Test() Dim myString(2) As String Dim i As Integer myString(0) = "airueo" myString(1) = "かきくけこ" myString(2) = "さシすせそ" For i = 0 To 2 Debug.Print MidMbcs(myString(i), 1, 5) & "...テスト" Cells(i + 1, 1).Value = MidMbcs(myString(i), 1, 5) & "...テスト" Next i End Sub Function LenMbcs(ByVal str As String) LenMbcs = LenB(StrConv(str, vbFromUnicode)) End Function Function MidMbcs(ByVal str As String, start, length) MidMbcs = StrConv(MidB(StrConv(str, vbFromUnicode), start, length), vbUnicode) End Function

  • VBA プロシージャで値を渡す方法

    エクセルVBAのプロシージャで値を渡す方法はどうしたらいいのでしょうか。 たとえば、下記のようなプログラムを書いたとします。 --------------------------------------------- Private Sub test_main() Dim drink As String Dim alcohol As String Call test(cola, beer) End Sub Public Sub test_module(ByVal drink As String, ByVal alcohol As String) Cells(1, 1).Value = drink Cells(2, 2).Value = alcohol End Sub --------------------------------------------- このプログラムはもちろん不完全です。試してみたら動きませんでした。 やりたいことは、メインのプロシージャ(test_main)から、test_moduleを 呼び出し、同時に「cola」と「beer」の値を渡します。呼び出された先で、 エクセルのワークシートのセルに値を入力します。 重複しますが、それぞれの値「cola」と「beer」は変数「drink」と「alcohol」に代入されます。 この変数をcell(1,1)とcell(2,2)に入力します。 ワークシート上のcell(1,1)には「cola」、cell(2,2)には「beer」 と入力されます。 変数は数値ではなく、文字列です。 ポイントは、変数「drink」と「alcohol」をどのプロシージャに宣言するのか また、変数に値「cola」と「beer」をのどプロシージャでどういうふうに代入するのか。 そして代入した変数をどうやって呼び出したいプロシージャに渡すのかです。 このようなことをするには、上記プログラムをどう書き換えたらよいのでしょうか。

  • エクセルVBAのFunctionプロシージャの質問

    エクセルのFunctionプロシージャを使って以下のユーザー定義関数を作りたいのですが上手くいきません。 アドバイスお願いしますm(__)m やりたいこと エクセルのA列とB列に複数の(たとえば10行の)数字が並んでいます。 各行ごとに 0.5×[A列の値]×[B列の値の二乗] を算出し、その合計を求めたいです。 別の列(例えばC列)を使って上記の計算式を入力し、その合計を求めればよいのですが どうしてもFunctionプロシージャを使って1セルだけを使って求めたいのです。 自分はVBA(エクセルマクロ)はあまり詳しくないのですが 色々ネットで調べた結果、以下のようなプロシージャを書いてみたのですが 上手く計算できません。 Function KE(element As Range) Dim e As Range Dim m() As Variant Dim v() As Variant Dim ans As Integer i = 0 j = 0 For Each e In element If i = j Then m(i) = e.Value i = i + 1 Else m(j) = e.Value j = j + 1 End If Next e k = i i = 0 j = 0 While i < k + 1 ans = ans + 0.5 * m(i) * v(i) * v(i) i = i + 1 Wend KE = ans End Function もちろん、この形に拘りません Functionプロシージャを使ってうまく計算できる方法ありましたらご教示お願いします。

  • Excel2003 VBA Functionの定数に関して教えて下さい

    Excel2003 VBA Functionの定数に関して教えて下さい。 例えば、 Function test(x, y) test = A * x + B * y + C End Function という数式を定義し、プログラム中で使用したいとします。 数式を見て分かる通り、xとyは変数でA, B, Cは定数です。 そして、これらA, B, Cの値を A = Cells(3,5) B = Cells(3,6) C = Cells(3,7) のようにシート上の値を使用したいのですが、 上記のようにプログラム中で宣言してもFunctionの中では値が入っていないものとみなされてしまいます。 この問題の回避のため、、 Function test(x, y) A = Cells(3,5) B = Cells(3,6) C = Cells(3,7) test = A * x + B * y + C End Function のようにFunctionの中に、定数を宣言を入れてしまうか、 Function test(x, y, A, B, C) test = A * x + B * y + C End Function のようにA, B, Cも定数ではなく、変数として扱う方法があります。 しかしながら、一つ目の方法では、こういったFunctionの数が増えてくると、 同じ定数を複数の場所で宣言することになり、後からプログラムを書き直そうとしたときに 極めて不便です。 一方で、2つめの方法では、test(x, y, A, B, C)のように、 一つのFunctionを呼び出すためにごちゃごちゃしてスペースをとり、 後から見たときに見にくくなります。 後、Constとして定義する方法もありますが、 A = Cells(3,5) のように、シート上のデータを代入する方法をとりたいと考えています。 上記以外の方法以外でもっとスマートな方法がありましたら 教えて頂けますでしょうか?

  • VBA ウィンドウの列挙 Win32 API

    http://d.hatena.ne.jp/cartooh/20090618 上記のページに記載されているVBAです。 動作は確認できたのですが、どのような処理の流れとなっているのかがわかりません。 どなたかコメントを付けていただけないでしょうか。 よろしくお願いいたします。 Option Explicit Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal cnm As String, ByVal cap As String) As Long Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, _ ByVal cch As Long) As Long Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, _ ByVal lParam As Long) As Long Declare Function IsWindow Lib "user32" (ByVal hWnd As Long) As Long Const INDENT_KEY = "INDENT" Public Function EnumChildWindowsProc(ByVal hWnd As Long, ByVal lParam As Object) As Long EnumChildWindowsProc = EnumWindowsProc(hWnd, lParam) End Function Public Function EnumWindowsProc(ByVal hWnd As Long, ByVal lParam As Object) As Long EnumWindowsProc = True If IsWindowVisible(hWnd) = 0 Then Exit Function End If Dim strClassName As String ' * 255 Dim strCaption As String ' * 255 strClassName = String(255, vbNullChar) strCaption = String(255, vbNullChar) GetWindowText hWnd, strCaption, Len(strCaption) GetClassName hWnd, strClassName, Len(strClassName) strCaption = RTrim(left(strCaption, InStr(1, strCaption, vbNullChar) - 1)) strClassName = RTrim(left(strClassName, InStr(1, strClassName, vbNullChar) - 1)) ActiveCell.Cells(1, 1).Value = Hex(hWnd) ActiveCell.Cells(1, 2).Value = IsWindowVisible(hWnd) ActiveCell.Cells(1, 3).Value = strCaption ActiveCell.Cells(1, 4).Value = strClassName ActiveCell.Cells(2, 2).Activate Dim c As Collection Set c = lParam Dim indent As Long indent = c(INDENT_KEY) c.Add String(indent * 2, " ") & Hex(hWnd) & " " & strCaption & " " & strClassName, before:=c.Count indent = indent + 1 c.Remove INDENT_KEY c.Add indent, INDENT_KEY Call EnumChildWindows(hWnd, AddressOf EnumChildWindowsProc, ObjPtr(c)) indent = c(INDENT_KEY) - 1 c.Remove INDENT_KEY c.Add indent, INDENT_KEY ActiveCell.Cells(1, 0).Activate End Function Sub hoge() Application.ScreenUpdating = False Dim sht As Worksheet Set sht = ThisWorkbook.Worksheets(1) sht.UsedRange.Clear sht.Activate sht.Range("A1").Activate Dim c As Collection Set c = New Collection c.Add 0, INDENT_KEY Dim ret As Long ret = EnumWindows(AddressOf EnumWindowsProc, ObjPtr(c)) c.Remove INDENT_KEY Set sht = ThisWorkbook.Worksheets(2) sht.UsedRange.Clear sht.Activate sht.Range("A1").Activate Dim o As Variant For Each o In c ActiveCell.Value = o ActiveCell.Cells(2, 1).Activate Next Application.ScreenUpdating = True End Sub

  • VBA SumIfについて教えてください。

    【やりたいこと】 A列が「犬」となっている行のB列数字を全て足してCの1行目に答えデータを入れる。   A   B  C   犬  200   猫  100   鳥  150   犬  130   犬  120   ・   ・   ・   ・   ・   ・   ・   ・ 上記の場合、A列が「犬」のB列数字200+130+120でC1には「450」と値が入る。 以下が書いてみたものですがエラーが出てしまいます。 何がいけないのでしょうか?ご教示頂ければ幸いです。 Sub monthResult() Dim ans As String 'ユーザフォームで「犬」という値を取得    i = 2    Do Until Worksheets("データ").Cells(i, 1).Value = ""       'データという名前のシートA列のデータが無くなるまで      Worksheets("データ").Cells(1, 3).Value =       Application.WorksheetFunction.SumIf(Cells(i, 1).Value, ans, Cells(i, 2).Value)       '↑ここでエラーになります。ans(犬)の値は取得出来ています。      i = i + 1    Loop End Sub

  • VBAで教えてください。

    下のようなコードを見つけて勉強しています。 簡単な応用ができません・・・。 P1=今日の日付 G=訪問日 I=御礼の手紙を書いた日付 として、 訪問日が過ぎていて、御礼の手紙が未入力なら“超過があります”とメッセージと色で知らせるものですが、 下のような感じで P1=今日の日付 I=御礼の手紙を書いた日付 K=返事が来た日付 御礼の手紙を書いた日付から20日が過ぎてもK列に返事が来た 日付が入力がないものには ・“返事がありません”とメッセージ ・薄い灰色に行を塗る というようにしたいのですが、教えていただけないでしょうか。 自分では、+20という表現をどのように書いたらいいのかというとこ ろで躓いてしまいました。 どうぞ宜しくお願いします。 Sub test () Dim SH As Worksheet Dim i As Integer Dim s As String Set SH = Worksheets("表") s = "超過はありません。" i = 1 Do Until SH.Cells(i + 3, "A").Value = "" If SH.Cells(i + 3, "G").Value < SH.Range("P1") And _ SH.Cells(i + 3, "I").Value = "" Then SH.Cells(i + 3, "A").Resize(, 16).Interior.ColorIndex = 3 s = "超過があります。" End If i = i + 1 Loop MsgBox s End Sub

  • (VBA)Splitの抜き出しが上手くいかない

    以下のようなコードで「指定区切り文字」の前後で文字列を切り出しています。 添付画像見てもらえれば判ると思いますが B8セルからのB列の値が「29:08」が正解なのに 「29:08:00」と最後に「:00」が付いた形式になっています。 (B13で1時間を過ぎると正常になっています。) このため、以後のE及びF列の書き出しもおかしな値となりました。 どのように修正すれば良いでしょうか ? Option Explicit Sub Chapter_Plus() Dim I As Long Dim J As Long Dim TEMP As Variant Dim SepChr As String Dim WS1 As Worksheet Dim WS2 As Worksheet Dim EndLow As Long Dim LineData As String Dim OutText As String Dim byteData() As Byte '一時格納用 Set WS1 = Worksheets("DATA") Set WS2 = Worksheets("Chapter") 'シートの初期化 WS1.Range("B3:H100").Clear WS2.Range("A1:A100").Clear SepChr = InputBox("指定文字を入力してください。", "区切り文字入力", " ") 'TotalLength = InputBox("時間を(h:mm:ss)で入力してください。", "ファイルサイズ入力") EndLow = WS1.Cells(Rows.Count, "A").End(xlUp).Row With WS1 '区切り文字で切り出す For I = 3 To EndLow TEMP = Split(.Cells(I, "A"), SepChr) .Cells(I, "B") = TEMP(0) .Cells(I, "C") = TEMP(1) Next '仮チャプター書き出す For I = 3 To EndLow .Cells(I, "E").Value = Format(.Cells(I, "B").Value, "hh:mm:ss") .Cells(I, "F").Value = Format(.Cells(I + 1, "B").Value, "hh:mm:ss") .Cells(I, "G").Value = .Cells(I, "C").Value Next '番号 For I = 3 To EndLow .Cells(I, "H").Value = CStr(Format(I - 2, "'00")) Next End With End SUB

  • VBA Functionについて

    アクセスです。 サンプルコードを見ていてよくわからないので教えてください。 サンプルコードはこちらです↓ ------------------------------------------- Public Function kakaku(cost As Currency, rate As Double) As Currency kakaku = cost / (1 + rate) End Function Sub M0108() Dim Zeikomi As Currency Dim Zeiritu As Double Zeikomi = InputBox("内税の価格を入力してください。") Zeiritu = InputBox("税率を入力してください。") MsgBox (kakaku(Zeikomi, Zeiritu) & "円") End Sub ------------------------------------------- M0108を実行してみたら納得いく結果になったので問題ないのですが kakaku関数についてよくわかりません。 cost / (1 + rate) とはどういう意味なのでしょうか? costもrateも値が代入されていませんが、 この二つの変数は何の意味があるのでしょうか? ご教授よろしくお願いします。