• 締切済み

VBAに関数を入れる方法

VBA記述の中に、例えばAVERAGE関数を入れないのですが良く判りません。 もし、A1からA500位までにデータがあって、B20位から下位行にA列と平行して平均値を求めたい場合DO ~ LOOPで繰り返すのですが、B20にセルを置き ActiveCell.Formula = ”=AVERAGE(A1;A20)” の様な時に、もしA1なりA10なりに変数を使用したい場合には、”=AVERAGE(A1;A20)” の部分はどのように記述すればいいのでしょうか?。 よろしくお願いします。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

セルに関数式を入れ込まないで、例えば Sub test01() Range("B1") = Application.WorksheetFunction.Average(Range("a1:A3")) End Sub ともできます。 関数の良さは、対象セルのデータ変化に即座に反応すること。 欠点はエクセルの動作に負担をかけることでしょうか。 上記はAverage(Range("a1:A3"))の部分を Range(Cells(・・),Cells(・・))とプログラムで実行中に可変化できることです。

noname#203429
質問者

お礼

ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。
  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.1

文字や変数は & でつなぎます hajime = "1" owari = "20" ActiveCell.Formula = "AVERAGE(A" & hajime & ";A" & owari & ")" で、どうでしょうか たぶん、 hajime = "1" は hajime = 1 でも、OKだと思います(数値でも大丈夫)

noname#203429
質問者

お礼

どうもありがとうございました。早速やってみます。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 簡単に書けば、これでよいのでは? Range("B20:B500").FormulaLocal = "=AVERAGE(R[-19]C[-1]:RC[-1])" 可変範囲なら、以下のようにすればよいです。 ただし、B列のデータは消去していませんので、必要あれば、B列をClearContents メソッドを使って消してください。 Sub testPutFormula() Const CNT As Integer = 20 '行範囲 ←ここを換える  With Range("A1", Range("A65536").End(xlUp))   .Offset(CNT - 1, 1).Resize(.Count - CNT + 1, 1).FormulaLocal = "=AVERAGE(R[-" & CStr(CNT - 1) & "]C[-1]:RC[-1])"  End With End Sub

noname#203429
質問者

お礼

ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excel VBAで、Averageの範囲を変数を使って記述したい。

    VBA初心者です。 例えば、 n=1~26 n=1の時 Range(A1:Z1).Formula=("=average(A2:A5)") n=2の時 Range(B1:Z1).Formula=("=average(B2:B5)") n=3の時 Range(C1:Z1).Formula=("=average(C2:C5)") (以下、n=26まで続く) これを変数を使って、すっきり記述するにはどうすればよいのでしょうか?よろしくお願いします。

  • エクセルVBAでセルのクリックイベントについて

    エクセルのVBAでDo Whileループの中で,いずれかのセルがクリック され(アクティブ)になったことを知る方法が分かりません。 調べたいセルの個数は数十個で,セルのクリックを連続的に行い, その度に,ある操作を行いたいのです。 Do while flag=true   if ActiveCell.Address="A1" then ****   if ActiveCell.Address="A2" then ****   if ActiveCell.Address="A3" then ****   (これをいくつか記述)   (ループから抜け出る記述) loop これだと,無限ループに陥ってしまいます。 どなたか,お知恵をお貸しください。

  • VBAについて

    いつもお世話になっています マクロ・VBA超初心者です。 質問させてください。 現在シート1の完売のセルの欄に○が入っていれば日付をみてシート2の同じ日付の隣のセルに○を入力しようと思っているのですが、シート2の日付を検索はしているんですが入力がいきません Sheet1  ↓セルA1 ↓セルB1  5月26日   26           B1のセルはDAY(A1)にて出してます         完売  A氏     ○             Sheet2  ↓A列   ↓B列 5月  1日  ・  ・  ・  26日    ○           ←シート1の所に○が付いているとシート1セルB1と同じ  27日                  日付の隣のセルに○を入力  28日 VBA Sub test() Sheets("Sheet2").Select Range("A1").Select Do Until ActiveCell = "" ActiveCell.Offset(1, 0).Activate If ActiveCell.Value = Worksheets("Sheet1").Range("B2") Then ActiveCell.Offset(0, 1).Activate If ActiveCell.Value <> "○" Then ActiveCell.Valu = "○" ActiveCell.Offset(0, -1).Activate Else ActiveCell.Offset(0, -1).Activate End If Else End If Loop Sheets("Sheet2").Select Range("A1").Select End Sub どこが間違っているかわからない状態です。 分かりにくい説明ではあるんですが教えてください お願いします。

  • エクセルVBAでの関数

    下記、コードでセルに関数を入れるようにしてるのですが 関数で得られた値をセルに反映されるようにしたいのですが Dimを使用してもどう指定してよいのかわからず苦戦しております。 宜しくお願い致します。 Range("F1").Select Do Until ActiveCell.Offset(0, -1).Value = ""       With ActiveCell .FormulaR1C1 = "=MID(RC[-1],2,3)" .Offset(1, 0).Select End With Loop Range("A1").Select Do Until ActiveCell.Offset(0, 2).Value = "" With ActiveCell .FormulaR1C1 = "=RC[11]&RC[5]&Rc[8]&rc[9]&rc[3]" .Offset(1, 0).Select End With Loop

  • VBA セル内の関数の参照先

    あるExcel2000のファイル セル A1に20 A2に30 A3に50 A4に10 A5に60 セル B1に30 と表示されています B1の中は =Average(A2:A4) となっています 私はVBAでこのB1の中のAverage関数の参照先を取得したいのですがその方法が分かりません 例えば A=Cells(1,2)や A=Range(B1) としても変数Aは当然ですが30となってしまいます EXCELの関数でセルの中にある関数や参照先を抽出出来るものがないかと探して見ましたが私には見つける事が出来ませんでした。 セルの中にある関数、もしくはその関数の参照先を抽出する方法は無いのでしょうか よろしくお願いします。

  • ☆Excel VBAでAVERAGE関数を使うとき・・・

    こんにちは。VBA初心者です。 VBAでAVERAGE関数を使いたいのですが、参照範囲を最終行まで指定したい場合、 どのようプログラムすれば良いのでしょうか?     A   B   C    1 5000  2 2000  3 3000  4 1000  5 6000  6  :  7  :    ← A列の値を平均する。           A列には膨大な行が存在すると仮定します。 VBAに詳しい方、教えてください。 どうか、よろしくお願いしますm(_ _)m

  • マクロよ動け

    VBA 難民です。 Excel で、左のセルが空白の場合、印刷文字を見えなくするつもりのマクロを作ってみましたが、知らん顔をされます。声の掛け方がまだよくわかってないのです。 こっちを向かせる方法を教えて下さい。よろしくお願いします。 Sub MacroWhiter() Dim a As Variant Dim b As Variant a = ActiveCell.Value b = ActiveCell.Offset(0, -1).Value '一つ左のセルの値 Range("B1").Activate 'ここから始める Do Until IsEmpty(ActiveCell.Value) '空きセルまで続ける If b = 0 Then 'ゼロの場合 ActiveCell.Font.Color = 2 '文字を白色にする ActiveCell.Offset(1, 0).Activate '下の行に移る End If Exit Do Loop '繰り返す a = ActiveCell.Value

  • EXCEL2010のAVERAGE関数について

    こんばんは。 EXCEL2010ですが、同じデーターを使ってワークシートでAVERAGE関数を使って求めた平均値とVBAでApplication.Averageで求めた平均値が違います。 扱っているデーターは少数点以下桁数が20桁数の数値です。 小数点第8位まではあっているのですが、その後は違います。 例 0.00000138786111098443 0.00000137878257235606 0.00000138192909756498 普通にセルにAVERAGE関数を使って平均値を出すと 0.00000138285759363516 VBAでApplication.Avarageを使って平均値を出すと 0.00000138489510427471 (変数のデーター型はDoubleを使用) これは誤差範囲になるのでしょうか? またそれが誤差であれば、どちらが真の値になるのでしょうか? ご教授頂きたくよろしくお願いします。 <追伸> なぜVBAで平均値を求めるかというと、 平均する数の値が固定ではなくCASE毎に変動するVBAを作っています。 上記のVBAを完成し答え合わせした所、違う結果になってしまいました。 いろいろ変数のデータ型を変えたりしたのですが、解決しませんでした。

  • Excel_VBAでセル参照式を変更するには?

    あるシートのA1セルに、他シートセルの参照式を入れたく思います。 シート名は固定ですが、セルは下・右に移動させるため変数としています。 例えば、Sheet_1シートA列のrow_1を1-10までDO文でまわす場合に、行も数字で表記されてしまうため下記では参照式が成立しません。  cell_formula = "Sheet_1!" & row_1 & col_1  ActiveCell.Value = "=" & cell_formula 上記だと「cell_formula = Sheet_1!11」となってしまい、希望する「Sheet_1!A1」とならないのでエラーとなります。 間に変換式を入れることで、「Sheet_1!A1」と変えられないでしょうか? 説明が悪いようでしたら補足しますので、よろしくお願い致します。

  • Excel2013>VBA>sendkeys動ず

    Excel2013のVBAを使って自動更新をしようと思っています。    A  B   C 1  あ  AA  0 2  い  AB  1 3  う  AC  0 4  え  AA  1 5  お  AA  0 上記のようにシート内にデータはあります。B列「AA」C列の「ゼロ」を更新してC列の値を「1」にしようとしたときに、ピボットテーブルを使ってみようと思いました。 ピボットテーブルにてB列の「AA」、C列の「ゼロ」を抽出表示しました。   A  B  C 1 あ  AA  0 5 お  AA  0 思っていたように1行目と5行目が抽出されました。 後はゼロを別の値(仮に「2」とします)に変更するときに、カーソルの移動がうまくいきませんでした。 Range("C1").End(xlDown).Select Do ActiveCell.Offset(0, 0) = "2" ActiveCell.Offset(-1, 0).Select If Len(ActiveCell.Offset(0, 0)) = 0 Then Exit Do End If Loop しかし、これではカーソルが「C4」に移動してしまいました。 ピボットテーブルでたたんでしまっても、カーソルは見えないセルに移動するようです。 そこで、下記のように変更しました。 Range("C1").End(xlDown).Select Do ActiveCell.Offset(0, 0) = "2" Application.SendKeys "{UP}" If Len(ActiveCell.Offset(0, 0)) = 0 Then Exit Do End If Loop これは、カーソルがまったく動かずに最初の地点にいたままでした。 そこで、次はTABで移動することにしました。 Range("C1").Select Selection.SpecialCells(xlCellTypeVisible).Select Do ActiveCell.Offset(0, 0) = "2" Application.SendKeys "{tab}" If Len(ActiveCell.Offset(0, 0)) = 0 Then Exit Do End If Loop これでもカーソルは動きませんでした。 どうにかしてsendkeysの動かし方、もしくは更新でもっとうまいやり方をご存知の方、是非教えてください。よろしくお願いいたします。

専門家に質問してみよう