エクセルVBAで数式の計算結果を値に変換する方法

このQ&Aのポイント
  • エクセルVBAを使用して、数式の計算結果を値に変換する方法について紹介します。
  • テーブル設定された表には数式が含まれており、再計算に時間がかかってストレスを感じています。数式の数を減らすために、VBAを活用して数式の計算結果と同じ値を設定する方法があります。
  • 試しにEvaluate関数を使って数式を計算しようとしたのですが、エラーが発生してしまいます。代わりに数式を設定した後で、値を再度代入する方法を試してみてください。他にも効果的な方法があれば、教えていただきたいです。
回答を見る
  • ベストアンサー

エクセルVBAでEvaluate関数で指定子を使う

テーブル設定された表があります。 表には数字や数式が入っているのですが、 運用しているうちに数式が増え、再計算が時間が長くてストレスになってます。 時間を短くするため、VBAを使用して数式の計算結果と同じ値を設定(“値のみ貼り付け”と同じこと)をして数式を減らそうとしています。 ただし、数式は今後も追加・変更されるため、 そのときのVBAソースコード修正の手間を最小限にしたいという事情もあります。 まずは 【ソースコード1】 For i = 1 To 10000 Cells(i, 金額列).Value = Evaluate("[@単価]*[@数量]") Next i このようなコードを書いたのですが、エラー値になってしまいます。 Evaluate関数で指定子(角かっこ)は使えないのでしょうか。 使えないなら別の方法として、 数式を設定した後で、値をもう1度代入する方法を考えてます。 【ソースコード2】 For i = 1 To 10000 Cells(i, 金額列).Formula = "[@単価]*[@数量]" Next i Range("A1:Z10000").Value = Range("A1:Z10000").Value ’計算結果だけをもう1度代入して数式を消す 他に良いやり方があったら教えてください。

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

  • ベストアンサー
回答No.3

こんにちは。 2例でお応えします。 まず、ご所望の .Evaluate メソッドを用いて、定数値配列を直接 必要な範囲全体に一度で出力する方法。ループは不要です。 ' ' // Sub Re9335772Evl() ' 要指定■↓テーブル名   Evaluate("テーブル1[金額]") = Evaluate("テーブル1[単価]*テーブル1[数量]") End Sub ' ' // 正しく階層を追って参照する、と正しい結果が得られます。 上に挙げたのはApplication オブジェクトの.Evaluate メソッド の省略形になりますが、階層を追って参照という意味では、   With Sheets("Sheet1") ' 要指定■シート名、↓テーブル名     .Evaluate("テーブル1[金額]") = .Evaluate("テーブル1[単価]*テーブル1[数量]")   End With のように、Worksheet オブジェクトに対しての .Evaluate メソッドをハードに決める方が確実ですし、 統一感が増しますね。 それから、.Evaluate メソッドを使うならループの中ではなく、 配列を一発で出力する場合に絞って考えておいた方が間違いが少ないです。 どうしてもループの内で.Evaluateしたい場合は、 きっちりとエラートラップを掛けてあげないと、 比較的重いトラブルを招くこともありますので、気を付けてください。 次に、ListObject オブジェクトの扱い方ですが、 テーブルの場合も、ループは不要ですね。 デフォルトでは、先頭セルにひとつだけ 数式(というよりクエリ)を入れてあげれば、 最下行まで計算してくれますので、 その後で、固定値にするようにしてみます。 こちらの方が基本操作を扱っていることになりますので、 知っておいた方が今後、困ること少なくなると思います。 ' ' // Sub Re9335772Lst() ' 要指定■↓シート名、↓テーブル名orIndex   With Sheets("Sheet1").ListObjects("テーブル1").ListColumns("金額").DataBodyRange     .Cells(1) = "=[単価]*[数量]"     .Value = .Value   End With End Sub ' ' // 提示したコードについては、概念的な理解を優先する為に 敢えてべたな書き方を選んでいます。 実際に書く時は適宜、変数や定数を組み合わせるものと思います。 以上です。

fxgame1224
質問者

お礼

ありがとうございます。 Re9335772Evl()を試したところ [単価]*[数量] の場合は期待通りの結果が得られたのですが、 LEFT([商品コード], 3) の場合は 1行目の結果が、1行目から最終行まで(すべて同じ値が)設定されてしまいました。 LEFT関数を使うと動きが変わるのか、私のエクセルがおかしい(何か隠しパラメータが設定されてる)のか。。。 Re9335772Lst()であれば、計算式もLEFT関数も期待通りの結果になりました。ありがとうございます。

その他の回答 (5)

回答No.6

No.5 お礼コメントへの返信です。 > 今時点では基本操作の方が理解しやすそうなこと、 > 数式は今後も変わっていくものであり、私以外の(VBAを使い慣れてない)人が追加変更するときも制約が少なそうなことから、 > そのまま渡す方法(Re9335772Evl)にします。 うーんと、文脈からすると、Evaluate メソッドを使わない方、 テーブルに数式(クエリ)を渡して計算させてから固定値にする方、  Sub Re9335772Lst にする、ということですよね? その方が良さそうですね。 > そして質問がどんどん派生してしまいますが、 > そのまま渡す方法を採用しても、[#見出し]のように、#を含んでいるとエラーになってしまいました。 > もしかして#はファイル操作に使う特別な文字なのでエラーになったのでしょうか? > エスケープするなどの回避策はありますか? #の問題ではなくて、Excelを日本語環境で使う為のロケール設定が 中途半端な仕様になっていることが原因です。 回避策、2例。 ' ' //   With Sheet1.ListObjects("テーブル1").ListColumns("上3桁").DataBodyRange ' 要指定■シート名、テーブル名orIndex     .Cells(1) = "=テーブル1[[#Headers],[商品コード]]&[@商品コード]"     .Value = .Value   End With ' ' //   With Sheet1.ListObjects("テーブル1").ListColumns("上3桁").DataBodyRange ' 要指定■シート名、テーブル名orIndex     .Cells(1).FormulaLocal = "=テーブル1[[#見出し],[商品コード]]&[@商品コード]"     .Value = .Value   End With ' ' //  #見出し #Headers  #すべて #All  #集計 #Totals  #データ #Data お好きな方法でどうぞ。

fxgame1224
質問者

お礼

早い返信、ありがとうございます! #見出しはダメでしたが、#HeadersだとOKなのですね!

fxgame1224
質問者

補足

すみません、ご指摘の通りRe9335772EvlではなくRe9335772Lstの方でした。 また何度も質問に答えていただき お付き合いありがとうございました!!

回答No.5

No.3 お礼コメント欄への返信です。 > LEFT関数を使うと動きが変わるのか、私のエクセルがおかしい(何か隠しパラメータが設定されてる)のか。。。 こんな数式になります。([上3桁]というフィールドの[商品コード]の左3桁を出力する例)   Range("テーブル1[上3桁]").Value = Evaluate("INDEX(LEFT(テーブル1[商品コード],3),)") そのままでは配列を返してくれない関数、この場合ではLEFT()関数、 の場合には、"INDEX(LEFT(s,n),)"のような書式で配列を返してくれます。 ここら辺は、Excelの配列数式、中でも、複数セル範囲で確定するタイプの配列数式 の扱い方を参照します。 .Evaluateメソッドそのものは、VBAからExcelワークシートに計算を命令するコマンド ですので、Excel数式への理解を深める必要はあります。 でも、扱いに困るようでしたら、テーブル側にクエリを渡すやり方の方が 簡単ですよね。 計算が速いという意味では、レコード数が多い程.Evaluate推しですけれど。

fxgame1224
質問者

お礼

ありがとうございます。奥が深いのですね。 配列数式、勉強します。 今時点では基本操作の方が理解しやすそうなこと、 数式は今後も変わっていくものであり、私以外の(VBAを使い慣れてない)人が追加変更するときも制約が少なそうなことから、 そのまま渡す方法(Re9335772Evl)にします。 そして質問がどんどん派生してしまいますが、 そのまま渡す方法を採用しても、[#見出し]のように、#を含んでいるとエラーになってしまいました。今回は別の数式に置き換えたので大丈夫ですが、 もしかして#はファイル操作に使う特別な文字なのでエラーになったのでしょうか?エスケープするなどの回避策はありますか?

回答No.4

No.3 です。 間違いがあった訳ではありませんが、修正を1点。 ' ' // Sub Re9335772Evl() ' 要指定■↓テーブル名   Range("テーブル1[金額]").Value = Evaluate("テーブル1[単価]*テーブル1[数量]") End Sub ' ' // 以上のように、出力コードの左辺については、 .Evaluate メソッドを態々使うと、 無駄なオーバーヘッドに掛かってしまいますので、 普通にRangeを使う方法に修正、とさせてください。 テーマが.Evaluate でしたので、 つい、余分に使ってしまいました。 それから、角括弧の話題(?)についてですが、 テーブル参照における識別子、というのは、 質問者さんは、正しく理解されていらっしゃいます。 NO.1さんの仰るのは、Evaluateのショートカット記法のことで、  [テーブル1[金額]] = [テーブル1[単価]*テーブル1[数量]] という書き方で.Evaluate メソッドを省略して書く時の (この式では両辺外側にある)角括弧のことなのだと思いますが、 この記法ではVBAの変数や定数を扱えませんし、 更に余分なオーバーヘッドが掛かりますから、使い途は限定されます。 シートデザインをする時とか、一度きりの処理を短時間で終えたい時などには、 [D11:F20].interior.color=[A1].interior.color みたいにサッサと書けてラクできる、という意味で重宝します。 しかし、この角括弧のお話は、今回の課題とは全く無縁ですので、 混乱されることのないようにと、申し添えておきます。 .Evaluate メソッドを扱うことに関しては、 比較的情報が少なく、中でもやや錯綜した情報が多い面もあり、 歪んだ発信を目にすることもありますが、 大切なことは、適した場面で正しく使う、ということです。 間違った使い方をすれば、どんなものにも相応の結果が追いてくるだけのこと。 今回の課題は、  比較的大きなセル範囲を一纏めにして、値の入出力をする  クエリの代用として識別子(または定義された名前)を扱って演算する .Evaluate メソッドの特長が、よく表れている、 そのメリットを大きく享受できる、好例であると思います。 そういう意味では、間違いなく、"適した場面"、なのです。 以上、追加補足として。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.2

済みません、間違えています お詫びの上、訂正させて ください 誤記1 要は、配列数式的に Let .Range(.cells(1,3),.cells(100,3)).Value = .Range(.cells(1,1),.cells(100,1))*.Range(.cells(1,2),.cells(100,2)) と、したい 正記1 要は、配列数式的に Let .Range(.cells(1,3),.cells(100,3)).Value = .Range(.cells(1,1),.cells(100,1)).Value * .Range(.cells(1,2),.cells(100,2)).Value と、したい 誤記2 使わず With ActiveSheet  Let .Range(.cells(1,3),.cells(100,3)).Value = .Range(.cells(1,1),.cells(100,1)))*.Range(.cells(1,2),.cells(100,2))) End With で、行けませんか? 正記2 使わず With ActiveSheet  Let .Range(.cells(1,3),.cells(100,3)).Value = .Range(.cells(1,1),.cells(100,1)))).Value * .Range(.cells(1,2),.cells(100,2)))).Value End With で、行けませんか? 失礼しました ところで、 Const、日本語変数名、 を、使えば 明瞭な、コーディングも 可能、ですよ もう一つ あらゆる、意味で 確認、してませんが 正直な、話し もし 千件位、だと 仮に Evaluate("[@単価]*[@数量]") 的な、事が Evaluateで、出来た と、しても Application.WorksheetFunction.Product([@単価] , [@数量]) の、方が 早いかも? 更には、以外と .Range( が、 もっと、言えば .cells( が、 手動計算下、では 早い の、です よね (^_^;)

fxgame1224
質問者

お礼

ありがとうございます。 質問の本題ではないので省略しましたが、数式が入っているセルは20列ほどあり、 VLOOKUPやMATCH、INDEX、LEFT、WEEKNUM、IFのネストがふんだんに使われております。 ちなみに私以外の担当者が数式を考えて、私がVBAに反映させることになっています。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.1

まず此を https://msdn.microsoft.com/ja-jp/library/office/ff193019.aspx 実際に 使って、みれば 解る事、ながら MSは、 [ ]は、Evaluateだ と、しています しかし、 本当は 少し、違い Range( に、近い 感じ、です Cells(i, 金額列).Value = Evaluate("[@単価]*[@数量]") と、されていますが よく解らない の、ですが 恐らく @単価、@数量、 は、名前定義 ですかね? 要は、配列数式的に Let .Range(.cells(1,3),.cells(100,3)).Value = .Range(.cells(1,1),.cells(100,1))*.Range(.cells(1,2),.cells(100,2)) と、したい て、事ですか? もし、そうなら With  ActiveSheet  .Cells(i, 金額列).Value = Evaluate( .Range(@単価).address * .Range(@数量).address) End With と、してみてください http://www.relief.jp/docs/excel-vba-get-value-named-cell-range.html でも、此だと 単に With  ActiveSheet  .Cells(i, 金額列).Value = .Range(@単価) * .Range(@数量) End With と、同じかな? 更には 名前定義、等 使わず With ActiveSheet  Let .Range(.cells(1,3),.cells(100,3)).Value = .Range(.cells(1,1),.cells(100,1))*.Range(.cells(1,2),.cells(100,2)) End With で、行けませんか? 蛇足 〉【ソースコード2】 ですが Formulaを、Valueに 変える、前に Calculate した方が 無難、ですよ で、 其の、際 ですが 加えて メモリー不足が、出易い ので Formula、 Calculate、 Value、 を、 各々 サブルーティン化、し 別モジュールに 置いた、方が 無難、ですよ http://officetanaka.net/excel/vba/error/execution_error/error_7.htm OfficeTanaka氏の発言、抜粋 〉巨大なプロシージャなどを作成すると 〉「メモリが足りません」と怒られることがあります。 〉私も過去に、数回経験しています。 〉まぁ、そんなときは、 〉モジュールやプロシージャを分割すればいいだけなので、 と、言う事で モジュールを 別けられた、方が 良い ですよ と、言うか 抑も、 Application.Calculation = xlCalculationManual を、 して、おかないと ワークシート、演算待ち に、よる 同期不善、待ち発生、 で 簡単に、転けます よ (^_^;) で、 此で、転ける 時も どうやら、メッセージは メモリー不足 ですね (^_^;)

fxgame1224
質問者

お礼

ありがとうございます @単価、@数量は回答No.3の方の通りです。

関連するQ&A

  • Excel VBA TREND関数について

    VBAにて6次近似の計算をするためのプログラムを組んでいるのですが【コンパイルエラー:不正な文字です】 と言われてしまいます。 6次近似の計算式の記載方法を教えて下さい。 よろしくお願い致します。 尚、現状は以下の通りです。 ============================== Dim i As Long Dim deg As Double Cells(i, 10).Value =Application.WorksheetFunction.Trend(Range(Cells(i, 1),Cells(i + 5, 1)), Range(Cells(i, 8), Cells(i + 5, 8)))^{1,2,3,4,5,6}, deg^{1,2,3,4,5,6}, 1) ===============================

  • Excel VBA 列の最後の値を代入

    たびたびすみません。 指定したセルの、最終列の値を、任意のセルに入れたいのですが、 オブジェクトが必要です、というエラーがでます。 Sub 単価代入() Dim i As Integer Application.ScreenUpdating = False For i = Range("IV2").End(xlToLeft).Column To 1 Step -1 If InStr(Cells(2, i).Value, "単価") > 0 Then Cells(3, i).Value = Cells(3, i).End(xlToRight).Column.Value End If Next i Application.ScreenUpdating = True End Sub Cells(3, i).Value = のあとの指定方法がまずいのかと思いますが。。 どうぞ宜しくお願い致します。

  • VBAのEvaluate()をVBで記述するには

    ExcelVBAで書かれているプログラムをVB(VisualBasic)に書き直していますが、 VBAのコードの中で、別ファイルから任意の数式(例えば「=3600/60+5000」など)を読み込んで、Evaluate()という関数でこの演算結果を取得している部分があるのですが、VBAのEvaluate()の部分をVBで記述することは可能でしょうか。 よろしくお願いします。

  • エクセルVBAとmsg関数

    こんばんは。 エクセルVAB初心者です。 現在、エクセル2003で以下の画像のような 表を作成しました。 上段が請求書データ(シート1)で、 下段が請求書の印刷フォーム(シート2)です。 VBAで実行する処理は、請求書データNOをそれぞれ 任意でクリックし、選択しているNOの行データをシート2にそれぞれ 転記していき、一括で印刷するものです。 以下のように、コードを作りました。 Sub 発行() Dim i As Range Dim m As Integer Dim W1 As String With Selection W1 = Cells(.Row, 1).Value & " ~ " & _ Cells(.Rows.Count + .Cells(1, 1).Row - 1, 1).Value & vbCrLf & _ " の請求書を発行しますか?" m = MsgBox(W1, vbYesNoCancel) If m <> vbYes Then Exit Sub For Each i In .Resize(, 1) With Sheets("Sheet2") .Range("b1").Value = Cells(i.Row, 1).Value .Range("e1").Value = Cells(i.Row, 2).Value .Range("c5").Value = Cells(i.Row, 3).Value .Range("b3").Value = Cells(i.Row, 4).Value .Range("c6").Value = Cells(i.Row, 5).Value .PrintOut End With Next End With End Sub ここで質問なのですが、"の請求書を発行しますか?" の後に、選択している行の数を(合計O枚)のように 表示したいのですが、どのようなコードを入れればいいのでしょうか。 また、メッセージボックスのウインドウの中の文字が 小さいので、もう少し大きくしたいのです。 以上の2点ですが、お願いします。

  • エクセル VBAコードの書き方を教えてください。

    エクセル VBAコードの書き方を教えてください。 今回は、VBAで掛け算をしたいのですが、 コードが間違っているためか実行ができません。 VBAコードのどこに不備があるか教えてください。 <条件> *最終行(H列で判断)を選択し、  I2(2行、I列)~I最終行(最終行,最終行のI列)までの  範囲を計算したい。 *たとえば、I2であれば、F2×G2×H2×0.01の値を代入したい。  I最終行であれば、F最終行×G最終行×H最終行×0.01の値 EX) 添付ファイルの場合、I2=500、I4=125、にしたい。 <参考> Sub SURYO() Dim r As Long With Sheets("Sheet1") For r = 2 Cells(r,9).value = Cells(r,6) * Cells(r,7) * Cells(r,8) Next End With End Sub よろしくお願いします。

  • EXCELのVBAでセル値の移動でエラー

    EXCEL2002のVBAでセル値の移動をVBAでやりたいのですが (1)の様に1行は出来るのですが、(2)の様に2行を移動させるとエラー (実行時エラー1004 アプリケーション定義またはオブジェクト定義のアラーです。)が出てしまいます。 (2)のマクロでどうしてエラーが出るのか分かりません。 エラーを出さずに2行目を移動させる方法を教えてください。 (1)_________________________________________________ If Range("L1") <> detachn Then i = 9 While i >= 1 Cells(1, i + 13).Value = Cells(1, i + 12).Value i = i - 1 Wend Cells(1, 13).Value = Range("L1").Value datachn = Range("L1").Value End If (2)_______________________________________________ If Range("L1") <> detachn Then i = 9 While i >= 1 Cells(1, i + 13).Value = Cells(1, i + 12).Value Cells(2, i + 13).Value = Cells(2, i + 12).Value ←ここでエラー i = i - 1 Wend Cells(1, 13).Value = Range("L1").Value Cells(2, 13).Value = Range("L2").Value datachn = Range("L1").Value End If

  • エクセルでくんだVBAマクロが途中でとまるのですが、

    エクセルでくんだVBAマクロが途中でとまるのですが、 どこがおかしいかご指摘して頂けませんでしょうか? 以下のプログラムは セル(19.6)にxの値を代入し、 E24にそれに対応したyを出力させるプログラムです。 あと余談となりますが、 繰り返し構文は同時に複数の変数はできないのでしょうか? 例えば以下のものは変数iをステップ0.1で加算していますが それに対応して表示させるセルを一つずつずらすために 変数kを指定してfor構文を連立させようとしたのですが うまくいきませんでした。 Sub k() Dim i As Double For i = 0 To 10 Step 0.1 Cells(22 + 10 * i, 7).Value = i Cells(19, 6).Value = i Range("H" & 10 * i + 22).Value = Range("E24").Value Next i End Sub

  • EXCELマクロの処理時間を短縮したい

    EXCELマクロの時間短縮で悩んでいます。どうかお知恵をお貸し下さい。(長文です) Windows XP Pro EXCEL 2002 を使用しています。 以下の作業の2.のところで2分以上 3.のところで2分以上の時間が掛かっています マクロソースによるこれ以上の短縮は望めないでしょうか?  <作業内容> 1. OLEDBを使って他のDBから  トランザクション「A」のデータを シート「A」に  マスタ「M」のデータを シート「M」に展開しています 2. シート「A」のデータは 約40,000件 (変動します)  番号    基本番号+枝番(1桁) 最初は基本番号+0で変更があると枝番をカウントアップして追加  最新番号  変更が合った場合 変更の回数(枝番=0のレコードだけ更新)  コード   名称コード   数量    単価    小数点以下 2桁まで  追加数量    追加単価   番号  |最新番号|コード| 数量 | 単価 | 追加数量|追加単価|   1000010 | 0 |123456| 1,000|100.30| 10|1,000.00|   1000020 | 2 |111111| 1,000|200.50| 1|5,000.00|   1000021 | 0 |111111| 900|200.50| 2|5,000.00|   1000022 | 0 |111111| 1,000|200.00| 1|5,000.00|   1000030 | 0 |123000| 2,500| 90.75| 0| 0.00|   9500010 | 0 |999999| 0| 0.00| 0| 0.00|  これを シート「一覧」に基本番号別に枝番が最新の行をコピーして金額を出します  約 35,000件になります  基本番号 |コード| 名称 | 数量 | 単価 | 追加数量|追加単価| 金額   100001 |123456| | 1,000|100.30| 10|1,000.00|110,300   100002 |111111| | 1,000|200.00| 1|5,000.00|205,000   100003 |123000| | 2,500| 90.75| 0| 0.00|226,875 3. シート「M」のデータは 約30,000件 (変動します)   コード |  名称  |    111111| AAAAAAAAAA | 123000| ABCDEFGHIJ | 123456| BBBBBBBBBB |  シート「一覧」の名称に名称を入れます  基本番号 |コード|  名称 | 数量 | 単価 | 追加数量|追加単価| 金額   100001 |123456|BBBBBBBBBB| 1,000|100.30| 10|1,000.00|110,300   100002 |111111|AAAAAAAAAA| 1,000|200.00| 1|5,000.00|205,000   100003 |123000|ABCDEFGHIJ| 2,500| 90.75| 0| 0.00|226,875 <マクロ ソース> Sub 一覧作成() Dim i As Long, j As Long, k As Long, read_no As Long Dim jlist As Worksheet, jdata As Worksheet Dim v As Variant, w As Variant Dim dic As Object Application.ScreenUpdating = False '画面停止 'DB取り込み ※省略 Set jlist = Worksheets("一覧") '処理2 Set jdata = Worksheets("A") jlist.Cells.ClearContents jlist.Range("A1").Value = "基本番号" jlist.Range("B1").Value = "コード" jlist.Range("C1").Value = "名称" jlist.Range("D1").Value = "数量" jlist.Range("E1").Value = "単価" jlist.Range("F1").Value = "追加数量" jlist.Range("G1").Value = "追加単価" jlist.Range("H1").Value = "金額" i = 2 '今読んでる行 k = 2 '書いている行 j = 0 '枝番が合った場合 飛ばす行 read_no = 0 Do While jdata.Cells(i, 1).Value < 9500000 read_no = jdata.Cells(i, 1).Value / 10 j = 0 If jdata.Cells(i, 2).Value <> 0 Then '枝番有 j = judata.Cells(i, 2) End If i = i + j jlist.Cells(k, 1).Value = Format(read_no, "000000") jlist.Cells(k, 2).Value = jdata.Cells(i, 3).Value jlist.Cells(k, 4).Value = jdata.Cells(i, 4).Value jlist.Cells(k, 5).Value = jdata.Cells(i, 5).Value jlist.Cells(k, 6).Value = jdata.Cells(i, 6).Value jlist.Cells(k, 7).Value = jdata.Cells(i, 7).Value jlist.Cells(k, 8).Value = _ Application.RoundDown((jdata.Cells(i, 4).Value * jdata.Cells(i, 5).Value + _ jdata.Cells(i, 6).Value * jdata.Cells(i, 7).Value), 0) k = k + 1 i = i + 1 Loop Set jname = Worksheets("M") '処理3 With jname With .Range("B2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Columns(1).Value w = .Columns(2).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With jlist With .Range("B2", .Cells(Rows.Count, 4).End(xlUp)) 'B2~Dの最終行まで v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 2) = w(dic(v(i, 1)), 1) Else v(i, 2) = "無" End If Next With .Offset(0, 0) .ClearContents .Value = v End With End With End With Set dic = Nothing Set jlist = Nothing Set jname = Nothing Application.ScreenUpdating = True End Sub

  • エクセル VBAについて。その2

    以前、こちらの掲示板でお世話になった者です。   Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address Case "$C$5" Select Case Target.Value Case 1 Range("C6").Value = 24 Range("D5").Value = 600 Range("D6").Value = 0 Range("E5").Value = 400 Range("E6").Value = 0 Case 2 Range("C6").Value = 32 Range("D5").Value = 1000 Range("D6").Value = 0 Range("E5").Value = 500 Range("E6").Value = 0 End Select Case "$D$5" Select Case Range("C5").Value Case 1 Range("D6").Value = (600 - Range("D5").Value) / 25 Case 2 Range("D6").Value = (1000 - Range("D5").Value) / 25 End Select Case "$E$5" Select Case Range("C5").Value Case 1 Range("E6").Value = (400 - Range("E5").Value) / 50 Case 2 Range("E6").Value = (500 - Range("E5").Value) / 50 End Select と、上記のようなマクロがお手伝いしていただいた結果、完成しました。 C5に1を代入した場合 D5 = 600 D6 = 0 E5 = 400 E6 = 0 C5に2を代入した場合 D5 = 1000 D6 = 0 E5 = 500 E6 = 0   C5に1を代入しており、D5の値を500に下げた時 D6 = 4 (D5の値を100下げる毎にD6の値に+4 ) (D5の値を100上げる毎にD6の値に-4 ) C5に1を代入しており、E5の値を300に下げた時 D6 = 4 (E5の値を100下げる毎にE6の値に+4 ) (E5の値を100上げる毎にE6の値に-4 ) <以下、C5に2を代入した時のケースを省略。>   というような意味合いのマクロになったと思いますが、少々困ったことが発生しました。 (D5の値を100下げる毎にD6の値に+4 ) (D5の値を100上げる毎にD6の値に-4 ) (E5の値を100下げる毎にE6の値に+4 ) (E5の値を100上げる毎にE6の値に-4 ) この部分を (D5の値を100下げる毎にD6の値に+4 ) (D5の値を100上げる毎にD6の値に-8 ) (E5の値を100下げる毎にE6の値に+4 ) (E5の値を100上げる毎にE6の値に-8 ) に変更したいのですが、計算式がわかりません(?ω?) どなたかご指導のほどよろしくお願いします。

  • EXCEL2000 VBAにてセルの入力制限とon errorについて

    数値のセルに文字列をいれるとVBAがこけてしまいます。 入寮制限をかけたいのですが、on errorのかけ方がわかりません。 どこでこけるかというと acount(0) = Format(Cells(i + 1, 6).Value) * Format(Cells(i + 1, 7).Value) acount(1) = acount(0) + acount(1) '原価*数量=部品原価 acount(2) = Format(Cells(i, 6).Value) * Format(Cells(i, 7).Value) acount(3) = acount(2) + acount(3) '売上単価*数量=部品代 acount(4) = Format(Cells(i, 9).Value) acount(5) = acount(4) + acount(5) '工賃(売上) acount(6) = Format(Cells(i + 1, 9).Value) acount(7) = acount(6) + acount(7) '工賃(原価) というような計算式において、数値が入力されていないと 計算ができず、こけてしまいます。

専門家に質問してみよう