• ベストアンサー

エクセルマクロ変数を使った計算式

エクセル2003です。 Cells(標準値合計場所, 処理列).Value = "=SUM(Cells(10,処理列):Cells(最終行,処理列)" これですと、指定したセルの Cells(標準値合計場所, 処理列)には ダブルクォーテーションに囲われた間は固定編集された文字列として扱われるので =SUM(Cells(10,処理列):Cells(最終行,処理列) という文字がセットされてしまい 求めている、範囲の合計値がセットされません。 どこをどのように修正すればいいか教えてください。

  • gx9wx
  • お礼率95% (440/460)

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

  • ベストアンサー
  • ottimisto
  • ベストアンサー率72% (8/11)
回答No.2

Cells(標準値合計場所, 処理列).Value = "・・・" は、Valueに、"・・・"という文字列を代入してしまいます。 Cells(標準値合計場所, 処理列).Value = WorksheetFunction.Sum(Range(Cells(10,処理列), Cells(最終行,処理列))) にしましょう。

gx9wx
質問者

お礼

ありがとうございます。 ネットでは演算子と変数は ダブルダブルクォーテーションで くくる事 と有ったのですが、どこにどういれても コンパイルエラーで駄目でした。

gx9wx
質問者

補足

ありがとうございます。 こちらは思っていたとうり動くのですが なぜSUMの場合はWorksheetFunction.Sumなのでしょうか? Cells(処理行, 見積値列).Value = Cells(処理行, 13) * Cells(処理行, 処理列) * Cells(処理行, 14)

その他の回答 (2)

  • ottimisto
  • ベストアンサー率72% (8/11)
回答No.3

1.“なぜSUMの場合はWorksheetFunction.Sumなのか?”について ちょっとプログラムの専門的な話しになってしまいますが…、 VBAでプログラムを作成する場合、Sumが何であるのかを定義してあげる必要があります。 合計を計算するために、そのはたらきをしてくれる「WorksheetFunctionというクラスの、Sumを使うんだよ~」と宣言しないといけません。 エクセルシート上で「=SUM()」と記述すると合計を計算してくれるのは、“WorksheetFunction.を使うのが当たり前だから、省略してしまいましょう”ということだと思って下さい。 2.“ダブルコーテーションでくくる事”について これは、No.1のpidumさんの説明にある、.Formulaを使用する場合のことです。 .Valueに使用すると、ダブルコーテーションの中身の文字列をセルに代入する、という意味になりますので、全くことなる動作となります。

gx9wx
質問者

お礼

返事送れて すいません。 ありがとうございました。

noname#203218
noname#203218
回答No.1

Cells(標準値合計場所, 処理列).Formula = _ "=SUM(" & Cells(10, 処理列).Address(False, False) & ":" & _ Cells(最終行, 処理列).Address(False, False) & ")" 式を挿入しようとしているのでValueではなく、Formulaになります。 変数に漢字を使用するのは間違いの元になるので感心しませんが・・・・

gx9wx
質問者

お礼

すいません。 変数が漢字でないと組めないんです。 これは式をセルに挿入でしょうか? 質問説明不足ですいません。 式は残さず値だけをセットしたいです。

関連するQ&A

  • エクセルマクロで計算すると遅い

    エクセル2013です。 表に対して、いろいろな処理を行い 要求された結果になるようにマクロを作成し完成しました。 思ったように動作するのですが処理時間が長すぎます。 自分で調べて、以下の部分が処理を遅くしている原因とわかりました。 ただの計算ですが、シート内に計算式や関数は残したくなくて このようにしましたが、別の方法が浮かびません。 どのような方法が有りますでしょうか? よろしくお願いします。 表は600行、50列。 17列目から49列目までの10行目から595行目までにデータがあります。 50列目は合計値用の空欄です。8行目は項目欄です。 インプットボックスは18~48までしか入力できないようにしてあります。 17列目からインプットボックスで入力した列までの合計値を インプットボックスで指定した列のひとつ前の列に1行づつ処理して転記。 17列目からインプットボックスで指定した列の1列前までまとめて列削除 その後17列目から削除され残った最終列の1列前までの合計値を最終列に転記で 1行づつ処理です。 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 遅延合計欄列 = 選択列 - 1 'INPUT-BOXで選択した列の1列前の列番号を格納。この列に合計値を転記する為 遅延合計末列 = 選択列 - 2 'INPUT-BOXで選択した列の2列前を格納。ここまでの列を削除する為 Cells(8, 遅延合計欄列).Value = "遅延" 'INPUT-BOXで選択した列の1列前の列の8行目を「遅延」と転記しこの列に合計を転記する Cells(8, 遅延合計欄列).Font.Color = -16776961 Cells(8, 遅延合計欄列).Font.Size = 15 Range(Cells(10, 遅延合計欄列), Cells(最終行, 遅延合計欄列)).Interior.Color = 65535 For 計算行 = 10 To 最終行 '10行目から最終行まで繰り返す '17列目からINPUT-BOXで選択した列の1列前の列までの合計値を1列前の列に転記する。10行目から最終行まで Cells(計算行, 遅延合計欄列).Value = WorksheetFunction.Sum(Range(Cells(計算行, 17), Cells(計算行, 遅延合計欄列))) Next 計算行 Range(Columns(17), Columns(遅延合計末列)).Delete '17列目からINPUT-BOXで選択した列の2列前までを列削除 最終列2 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行2 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 For 合計行 = 10 To 最終行2 '10行目から最終行まで繰り返す '17列目から最終列の1列前までの合計数数を最終列に転記 Cells(合計行, 最終列2).Value = WorksheetFunction.Sum(Range(Cells(合計行, 17), Cells(合計行, 最終列2 - 1))) Next 合計行

  • エクセル マクロで行の合計を数値で入力したい

    マクロ初心者です。 F列からAJ列までの合計をAK列に数値で入力しようとしています。 ただし、FからAJ列の各セルに全てデータは入っていません。 したがってFからAJ列のいずれかにデータが入っている最終行を 見つけて合計を算入しようとしているのですが下記の通りやっても うまくいきません。教えてください。 エクセルのバージョンは2002です。 Sub () 'データが入っている最終行まで合計額を数字で入力 LastRow = Cells(65536, COL).End(xlUp).Row For i = LastRow To 6 Step -1 Set myRange = Range(Cells(i, 6), Cells(i, 36)) Cells(i, 37).Value = WorksheetFunction.Sum(myRange) Next i End Sub

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

    エクセル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

  • セルの値が0はクリアするマクロ

    エクセル2003です。 ある集計表において 4行目のH列からAM列まで 数値データがあります。 最終行は常に変化します この表内にてセルの値が0のセルは セル内を空白にしたいです。 以下のマクロを作成しましたが If Cells(処理行, 8).Value = 0 Then Cells(処理行, 8).ClearContents をあと(処理行, 13)から(処理行,31) まで記述しなければなりません。 構文的にも処理的にも不利? と思うので、なにかいい方法を教えてください。 Sub 数字0クリア() '2012年2月3日節分 Dim 最終行 '最終列をG列で求めます 最終行 = Cells(Rows.Count, 7).End(xlUp).Row Application.ScreenUpdating = False For 処理行 = 4 To 最終行 If Cells(処理行, 8).Value = 0 Then Cells(処理行, 8).ClearContents End If If Cells(処理行, 9).Value = 0 Then Cells(処理行, 9).ClearContents End If If Cells(処理行, 10).Value = 0 Then Cells(処理行, 10).ClearContents End If If Cells(処理行, 11).Value = 0 Then Cells(処理行, 11).ClearContents End If If Cells(処理行, 12).Value = 0 Then Cells(処理行, 12).ClearContents End If If Cells(処理行, 13).Value = 0 Then Cells(処理行, 13).ClearContents End If Next 処理行 Application.ScreenUpdating = True MsgBox "終了しました" End Sub

  • エクセル2003 計算されないようにしたい

    例 A列     B列  1     =A1+A2  2     =A2+A3  3     =A3+A4 (A4は空白です) となっている場合に B1=3 B2=5 B3=3 になると思うんですが この時に空白のセルと計算結果を出すときは0もしくは 計算されないようにしたいです。 最終的にB列にSUM関数を使って合計を出したいのですが A列に求めたい数字が片方しか入ってない場合 (数字が入っているセル+空白セル)はSUM関数の合計に入れたくないです。 なので上記の例では B列にSUM関数をした場合11ではなく8にしたいです。 それには文字列を入力して#VALUE!にするしかないですか? でもその状態にしてSUM関数で合計を出したときも#VALUE!になってしまいます。 よろしくお願いします。

  • エクセルマクロでセルの結合をしたい

    エクセル2003です。 E列の値は昇順で並んでいます。 先頭E3行から下の行の値と比較し 同じ値の場合はセルを結合し 値が違う場合は結合しないで次の行を比較という処理を 最終行まで行いたいです。 (添付画像参照) 例えば E3-AA E4-BB E5-BB E6-CC E7-DD E8-EE E9-EE E10-EE E11-FF セルE4とE5を結合します セルE8とE9とE10を結合します。 次に結合した行と同じ行数のF列を結合します。 さらに結合した行と同じ行数のG列を結合します。 上記の場合 セルF4とF5を結合、 セルF8とF9とF10を結合します。 セルG4とG5を結合、 セルG8とG9とG10を結合します。 さらに結合した行と同じ行数のA列を結合します。 上記の場合 セルA4とA5を結合、 セルA8とA9とA10を結合します。 さらに結合したA列に数字を入力します A4とA5を結合したA4、A5セルには 2行を結合したので2と入力 セルA8とA9とA10を結合したA8、A9、A10セルには 3行を結合したので3と入力。 とりあえず、E列の結合を完成させてそのE列を 3行目から最終行までコピーして、 「形式を選択して貼付」の「書式」で 書式のみをF,G,A列にコピーすれば出来るのではと 以下の構文を作成しました。 セルの結合時は結合するセルの先頭の行の値が結合済セルの値に なるので最初にE列を結合していく時に A列に結合回数を記入しようと考えました。 ただ2行の結合は、A列に2と入力されたのですが 3行連結した時も2と入力されてしまったので改造しました。 テストデータでは期待しているようになったのですが 本番データでは結合される行が4行、5行等それ以上の行数が 結合する場合が有りこの構文ではなるべくしてなっているのですが 4行以上の行結合はA列の値はいずれも3になってしまいます。 (添付画像参照) どう修正すればいいか手段が考え付きません。 どのような方法がありますでしょうか? よろしくお願いします。 Sub セル結合2() '2013年10月25日 Dim 最終行 As Integer Dim 処理行 As Integer Dim 比較行 As Integer Dim 確認値 As Variant Dim 比較値 As Variant Dim 結合回数 Dim 戻行 Application.ScreenUpdating = False ThisWorkbook.Sheets("Sheet1").Select 最終行 = Cells(Rows.Count, 5).End(xlUp).Row 'F列の最終行を求めます。 Application.DisplayAlerts = False For 処理行 = 3 To 最終行 '3行目から最終行の前まで繰り返します。 比較行 = 処理行 + 1 '処理行の一つ下の行と比較します。→比較行とします。 確認値 = Cells(処理行, 5).MergeArea(1, 1).Value 'チェックする値を、確認値に代入します。 比較値 = Cells(比較行, 5) '比較する値を、比較値に代入します。 If 確認値 = 比較値 Then '値が同じかどうか Range(Cells(比較行, 5), Cells(処理行, 5)).MergeCells = True 結合回数 = Cells(処理行, 1) + 1 'セルを結合した回数 戻行 = 処理行 - 1 '処理行の1行上の行数を戻行とする Cells(処理行, 1) = 結合回数 '処理行のA列に結合回数を記入 Cells(比較行, 1) = 結合回数 '比較理行のA列に結合回数を記入 If Cells(処理行, 1) >= 3 Then 'もしも処理行のA列が3以上の場合 Cells(戻行, 1) = 結合回数 '戻り行のA列に結合回数をセット End If '同じでない場合は以下へ End If '同じでない場合は以下へ Next 処理行 Application.DisplayAlerts = True Application.ScreenUpdating = True Range(Cells(3, 5), Cells(最終行, 5)).Copy Range(Cells(3, 6), Cells(最終行, 6)).PasteSpecial Paste:=xlPasteFormats Range(Cells(3, 7), Cells(最終行, 7)).PasteSpecial Paste:=xlPasteFormats Range(Cells(3, 1), Cells(最終行, 1)).PasteSpecial Paste:=xlPasteFormats Application.CutCopyMode = False MsgBox "終了しました" End Sub

  • エクセル マクロ 教えてください。

    sheet1に (a1=No. b1=月日 C1=項目 d1=収入 e1=支出 f1=摘要 G1=店名)項目を作りそれらをユーザーフォームを作り入力したいです。 この記述では上手く動けません。教えてください。 Private Sub CommandButton1_Click() Dim r As Long, 最終行 As Long, 項目行 As Long Dim re As String r = textboxs1.Value + 10 最終行 = Worksheets("入力").Range("B65536").End(xlUp).Row If r <= 最終行 Then re = MsgBox("訂正" & " " & "すでにデータが入力されています。" & Chr(13) & _ Chr(13) & "データを置き換えます。 本当に良いですか? ", _ Buttons:=vbYesNo + vbExclamation, Title:="注意!!") If re = vbYes Then With Worksheets("入力") .Cells(r, 2).Activate .Cells(r, 1).Value = TBox1.Value .Cells(r, 2).Value = TBox2.Value .Cells(r, 3).Value = ComboBox1.Value .Cells(r, 4).Value = TBox3.Value .Cells(r, 5).Value = TBox4.Value .Cells(r, 6).Value = TBox5.Value .Cells(r, 7).Value = ComboBox2.Value End With データクリア Exit Sub End If データクリア Exit Sub End If If r >= 最終行 + 1 Then r = 最終行 + 1 End If With Worksheets("入力") .Cells(r, 1).Value = TBox1.Value .Cells(r, 2).Value = TBox2.Value .Cells(r, 3).Value = ComboBox1.Value .Cells(r, 4).Value = TBox3.Value .Cells(r, 5).Value = TBox4.Value .Cells(r, 6).Value = TBox5.Value .Cells(r, 7).Value = CBomboox2.Value End With データクリア End Sub r = データNo + 10 With Worksheets("入力") .Activate .Cells(r, 2).Select TBox1.Value = .Cells(r, 1).Value TBox2.Value = .Cells(r, 2).Value ComboBox1.Value = .Cells(r, 3).Value TBox3.Value = Format(.Cells(r, 4).Value, "###,###") TBox4.Value = Format(.Cells(r, 5).Value, "###,###") TBox5.Value = .Cells(r, 6).Value ComboBox2.Value = .Cells(r, 7).Value End With Exit Sub End If If データNo > 最終行 - 10 Then データNo = 最終行 - 9 TBoxNo.Value = データNo データクリア End If End Sub

  • エクセルマクロ インプットボックスの使い方

    エクセル2013です。 マクロの途中で作業者にマウスで列を選択してもらい その取得した列番号を使って、いろいろ処理を行うマクロを作りました。 Sub 実験() Dim マウス選択 As Range Dim 選択列 Dim 選択月表示 Dim 質問 Dim 最終列 Dim 最終行 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 On Error GoTo myError Set マウス選択 = Application.InputBox("編集したい月の列を選択してください", Type:=8) 選択列 = マウス選択.Column 選択月表示 = Cells(8, 選択列).Value 質問 = MsgBox("選択した月は " & 選択月表示 & " です。いいですか?", vbYesNo) If 質問 = vbYes Then MsgBox "処理を行います" Else MsgBox "プログラムを中断します" Exit Sub End If ---処理内容---- myError: MsgBox "キャンセルが押されました。プログラム終了します。" End Sub 通常列を選択してくれればインプットボックス内には $V:$V などと表示されますが 行を選択されると $35:$35 などと表示され セルの一部を選択されると $D$40 などと表示されます。 行やセルを選択してもエラーなく最後まで進みますが選択した場所によっては とんでもない結果になってしまいます。 基本、列以外を選択したらメッセージボックスでアラームするか プログラムを停止させたいのですがどのような方法が有りますでしょうか? よろしくお願いします。

  • Excelマクロ 計算式を足していく

    Excel2003を使用しています。 マクロで、伝票を追加して行き、追加する度に合計のセルにある計算式を 前の伝票の計算式と合算させたいのですが、うまく行きません。 1枚目の合計 =Sum(A4:A17) 2枚目の合計 =Sum(A22:A35)+1枚目の合計 3枚目の合計 =Sum(A40:A53)+1枚目の合計+2枚目の合計 ※合計の計算式は18行毎に入ります。 伝票の枚数は決まっていませんので、何枚追加しても合算出来る様にと考えています。 Formulaを使ってセルの計算式を取得し、2枚目の計算式と合算は出来るのですが、 3枚目4枚目となっていく時の記述がイマイチうまく出来ません。 sikiA = Range("A18").Formula ←1枚目の合計 siki1 = sikiA & "+" & Cells(18 * cnt, 1) ←2枚目の合計と1枚目の合算 ※「cnt」は伝票の枚数です。 sumの部分は、伝票の追加の時点で計算式が入ります。 なので、伝票をコピー&貼り付けした時点で、合算している計算式を入れてしまった方が 良いのかなとは思いましたが、思うように行っていません。 よろしくご教授下さい。

  • エクセルマクロ行削除

    エクセル2013です。 以下の行削除マクロを作りました。 取得した 最終行が20行目として 最終列がZ列として セル Z20 の値が 1以上なら問題なく動作するのですが セル Z20 の値が 0 だとループして終了しません。 どこを修正しても、思うように動作しません。 どこを修正すれば、いいのでしょうか? よろしくお願いします。 Sub 行削除() Dim 最終行 Dim 最終列 Dim 対象行 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 Application.ScreenUpdating = False '画面切替停止 For 対象行 = 10 To 最終行 If Cells(対象行, 最終列) = 0 Then Rows(対象行).Delete 最終行 = 最終行 - 1 '削除により最終行が1行減ったので最終行の値を1行減らす 対象行 = 対象行 - 1 '削除により対象行が1行繰り上がったので対象行の値を1行減らす Else End If Next 対象行 Application.ScreenUpdating = True '画面切替停止解除 End Sub

専門家に質問してみよう