エクセルで運賃を出す方法は?

このQ&Aのポイント
  • エクセルで0kmから3km以下は130円、3kmから6km以下は160円・・・xkmからykm以下はz円というような表示を出すVBAまたは関数は、どのようなものが考えられますか?
  • エクセルで作成した運賃計算関数が列の移動に対応していないため、何らかの方法で安定して使いたいです。
  • 運賃計算関数を使用しているが、運賃の金額を変更しても自動的に再計算されないので、自動計算させる方法が知りたいです。
回答を見る
  • ベストアンサー

エクセルで運賃を出す方法は?

 エクセルで0kmから3km以下は130円、3kmから6km以下は160円・・・xkmからykm以下はz円というような表示を出すVBAまたは関数は、どのようなものが考えられますか? ちなみに暫定的に作ってみたのが、以下のような感じです。 Function alif(hikaku As Single, kyorikara As Single, kyorimade As Single) As Single  → single関数を使うことで、0.1km等の小数点に対応しております。 Dim yen As Integer Dim i As Integer For i = 1 To 100 kyorikara = Cells(i, "B")  → B列に、0kmから・・・等を入れています。 kyorimade = Cells(i, "D")  → D列に、3km以下・・・等を入れています。 yen = Cells(i, "C")  → C列に、運賃の情報を入れております。 If hikaku > kyorikara And hikaku <= kyorimade Then alif = yen Exit For  → 比較用のセルが、x距離より多くてy距離以下の場合、関数を入力した場所にz円を代入して For Next 文を終了します。 Else  → Elseは特に何も用意していない。 End If Next End Function  しかし、これですと運賃関連の情報を1列移動した瞬間にデータが狂います(運賃関連のシートを別に作って、列を絶対に変更しなければ問題ないとは思いますが・・・)。どうにか列を変更しても問題なく作る方法はないでしょうか?  また、使っていて気付いたことですが、運賃の「円」数値を変えた際に自動再計算しないのですが、これを自動計算させるにはどのような方法があるのでしょうか?(設定で手動計算になっていたのかは確かめておりませんので、これは改めて確認してみますが・・・。)  どうか、ご教示いただければ幸いです。

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

  • ベストアンサー
  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

>どうにか列を変更しても問題なく作る方法はないでしょうか? この前提が間違っているのではないでしょうか。 DB的なシステムを作るときに、目印になるフィールド名や列名が動的に変わることを前提に組むことはしません。 列を動かされたくないのなら、別シートにするなり、別ブックにしてロックをかけておけばよいだけですし。コード的な工夫や制限の話ではなく、これは運用上の問題です。 一応動的に変わることを前提にするなら、列に定義名を振ってそちらを目印にするか、あるいは1行目をタイトルとしてこれを固定してこのタイトル名でその都度検索して列数を探すとか。 ただこれらも定義名なり列名が変えられてしまうことを前提にするなら、同じことです。どちらにせよ何らかの目印は振らなければなりませんし、その目印が変更されてしまうことが前提になるなら、その都度コードを直接修正しなければなりません。 ※上記の方法の方が、列数を決め打ちするよりは多少自由度が高くはなります。 >運賃の「円」数値を変えた際に自動再計算しない 元々運賃の「円」数値を変えた際にそのコードが動作するようにはなっていないと思われますが。設定シートの書き換えにも動的に連動させたいということならば、別シートにした上でそのシートのチェンジイベントを拾うようにするとか。 例えば運賃シートの値が変わった時は比較用の値を一旦キャッシュに保存して、クリアしてまたそのキャッシュの値を書き戻すとかすれば、その関数の結果も更新されます。 まぁこれもシート上で全て完結されるのではなく、入力用のフォームなどを別に用意するようにすれば、イベントの管理もしやすくなります。※思いも寄らぬ操作をされないように最初から制限しておくのがバグも発生しにくくなります。 あと根本的に100回ループさせるというが非常に無駄だと思います。 素直にFind系の関数を使って一発で該当の行を探すべきでしょう。またその際も一旦全て配列に取り込んで、その中で探すとした方が処理も速くなります。 またそもそも引数のhikaku As Single, kyorikara As Single, kyorimade As Single が意味不明です。入力値は距離(hikaku)だけで良いだけでは。また運賃シートも必要なのはkyorikaraもしくはkyorimadeとその対応する運賃だけでしょう。 「10」として入力されたら、運賃シートの「距離」列から10以上の数字の入っている行数を取得して、その隣にある「運賃」の値を返すだけ。となるとそもそもワークシート関数で完結してしまいますので、自作関数すら出番がないですが。 例えば境界線上の部分を多少曖昧にしてもよい(それでも小数点を何十桁まで増やせば対応可能でしょうが)なら下記のような感じにすればLookup関数だけでも何とかなりそうな...。 距離から 運賃 0 100 3.001 500 6.001 1000 9.001 1500 こんな感じの表にして、 C1に距離数を入力したらその運賃が返ってくる関数 =VLOOKUP(C1,A1:B4,2)

tetsuoni
質問者

お礼

 Vlookup関数の存在は知っておりましたが、こんな使い方が出来るとは知りませんでした。  無事に目的のことができました。ありがとうございます。

関連するQ&A

  • エクセルマクロに関する質問

    最近、エクセルマクロを始めてたのですが、下記のような状態で困っています。 プログラムを実行した際に、Cells((I1 + I5), I6)のセルに計算式がはいって欲しいのですが、 現状では計算結果が入るだけになってしまっています。 また、単純に文字列に変換してしまうだけだと、変数が邪魔になって式になってくれません。 誰かお分かりになる方がいましたら、教えてください。  Dim I1 As Integer Dim I2 As Integer Dim I3 As Integer Dim I4 As Integer Dim I5 As Integer Dim I6 As Integer Dim I7 As Integer Dim I8 As Integer Cells((I1 + I5), I6) = Cells((I1 + I5) - 2, I6) + Cells((I1 + I5), I6 - 2) - Cells(I1 + I5, I6 - 1)

  • エクセルマクロ配列で変数は使えますか

    エクセル2013です。 初めて配列を使います。 以下のように作成し思ったようにできました。 Sub 計算() '成功 Dim a As Integer Dim c As Integer Dim b(5) As Integer Dim 最終行 Dim 値列  値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To 5 b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub ただ計算する列の範囲をインプットボックスで入力した値 にしたい為以下のように改造しました。 Dim b(対象列) As Integerでエラーになります 配列には変数は使用できないのでしょうか? よろしくお願いします。 Sub 計算() '失敗 Dim a As Integer Dim c As Integer Dim b(対象列) As Integer’★ここでERRになる Dim 最終行 Dim 対象列 Dim 値列  対象列 = 22'インプットボックスで入力した値 値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To (対象列 - 17) b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub

  • Excel VBAにて2の100乗を計算するには

    プログラミングの勉強でVBAを学んでいるものです 以下の様な問題を出されました 2の100乗の値を計算する。この値はLong型で表せる最大の値をはるかに超すので、十分な大きさのInteger型の配列を用意し、その各要素で各けたの値を表す。値を2倍するサブプロシージャ「二倍」を書いてプログラムを完成させ、値を計算せよ。 Option Explicit Sub 二の百乗() Const n As Integer = 200 Dim s(n) As Integer Dim i As Integer, j As Integer s(1) = 1 For i = 2 To UBound(s) 'UBoundは配列の最大の添え字を返す関数 s(i) = 0 Next i For i = 1 To 100 二倍 s Next i For i = UBound(s) To 1 Step -1 If s(i) <> 0 Then Exit For Next i For j = 1 To i Cells(1, j).Value = s(i - j + 1) Next j End Sub セル一つに計算結果を表示させられないことはよく分かるのですが、そのための2の掛け算を全く思いつきません 二倍のサブプロシージャをどのようにすればいいのでしょうか

  • Excel マクロ:変数を複数使う場合

    マクロ初心者です。 For文で、変数を2つ定義し、それぞれが1つずつ増えてくれるような マクロを組みたいのですが、うまくいきません。 例えばA列の並んだ数字を、B列に一個とばしで入力するとして・・・ 例) Dim i As Integer Dim j As Integer For j = 2 To 10 Step 2 For i = 1 To 9 Cells(j, 2).Value = Cells(i, 1).Value Next i, j ではだめですよね。iが1つ増える時に、jも1つ増える、 というようにVBAを組むことが可能なのでしょうか? ど素人な質問ですみませんが、教えてください。

  • 配列変数に格納したデータを計算する方法はありますか?

     簡単な例ですが、例えばB列にあるデータの平均値を求めるときに以下のようにしています。 sub 平均計算()   Dim X(1 To 1000, 1 To 1) As Variant, i as Integer   For i = 10 To 1000     X(i, 1) = WorksheetFunction.Average _          (Range(Cells(i - 9, 2), Cells(i, 2)))   Next   Range(Cells(1, 1), Cells(1000, 1)) = X End Sub  ここで処理速度改善のため、B列のデータを別の配列変数Yに格納してから平均値を求めるというようなことをしたいのですが、そんなことは可能でしょうか?イメージとしてはこんな感じです。   Y = Range(Cells(1, 2), Cells(1000, 2))   for i = 1 to 1000     X(i, 1) = WorksheetFunction.Average _          (Range(Y(i - 9, 2), Y(i, 2)))   Next  当然これはエラーになってしまいますが、このようなことを可能にする方法があれば、どなたか教えてください!よろしくお願いします。

  • エクセルVBAで上手く動きません。

    エクセルでVBAをつかって、ユーザー関数を作ったのですが、 うまく動きません。助けて下さい。 内容はINT関数が7回までしか連乗できないので、 何回でも掛けて切り捨てる関数を作りましたが・・・ プログラムは以下の通りです Function MULTINT(sdata1 As Single, ParamArray Optdata2()) As Long Dim i As Integer MULTINT = sdata1 For i = 0 To UBound(Optdata2()) MULTINT = Int(MULTINT * Optdata2(i)) Next i End Function 本来は、 MULTINT(84000,0.7)=58800 となって欲しいのですが、 MULTINT(84000,0.7)=58799 となってしまいます。どこがいけないのでしょうか? 困っています。助けて下さい。

  • 単純な掛け算なのにわけのわからない小数点が、、、

    表題のとおりですが、EXCEL VBAでシートと複合させて計算したところ次のような結果が出ました。 マクロは以下のとおりです。 Private Sub CommandButton1_Click()  Dim i As Integer Dim n As Integer Dim x As Integer Dim y As Single  Dim d1 As Single Dim d2 As Single  n = Range("L4").Value 'L4には現在399が入力されています。 y = Range("L2").Value 'L2には現在0.048が入力されています。  d1 = Range("D11").Value d2 = Range("E11").Value If n = 0 Then Exit Sub For i = 0 To n x = i + 6 Cells(x, 13) = i Cells(x, 14) = Cells(x, 13) * y Cells(x, 15) = Cells(x, 14) + d1 Cells(x, 16) = d2 - Cells(x, 14)     x = x + 1 Next i End Sub こうするとCells(7, 14)に0.0480000004172325という数字が入り始め、 続きも同じように小数点の小さい桁にわけの分からない数字が出て来ます。いったい何が原因か分かりません。 よろしくお願いします。

  • ExcelVBAで重複しているもの以外を抜き出したい

    Excelで以下のようなことをしたいのです。     A 1  みかん 2  りんご 3  みかん 4  めろん 5  りんご とあったとします。 この表から、重複したものははぶいてカウントしたいのですが、 どのようにしたらよいでしょうか? 【理想結果】    C     D 1 みかん   2 2 りんご    2 3 めろん   1 実際に試してみたコードは以下の通りです。 -------ここから---------- Dim i As Integer Dim i2 As Integer Dim Count As Integer Dim Name As String Dim Last As Integer For i = 1 To 5 'A列の1行目から5行目まで。 Last = Cells(3).CurrentRegion.Rows.Count 'C列の最終行を取得。 Name = Cells(i, 1) 'NameはA列の値。 For i2 = 1 To Last Select Case Name Case Is = Cells(i2, 3) Cells(Last + 1, 3) = "" Case Is <> Cells(i2, 3) Cells(Last + 1, 3) = Name End Select Next Next 上記コードを試すと、C列の1行目があいて2行目からA列をそのまま写した状態になってしまいます。 Ex2000です。

  • エクセルVBAの繰り返し処理の質問

    C列にある項目とG列にある項目を比較して、 一致し、H列にある数字が10以上ならば、B列にフラグ1を立てる という処理を行いたいんですが、 下記ぐらいまでしか作れず、うまくいきません・・・ Sub フラグを立てる処理() Dim i As Integer Dim j As Integer Dim k As Integer i = 1 j = 1 Do j = j + 1 Do i = i + 1 If Cells(j, 8) > 9 Then Cells(i - 1, 4) = 1 End If Loop Until Cells(i, 3) <> Cells(j, 7) Or Cells(i, 3) = "" Loop Until Cells(j, 7) = "" End Sub わかる方がいらっしゃいましたら、お願いします。

  • Excel上で関数を入れるコード For Next

    C列にExcel上で関数を上から下へ入れるコードを教えて下さい。 お世話になっています。 いつも質問ばかりですみません。 A列に項目、B列に日付が入っているリストがあります。 今回、C列にその月の第何周目かを求める関数 =WEEKNUM(B1)-WEEKNUM(DATE(YEAR(B1),MONTH(B1),1))+1 を入力したいです。 このエクセルシート上の関数のB1をB2、B3、B4と変化させて行きたいのですが 以下私のコードを書きましたが、 記載した時点で「"=WEEKNUM」から二行が赤字で表示されてしまいます。 ------------------------------------------------------ Sub 私の書いた第何週目かをC列に求めるコード() Dim i As Integer For i = 1 To Range("a1").End(xlDown).Row Sheets("Sheet1").Cells(i, "3").Formula = _ "=WEEKNUM(" & "(Cells(i, 2)"&")-WEEKNUM(DATE(YEAR(" & "(Cells(i, 2)" &),MONTH(" & "(Cells(i, 2)" & "),1))+1)" Next i End Sub ------------------------------------------------------ 方法を教えていただけないでしょうか。 すみませんが、よろしくお願い致します。

専門家に質問してみよう