以下のように、C列を参照して判断し、それに適した値を表示させる関数を作っています。
質問1:以下、どこが間違ってますでしょうか?
質問2:以下では、Columns(3)として参照していますが、列に名前を付けておき、それを関数から参照させることはできますでしょうか?
Function test()
Select Case Worksheets("Sheet1").Columns(3).Value
Case "りんご"
test = "100円"
Case "みかん"
test = "150円"
Case "いちご"
test = "300円"
Case "すいか2"
test = "200円"
End Select
End Function
No.3
- 回答日時:
訂正
Function test(Hinmei as Atring) as String
は
Function test(Hinmei as String) as String
の間違いでした(A⇒S)
No.2
- 回答日時:
>質問1:以下、どこが間違ってますでしょうか?
「関数で最適値を返す」と言う考え方そのものが間違い。
通常、こういう「名前から価格を求める」など「ある値に対応した最適値を得る場合」には「価格表を別シートで用意し、VLOOKUP関数で求める」のが普通。
Sheet2に添付画像のような表を用意し
D7セル:=VLOOKUP(C7,Sheet2!$A:$B,2,FALSE)
D8セル:=VLOOKUP(C8,Sheet2!$A:$B,2,FALSE)
D9セル:=VLOOKUP(C9,Sheet2!$A:$B,2,FALSE)
D10セル:=VLOOKUP(C10,Sheet2!$A:$B,2,FALSE)
のような式を書きましょう。
商品や価格が変わったり、商品が増えた場合、Sheet2の表を追加変更するだけで済み、自作関数を書き変えたり修正する必要は無くなります。
>質問2:以下では、Columns(3)として参照していますが、列に名前を付けておき、それを関数から参照させることはできますでしょうか?
Columns(3)は「C1~C65536セル」を現わします。
この関数の本来の目的は「ある値を与えると、対応した値を返す」のですから、引数として「ある値」を受け渡すべきです。
関数を以下のように書き直して下さい。
Function test(Hinmei as Atring) as String
Select Case Hinmei
Case "りんご"
test = "100円"
Case "みかん"
test = "150円"
Case "いちご"
test = "300円"
Case "すいか2"
test = "200円"
End Select
End Function
呼び出す部分は、
D7セル:=test(C7)
D8セル:=test(C8)
D9セル:=test(C9)
D10セル:=test(C10)
とします。
とゆ~か、別表を用意してVLOOKUPを使えば、自作関数そのものが不要で、しかも自作関数よりも利便性が高いので「自作関数で処理する」と言う馬鹿な事は辞めましょう。
No.1ベストアンサー
- 回答日時:
>Worksheets("Sheet1").Columns(3)
これではシート1のC列のセル範囲(C1からC65536までの65536個のセル)です。その中の具体的に「どの1個のセル」の値を調べて判定したいのか,特定できていません。
変更前:
Worksheets("Sheet1").Columns(3).Value
変更後:あなたがやりたかったのはこういうことでしょうか
Worksheets("Sheet1").cells(application.caller.row, "C").Value
それとも?C列の上から下まで全セルを全て調べた結果を,(65536個のデータの) 配列として返す関数を作りたかったのでしょうか。
>列に名前を付けておき、それを関数から参照させる
可能と言えば可能ですが,「列に名前を付ける」事は出来ません。名前を付けられるのは「その列のセル(セル範囲)」です。
名前は,ワークシート画面では挿入メニューの名前の定義で作成できます。勿論マクロから作成や操作も出来ますが,先にエクセルを手で動かして名前定義についてちゃんと理解してから,それからマクロで利用してください。
変更後の例のその2:
Function test()
Select Case range("私のC列").cells(application.caller.row).Value
Case "りんご"
test = "100円"
Case "みかん"
test = "150円"
Case "いちご"
test = "300円"
Case "すいか2"
test = "200円"
End Select
End Function
ありがとうございます。できました。
この書き方が知りたかったのです。助かりました。
range("私のC列").cells(application.caller.row).Value
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) Excelのマクロについて教えてください。 3 2022/06/30 09:36
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Visual Basic(VBA) 先ほど、回答者様によって教えていただいたのですがどうしたらいいか分かりません。 ユーザーフォーム上に 2 2023/02/21 22:25
- Visual Basic(VBA) vbaでセルに入力したときに,その横にあるセルを保護し入力不可にするマクロを作りたいです。 2 2022/04/24 20:59
- Visual Basic(VBA) ワークシートチェンジで曜日を表示する方法 1 2023/03/04 21:51
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SUMIF関数で、「ブランク以外を...
-
エクセル1行おきのセルを隣の...
-
エクセルで、指定の値よりも大...
-
文字列から英数字のみを抽出す...
-
自分の左隣のセル
-
セルを結合した時のエクセル集...
-
Excelで大量のセルに一気に関数...
-
excelで、空白を除いてデータを...
-
【Excel】4つとばしで合計する方法
-
【Excel】IF文「ある文字を含ん...
-
エクセルで、A2のセルにA3...
-
エクセルで年月日から月日のみへ
-
エクセルに入力後、別シートの...
-
エラー「#REF」の箇所を置き換...
-
週の労働時間を計算するエクセル
-
エクセル 12進数
-
EXCELでマイナス値の入ったセル...
-
2つのシートを比較し、異なる値...
-
EXCELのcountif関数での大文字...
-
条件付き書式の色付きセルのカ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SUMIF関数で、「ブランク以外を...
-
文字列から英数字のみを抽出す...
-
エクセル1行おきのセルを隣の...
-
エクセルで、指定の値よりも大...
-
自分の左隣のセル
-
セルを結合した時のエクセル集...
-
Excelで大量のセルに一気に関数...
-
エクセルで、A2のセルにA3...
-
excelで、空白を除いてデータを...
-
エクセルで特定のセル内にだけ...
-
週の労働時間を計算するエクセル
-
エクセルで年月日から月日のみへ
-
条件付き書式の色付きセルのカ...
-
EXCELのcountif関数での大文字...
-
EXCELでマイナス値の入ったセル...
-
エクセルに入力後、別シートの...
-
【Excel】4つとばしで合計する方法
-
同一セル内の重複文字を削除し...
-
エクセルでエンターを押すと任...
-
エラー「#REF」の箇所を置き換...
おすすめ情報