• ベストアンサー

Excel VBAで、ワークシート関数に変数を使いたいのですが?

VBA初心者です。 例えば1次式y=mx+bのmとbを取得するために、 Selection.FormulaArray = "=LINEST(A2:C2,A3:C3)" と記述した場合、例えば範囲A3:C3のC3を変数として指定する事はできるのでしょうか? 2次式の場合は、 Selection.FormulaArray = "=LINEST(A2:C2,A3:C4)" 3次式の場合は、 Selection.FormulaArray = "=LINEST(A2:C2,A3:C5)" となるので, If N次式 then Selection.FormulaArray = "=LINEST(A2:C2,A3:C?)" End If の?に適切な値を変数を使って入れたいのですが・・・。 質問が解りにくくて申し訳ないですが、よろしくお願いします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

mumu001様 #3 のWendy02です。 最初に、以下は、間違いでした。みなさんのコードとあわせるために、オンラインで訂正したのが、いけませんでした。 訂正前 7行目の ×  Addr = Range("A3:C3").Resize(Cnt).Address(0, 0)    ↓   Addr = Range("A3:C3").Resize(n).Address(0, 0) となります。これは、説明する必要もありませんが、行の範囲を、次数で、Resizeで広げています。   Ret = Evaluate("LinEst(A2:C2," & Addr & ")")  このRet の解は、配列で出力されます。なぜ、WorksheetFunction で行わないかというと、そのまま、Rangeオブジェクトを入れたらエラーが出ました。おそらく、引数自体も、1次元配列を取るのではないでしょうか?そうすると、Rangeオブジェクトは、Value化しても、2次元配列ですから、1次元に戻す変換コードが必要になってしまいます。その手間を省くために、配列がそのままでもよい、Evaluate で、ワークシートの関数を使いました。    i = UBound(Ret) - LBound(Ret) + 1  これは、その配列を取り出すために、解の数を数えています。  通常は、UBoundで、添え字の上限に、「+1」を足せばよいのですが、場合によって、Option Base 1 の添え字の下限の数を変えている可能性がありますから、そのために、そのような式になっています。   ActiveCell.Resize(i).Value = Ret Ret の中には、複数の解が入って、それは配列状態になっていますから、それを、1つずつセルに収めるには、その範囲を取って貼り付けてやらなくてはなりません。そのために、Resizeで、行の範囲を広げています。 これは、Excelのシートに書き出しているのですが、解が1つなら1行、解が2つなら2行というようにしています。 余計に話がややこしくなったかもしれませんね。

mumu001
質問者

お礼

丁寧な説明ありがとうございました。 一読しただけでは、到底理解できそうもありませんのでじっくり調べてみたいと思います。ただ、Wendy02さんの理解の深さに驚くばかりです。(プログラミングをお仕事とされている方と想像します)

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#1ですが、n+2しないとダメですね。 間違えました

mumu001
質問者

お礼

訂正のお返事ありがとうございました。 これからも質問することがあると思いますが、よろしくお願いします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 VBAなら、そのまま、VBAで出力すればよいと思いますね。 目的が違うのでしょうか?ユーザー定義関数という手もないわけではありませんが・・・。 Sub LinestTest() Dim Addr As String Dim n As Integer Dim Ret As Variant Dim i As Long   n = 2 '次数   Addr = Range("A3:C3").Resize(Cnt).Address(0, 0)   Ret = Evaluate("LinEst(A2:C2," & Addr & ")")   i = UBound(Ret) - LBound(Ret) + 1   ActiveCell.Resize(i).Value = Ret End Sub

mumu001
質問者

お礼

お返事ありがとうございます。 なにぶん初心者なもので、処理のプロセスが理解できません。ヘルプ等で調べてみますが、お手数でなければ解説していただけませんでしょうか?

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

A1セルにNが入っているものとします。 Sub test01() n = Range("A1").Value MsgBox n & "次式" Selection.FormulaArray = "=LINEST(A2:C2,A3:C" & n + 2 & ")" End Sub

mumu001
質問者

お礼

返事が遅くなってすみません。 おかげさまで目的とする結果を得ることができました。 本当にありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

n=2 '2次式 … Selection.FormulaArray = "=LINEST(A2:C2,A3:C" & n & ")" みたいなかんじでどうでしょう

mumu001
質問者

お礼

返事が遅くなってすみません。 アドバイスを参考に記述して、目的とする結果を得ることができました。ありがとうございました。

関連するQ&A

  • EXCELのワークシート関数をVBAに書き直す。

    お世話になります。 Excel2013において、以下のワークシート関数の処理をVBAに書き直すにはどうしたら良いでしょう? =IF(ISBLANK($C4),"",IF(COUNTIF($C$4:$C4,$C4)>1,"重複しています。",INDEX(顧客!$A:$M,1,SUMPRODUCT(((顧客!$A:$M=$C4)*COLUMN((顧客!$A:$M)))))))

  • VBAの変数

    いつもお世話になるます。 エクセルvbaでaを変数にしたとき 例 private sub text1() a=inputbox("数字入力") end sub private sub text2() if a=777 then ・・・ みたいなことをしたいのですが、private subが違うと、変数も別物になるようです。どんなprivate subでも共通で使える変数を使うにはどうすればいいのでしょうか? 宜しくお願いします。

  • Excel VBAでの構文

    他部署の人からマクロの動きがおかしいから調べてと言われて マクロ自体の不具合は解消できたのですが、そのマクロの中で If a > 1000 Then a = 1# End If や If b < 0 Then b = 0# End If といった表現がなされていました。このマクロ作成者はすでに退職されていて 私自身もVBAを独学で習得したのでこの『1#』『0#』を初めて目にしました。 これはどういう機能なのですか? 『a$』や『a#』の変数の型宣言とは別物ですか? ご教授お願いします

  • エクセルVBAでシートモジュールでのパブリック変数

    エクセル2000です。 標準モジュールで取得したパブリック変数は他のシートモジュールで参照できますが、逆にシートモジュールで取得したパブリック変数は他のシートで参照できないのでしょうか? シートチェンジイベントで取得した文字列を変数nmに格納し、ワークブックモジュールで呼び出そうとしたら何もでてきませんでした。 どうやったらよいのでしょうか? 'シートモジュールの記述 Public nm As String Private Sub Worksheet_Change(ByVal Target As Range) Dim rw As Integer If Intersect(Target, Range("A1").CurrentRegion) Is Nothing Then Exit Sub If Selection.Count > 1 Then Exit Sub rw = Target.Row nm = IIf(Cells(rw, "A") = "", Cells(rw, "A").End(xlUp).Value, Cells(rw, "A").Value) 'MsgBox nm End Sub 'ThisWorkbookモジュールの記述 Private Sub Workbook_BeforeClose(Cancel As Boolean) If nm = "" Then Exit Sub MsgBox nm & "さん、ご苦労様でした。" End Sub

  • エクセルVBAについての質問です。

    エクセルVBAについての質問です。 A列のCという商品名が入った列を削除したい場合下記のようにすれば可能かと思いますが、C列のCという商品名が入った列を削除したい場合どのようにすればよいか教えて下さい。 VBAに関してまだ初心者ですがどうぞよろしくお願いします。 行 = 1 Do 行 = 行 + 1 If Cells(行, 1) = "" Then Exit Do End If '行の値がC以外の時は次の行に移る Do If Cells(行, 1) = "C" Then Rows(行 & ":" & 行).Select Selection.Delete Shift:=xlUp Else Exit Do 'ジャンプ先は内側のDo~Loopのすぐ下 End If Loop 'ジャンプ先はここ If Cells(行, 1) = "" Then Exit Do End If Loop End Sub

  • エクセル VBA 各シートに貼り付け

    いつも皆様には大変お世話になっております。 表題に書いたようにコピーしたものを貼り付けしたいのですがうまく動きません。 Sheets("A").Select Range("B8:B38").Select Selection.Copy For Each sh In Worksheets If sh.Name <> "A" Then Range("B12:B42").Select Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Range("F38").Select ActiveWindow.SmallScroll Down:=-12 End If Next と言った様な構文を書いているのですが Aのファイル内のみでコピーして貼り付けをやってしまいます。 ちなみにシートはB,C,Dなど各種あります。 よろしくお願いいたします。

  • エクセルVBAについて

    現在、エクセル2010を使用し文字色が黒だったら1と加算しそれ以外は0というVBAを VBA素人ながら、コピペしながら組んでいました。 以下 'ColorIndex = 1 は、黒です 3は赤 黄色は7 青は 5 '============================================ Function fcolor(a As Range, b As Integer) Dim c As Range, cu As Integer, frg As String Application.Volatile For Each c In a With c.Font If b = 1 Then If .Color = vbBlack Then cu = cu + 1 Else If .ColorIndex = b Then cu = cu + 1 End If End With Next fcolor = cu End Function という風にし、範囲を=fcolor(D3:E37,1)としていますが、 本当なら”0”と表記されるべきなのですが”66”となってしまいます。 VBAど素人なのでよろしくお願いします。

  • エクセルVBAの保存

    毎月異なった新しいエクセルファイルに同じような加工を施すため、VBAを書きました。対象はActivesheetとしています。 で、質問は、この新しいエクセルファイルの標準モジュールにいちいちこのVBAをコピーペーストせずに実行する方法です。 きっと何かあるとは思うのですが・・・・。 VBAは次のような簡単なものです。 Sub 加工1() Dim e As Integer, s As String, n As String e = Range("A4").End(xlDown).Row s = Replace(Mid(Range("A2"), 8, 5), "年", "") & "-" n = Replace(Mid(Range("A2"), 19, 5), "年", "") & "-" Range("A1:C2").MergeCells = False Columns("B:B").Select Selection.Insert Shift:=xlToRight Columns("A:A").Select Selection.Insert Shift:=xlToRight Columns("C:C").Select Selection.NumberFormatLocal = "G/標準" Range("B3").Select Selection.AutoFill Destination:=Range("B3:C3"), Type:=xlFillDefault Range("B3").Select ActiveCell.FormulaR1C1 = "商品番号1" Range("C4").Select ActiveCell.FormulaR1C1 = "=LEFT(RC[-1],10)" Range("C4").Select Selection.AutoFill Destination:=Range("C4:C" & e), Type:=xlFillDefault Range("A3").Select ActiveCell.FormulaR1C1 = "抽出年月日" Range("A4").Select ActiveCell.FormulaR1C1 = s & n & 1 Range("A4").Select Selection.AutoFill Destination:=Range("A4:A" & e), Type:=xlFillDefault Rows("3:3").Select Selection.Insert Shift:=xlDown Range("B1:E1").MergeCells = True Range("B2:E2").MergeCells = True ActiveSheet.Name = "提出用" End Sub

  • Excel ワークシート関数をVBAで使用したい

    お世話になります。 Excelでワークシート関数をVBAで使用したいのですが、うまくいきませんでした。 関数ですと「ISERROR(FIND(V$10,R$11))=FALSE」のような式をVBA上で使用したいと思い、以下のようにコードを書いてみましたが If Application.WorksheetFunction.IsError(Application.WorksheetFunction.Find(Cells(i, j), Cells(i, 18))) = False Then Cells(i, j).Select End If 「実行時エラー'1004' WorksheetFunction クラスのFindプロパティを取得できません」となります。 入れ子が問題なのでしょうか。 よろしくお願いします。

  • Excel VBA 条件分岐のスマートな書き方

    すみません。すごく初歩的な質問なのですが、 Excel VBAで以下のような条件分岐をさせたい場合、 もっとスマートな書き方できませんか? 命題 AとBに対して if not A then 処理X end if if not B then 処理Y end if if not(A and B) then 処理Z(この処理の中には処理Xと処理Yの結果が含まれている) end elseifを使った書き方が思い浮かばず、 同じことを何度も書いているようで、もっと上手に書けそうな気がしまして・・・ どなたかご教示頂けたらと思います。