• ベストアンサー

Excel2000で数式を配列にしてセルに放り込むと計算されない

一定の法則で作成されて数式をセルに放り込む場合、 (1)のようにループさせると非常に時間がかかりま した。(実際の数式セルはもっとたくさんあります。) それで数式を一度、(2)のように配列に入れて放り 込んだところ約1/10の時間で処理はすみました。 ただ、放り込まれた数式が計算されずに式のまま表 示されてしまいます。 セルをダブルクリックして、その後、リターンを押すと計算され ます。 これを自動的に計算させることはできないのでしょうか? (1)    For i = 1 To 3      For j = 1 To 10        Cells(i, j).Formula = "数式"      Next j    Next i (2)    myFomula(3, 10) = "数式" '← この中に数式を入れる。    Range(Cells(1, 1), Cells(3, 10)).Formula = myFomula

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

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

私の今まで考えてきたことと違うので(私が大誤りかもしれないが) (1)VBAでFormulaをセットするのは、不適(回りくどい)で、自分のプロクラムで、計算して、値をセットするのが早いかも知れない。 式が見れるメリットはあるかも知れないが。 (2)式を作る(アドレス部分の変更)のに時間がかかる からこの部分をプログラムで自作と言う認識は不可解。 (3)エクセルの関数は、人間やプログラムを作っている人には関係ないと判る(関数式の入った)セルも、1セルのデータが変わると、全部再計算してしまうようです。 従って関数式が増えると大変な時間を要すようです。 エクセル側は、系統立てて計算していかないと、どこで計算結果をまた使っているか割り出せないですしね。 (3)配列にいれて 配列が効いているというより、メモリにおくことの処理スピードメリットでは。 (4)やりたいことは For Each Cl in Range(Cells(1, 1), Cells(3, 10)) cl.Formula=myFomula(i) i=i+1 Next で実現することかな。 右辺myFomulaは変化する仕掛けにしないと駄目でしょう。 C言語などの構造体のような記述は許されない?。 多セル範囲指定=値も実行後、多セルは同じ値になりますよね。 >それで数式を一度、(2)のように配列に入れて放り 込んだところ約1/10の時間で処理はすみました。 これは疑問。私がエクセル・インサイド情報は無知なのですが。

urourojp
質問者

お礼

こんにちは、ご回答ありがとうございます。 結論から言いますと自動計算を処理に入る前に止めておかな かったために速度が遅くなったみたいでした。 これにより4分30秒かかっていたものが10秒ですむようになり ました。 データ数は10,000*15 で、それのAVGやSTDなどを取得するもの でしたが、対象範囲が一定でないので範囲を自動的に取得する ようなVBAを書いて、それを元に式を変化させようと思いました。 範囲の変更が必要な式が数百あるもので自動でと考えました。

その他の回答 (1)

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

ウチで試してみた所では、 式が計算されました。 どんな式だったのでしょうか? 再計算させるには Range(Cells(1, 1), Cells(3, 10)).Calculate すればいいと思います。

urourojp
質問者

お礼

こんにちは、ご回答ありがとうございます。 結論から言いますと自動計算を処理に入る前に止めておかな かったために速度が遅くなったみたいでした。 それで結局、ループですませました。 ただ、3台ほどでテストしましたが、Calculateでは計算 されませんでした。 数式は 一般的な AVGとSTD,Max,Minといったものです。 =Max(Sheet1!A1:C150) とか こんな感じです。 これのアドレスを少しずつ変えたものがテキスト配列 に入っていて、一気に貼り付けられないかと考えました。

関連するQ&A

  • VBA 数式の計算が止まらない

    下記マクロはE列に1~10を記入し、G列に数式で2倍して記入するものです。 数式の計算を事前に止めてる筈ですが、ステップモードで実行し確認すると、全部計算されてます。 Application.Calculation = xlCalculationManual これが効いてないないのです。 なぜでしょうか? Sub Macro1() For i = 1 To 10 Cells(i, "E") = i Next i Application.Calculation = xlCalculationManual For i = 1 To 10 Cells(i, "G").Formula = "=E" & i & "*2" Next i Application.Calculation = xlCalculationAutomatic End Sub

  • セルに多次元配列の値を入力する方法

     Dim A as Variant A = Range(Cells(1,1),Cells(10,2)) としてセルのデータを配列変数に格納した場合  Range(Cells(1,2),Cells(10,2)) を  Range(Cells(1,3),Cells(10,3)) に入力するとき  Aを用いて一発で入力する方法はないですか?  今は For i = 1 to 10 cells(i,3) = A(i,2) Next  という方法しか思いつかないのですが時間がかかります。 良い方法があれば教えてください!

  • VBA 配列計算について 配列の入力に配列の使用

    配列に複数のセル値の合計値を設定したいと思っています。 求める合計値は複数あるため、出力も配列となります。 そこで下記のようにプログラムを考えたのですが、全て同じ値の配列として出力されてしまいます。 VBAではC言語のように配列の古い値に足していくことはできないのでしょうか? (sum()は0で初期化) (10個飛ばしのデータの合計値を算出) For i = 0 To 10 For j = 0 To 5 sum(i)= sum(i) + Worksheets(sheetname).Cells(10, 3).Offset(j * 10, 0).Value Next i Next j 出力配列例 全て同じ値になってしまいます・・・ 1.254 1.254 1.254 ・・・ 回避方法もしくはうまい計算方法などありませんでしょうか

  • Excelのセルから配列変数への一括読込み

    VB(というかプログラミング)の超初心者です。 Excelシートの任意の領域にある数値を、配列変数に一括して 入力したいと思っています。 これまで、 Dim XXX(10) As Variant For I = 1 To 10 XXX(I - 1) = Cells(1, I).Value Next I Range(Cells(10, 1), Cells(10, 10)).Value = XXX の様な感じで処理していましたが(最近まで、セルへの書込みも For-Nextで処理していました)、データ数が多くなると処理に 時間がかかってしまいます。 配列YYYへの読込みもセルへの書込みの様に一括して行うには どうすれば良いでしょうか? よろしくお願いします。

  • なぜ、セルが埋まるのか?

    早速ですが、変な質問かもしれませんが、参考書のプログラムが 読みきれません。 講義いただければ幸いです。 セルを埋める 命令がどこなのか Cells(20000, 1).End(xlUp).Select endr = ActiveCell.Row j = endr: ja = 0              これが ?? For i = 4 To endr - 1   If Cells(i + 1, 6) - Cells(i, 6) < 0 Then Cells(i, 9) = Cells(i, 6) - Cells(i + 1, 6) Cells(i, 10) = 0 Else Cells(i, 9) = 0 Cells(i, 10) = Cells(i + 1, 6) - Cells(i, 6) End If Next 上記はただの NEXT で 無問題、 下記です。単なる代入に過ぎないかと?? Range(Cells(4, 11), Cells(endr - 6, 11)).Formula = "=AVERAGE(I4:I9)/(AVERAGE(I4:I9)+AVERAGE(J4:J9))*100" Range("G1").Select .Formula のヘルプでも?? j = endr: ja = 0  ja の 宣言も ないようです。   

  • 配列変数に格納したデータを計算する方法はありますか?

     簡単な例ですが、例えばB列にあるデータの平均値を求めるときに以下のようにしています。 sub 平均計算()   Dim X(1 To 1000, 1 To 1) As Variant, i as Integer   For i = 10 To 1000     X(i, 1) = WorksheetFunction.Average _          (Range(Cells(i - 9, 2), Cells(i, 2)))   Next   Range(Cells(1, 1), Cells(1000, 1)) = X End Sub  ここで処理速度改善のため、B列のデータを別の配列変数Yに格納してから平均値を求めるというようなことをしたいのですが、そんなことは可能でしょうか?イメージとしてはこんな感じです。   Y = Range(Cells(1, 2), Cells(1000, 2))   for i = 1 to 1000     X(i, 1) = WorksheetFunction.Average _          (Range(Y(i - 9, 2), Y(i, 2)))   Next  当然これはエラーになってしまいますが、このようなことを可能にする方法があれば、どなたか教えてください!よろしくお願いします。

  • 【VBA】配列を使ったマクロで高速化

    いつもお世話になっております。 現在大量にセルの内容を参照し、照らし合わせるマクロを作っていますが、内容が膨大でマクロでも 時間がかかるので、何とか高速化できないか、考えております。 そこで、セルを直接参照するより、配列を使った方が速くなるという話を聞いたのですが、 配列を使うときに普通はVariantで宣言をして、セルの値のみ格納すると思います。 例えば、次のように、A列とB列を10000個のセルを1個ずつ比較し、一致した時にある作業をさせて C列に出力するとします。 A = Range("A1:A10000") B = Range("B1:B10000") For i = 1 To 10000 For j = 1 To 10000 If A(i, 1) = B(j, 1) Then A(i, 1) = A(i, 1) + 1 End If Next Next Range("C1:C10000") = A このようなマクロならいいのですが、値が一致した時にそのセルの色を変えるだとか削除するだとか行うと、次のようになり、配列のみでの構成ができなくなってしまいます A = Range("A1:A10000") B = Range("B1:B10000") For i = 1 To 10000 For j = 1 To 10000 If A(i, 1) = B(j, 1) Then Cells(i, 1).Interior.ColorIndex = 3 End If Next Next 前者は15秒、後者は19秒かかりました。上のプログラムは例であり、 実際に実務の方でマクロを実行すると数十分かかってしまいます。 何とか、条件によってセルの色変えたり削除するときに、速度を低下させずに配列のみで構成することは不可能でしょうか?

  • セル内の値を消したら参照先セルを消す

    Excelのボタンクリックで下記コードにより上表のイニシャルがセル"B11:E13"に入力されるが下表の数字"B15"を消した場合、再度クリックしても入力されたイニシャルが消えないどんなコード入力をすれば良いのかどなたか解る方よろしくお願いします。 Sub 入力() Dim i As Long, j As Long On Error Resume Next For j = 2 To 5 For i = 1 To 3 Cells(i + 10, j) = WorksheetFunction.Index(Range("A1:A9"), WorksheetFunction.Match _ (i, Range(Cells(15, j), Cells(23, j)), False)) Next i Next j End Sub

  • エクセルVBAの配列について

    エクセルVBAの配列について VBAをはじめたばかりの初心者です。 現在、下記のようにデータを配列の中に入れ、 別シートに書き出そうとしております。 (配列へ読み込むところのみ) Dim 配列(1 To 件数, 1 To 9) As Variant For j =1 To 件数 For i = 2 To L If Cells(i, 2).Value = Tx_month Then For k = 3 To 11 配列(j, k - 2) = Cells(i, k).Value Next k End If Next j,i 現状では、データの最終行のみを「件数」分書き出してしまいます。 jとiのForが重なっているからだと思うのですが、どう書き直したら良いか分かりません。 質問をさせていただくのも初めてなので、分かりづらく恐縮ですが お力添え頂けますと幸いです。 どうぞ宜しくお願い致します。

  • VBAの配列の格納について

    エクセルのVBAで、セルのデータを配列に格納するスピードを向上したいと思います。 例えば、A1~A10000のセルにデータを書き出す場合、 For 行番号 = 1 To 10000 Cells(行番号, 1).Value = 1 Next よりも、一旦、配列に書き込んだ後、一気にセルに書き込んだ方法が早いのですが、 For 行番号 = 1 To 10000 HAIRETU(行番号, 1) = 1 Next Range("A1:A10000").Value = HAIRETU() 今度は、A1~A10000に書き込んだデータを、再度、配列に格納する場合、 For 行番号 = 1 To 10000 HAIRETU(行番号, 1) = Cells(行番号, 1).Value Next とすると時間がかかるので、 HAIRETU() = Range("A1:A10000").Value というような処理をしたいのですが、うまくいきません。 よい方法がありましたら、ご教授ください。 よろしくお願いします。