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
の?に適切な値を変数を使って入れたいのですが・・・。
質問が解りにくくて申し訳ないですが、よろしくお願いします。
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行というようにしています。
余計に話がややこしくなったかもしれませんね。
丁寧な説明ありがとうございました。
一読しただけでは、到底理解できそうもありませんのでじっくり調べてみたいと思います。ただ、Wendy02さんの理解の深さに驚くばかりです。(プログラミングをお仕事とされている方と想像します)
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
お返事ありがとうございます。
なにぶん初心者なもので、処理のプロセスが理解できません。ヘルプ等で調べてみますが、お手数でなければ解説していただけませんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 a1,a2, a3をベクトル空間Vのベクトルとする。a1+a2,a2+a3,a3+a1が一次独立のと 2 2022/10/02 15:55
- Excel(エクセル) エクセルVBAでチェックボックスにチェックを入れる 1 2022/09/14 00:52
- Excel(エクセル) EXCEL関数(数式)を教えてください 4 2023/05/08 17:19
- Excel(エクセル) エクセルのvlookupについて質問です 3 2023/01/05 15:15
- Excel(エクセル) ExcelのIF関数について 4 2023/05/24 12:54
- Excel(エクセル) エクセルのマクロでコピー後の貼り付け先を毎回指定したところにしたい 5 2022/08/12 10:47
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Excel(エクセル) エクセルの当番表を作っていますが教えてください 4 2023/01/06 12:12
- Visual Basic(VBA) 他のシートからコピーする下記マクロで貼付け位置をWorksheets(1).Range("A3")の 8 2023/01/30 18:48
- Excel(エクセル) エクセルVBA 複数行にまたがっている選択を判定するには 2 2023/05/21 21:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 多次元配列のクイックソー...
-
どんなオブジェクトでも表示で...
-
[VB6/VBA] Variant型配列リテラ...
-
ブラウザ自体の事じゃなくてJav...
-
VB.NET2003 テキストボックスに...
-
if(1){...}とはどういうことで...
-
JSPの処理の途中で、JavaScript...
-
javascriptで「オブジェクトを...
-
VBScript から JavaScript を呼...
-
VBAによる第3、4水準文字の判定...
-
VBA ステータスバー DoEvents
-
PowerPointで時計表示
-
jQuery ui Datepicker 明日以降...
-
「終了していない文字列型の定...
-
htmlのfileタグに自動で値を入...
-
C#でボタン名を変更しても動く
-
正整数の半角数字かどうか判定する
-
VBA SORT Applyでエラー
-
VC#でテキストボックスに変数の...
-
C# ブラウザの自動クリック
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel vba 配列内の最大値を求...
-
VBA 多次元配列のクイックソー...
-
どんなオブジェクトでも表示で...
-
Excel VBAで、ワークシート関数...
-
VB2008で数字の桁数を調べる...
-
VBScriptでのforms[0]など配列...
-
エクセルのVBAでオブジェクトの...
-
delete[]と、delete演算子の明...
-
[VB6/VBA] Variant型配列リテラ...
-
ASPでACCESSマクロのChoose...
-
以下のコードを実行しても、オ...
-
Javascriptエラーの原因が分か...
-
助けてください!スパムメール...
-
JSPの処理の途中で、JavaScript...
-
JavaScriptで ブラウザの閉じる...
-
if(1){...}とはどういうことで...
-
フォルダを自動で開く
-
csvファイルを読み込み、該当項...
-
「終了していない文字列型の定...
-
1つのVBAコードをすべてのコア...
おすすめ情報