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

このQ&Aのポイント
  • VBAで複数のセル値の合計を配列に出力したいと考えていますが、全て同じ値の配列となってしまいます。
  • VBAでは配列の古い値に足していくことはできないのでしょうか?回避方法や効果的な計算方法はありませんか?
  • 配列計算において、全て同じ値の配列が出力されてしまう問題についての回避方法や改善策を教えてください。
回答を見る
  • ベストアンサー

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 ・・・ 回避方法もしくはうまい計算方法などありませんでしょうか

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

  • ベストアンサー
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

なにを計算したいんでしょうか? このコードでは、どのSum(i)にも、 Cells(10,3).Value + Cells(20,3).Value + ・・・・ + Cells(60,3).Value の値が入るから、同じになるのは当然です。 i ごとにSum(i)を変えたいのなら、 Worksheets(sheetname).Cells(10, 3).Offset(j * 10, 0).Value の中のどこかに i が入ってないと・・・・

abcd0420
質問者

お礼

oh... 初歩的なミスで何時間も頭を悩ませていました 的確な指摘ありがとうございますm(_ _)m

関連するQ&A

  • 配列番号の取得について

    ここに配列 SheetName(i) があります。 For i = 0 To 10 SheetName(i) = ActiveWorkbook.Sheets(i + 1).Name Next i でシートの名前を配列に入れ込みます。 フォームのコンボボックスを用いてセレクトされたSheetName(i) の変数iの値(配列番号)を取得することは可能なのでしょうか? すみませんが、お助け下さい。 よろしくお願いします。

  • エクセル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が重なっているからだと思うのですが、どう書き直したら良いか分かりません。 質問をさせていただくのも初めてなので、分かりづらく恐縮ですが お力添え頂けますと幸いです。 どうぞ宜しくお願い致します。

  • Excel VBAにて2の100乗を計算するには

    プログラミングの勉強でVBAを学んでいるものです 以下の様な問題を出されました 2の100乗の値を計算する。この値はLong型で表せる最大の値をはるかに超すので、十分な大きさのInteger型の配列を用意し、その各要素で各けたの値を表す。値を2倍するサブプロシージャ「二倍」を書いてプログラムを完成させ、値を計算せよ。 Option Explicit Sub 二の百乗() Const n As Integer = 200 Dim s(n) As Integer Dim i As Integer, j As Integer s(1) = 1 For i = 2 To UBound(s) 'UBoundは配列の最大の添え字を返す関数 s(i) = 0 Next i For i = 1 To 100 二倍 s Next i For i = UBound(s) To 1 Step -1 If s(i) <> 0 Then Exit For Next i For j = 1 To i Cells(1, j).Value = s(i - j + 1) Next j End Sub セル一つに計算結果を表示させられないことはよく分かるのですが、そのための2の掛け算を全く思いつきません 二倍のサブプロシージャをどのようにすればいいのでしょうか

  • 【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秒かかりました。上のプログラムは例であり、 実際に実務の方でマクロを実行すると数十分かかってしまいます。 何とか、条件によってセルの色変えたり削除するときに、速度を低下させずに配列のみで構成することは不可能でしょうか?

  • C言語で3次元配列の課題をしています。

    C言語で3次元配列の課題をしています。 5人の学生の3科目(国数英)の点数を前期と後期の2回分について三次元配列に入力し、各学生の前期と後期の合計と前・後期の合計を求めるプログラムです。 配列に数値を格納するあたりまでは分かったものの、そこから先がよくわからなくなってしまいました。どなたか解説とともに、成績の出力の仕方を教えていただけないでしょうか。for文を使えばいいというのはわかりますが・・・。 以下に出来た部分までのソースを載せておきます。まだ未熟な上、変なミスがあるかもしれません。 #include <stdio.h> main() { /*配列を宣言*/ int score[0][3][5],i,j,k; int total,sum[2][5]; /*配列に成績を入力*/ for(i=0;i<2;i++){ for(j=0;j<3;j++){ for(k=0;k<5;k++){ printf("score[%d][%d][%d] = ",i,j,k); scanf("%d", &score[i][j][k]); } } } /*合計を計算する*/ for(i=0;i<5;i++){ for(j=0;j<2;j++){ total=0; for(k=0;k<3;k++){ total = total + score[i][j][k]; } sum[i][k]=total; } sum[2][k]=sum[0][k]+sum[1][k]; } /*出力する*/ /*??*/ } ※三次元配列のscoreの始めの[]は、0が前期成績、1が後期成績を格納する部分です。

  • VBA なぜ配列にドカンと一発で入れることが出来る

    下に2つのコードを示していますが、パターン1は、配列cに一発で一気に速く入れることが出来る雰囲気が表れています。実際に速いそうです。 しかしながら、どちらのコードも、最終的には配列cに一つずつデータが入るわけですよね。 なぜ、パターン1だと速いのでしょうか? 専門的でむずかしいようでしたら、イメージだけでも教えていただけたらと思います。 パターン1 Dim r as Range Dim c() As Variant Set r=Selection c = r.Value パターン2 redim c(r.rows.count,r.columns.count) for i=1 to r.rows.count for j=1 to r.columns.count c(i,j)=r(i,j).value next j next i

  • -の計算について

    Sum関数を使用して、あるセルの範囲の合計を出したいのですが、 その合計よりhiku4という変数の値分を引きたいのです。 変数が"+"の場合はOKなのですが hiku4に"-"の値が入ってきた場合、エラーになってしまいます。 どうすればよいのでしょうか? for i= 1 to4 Range("L" & i).Formula = "=SUM(L" & i + 1 & ":L" & lastgyou & ") " & -hiku4 next

  • VB バリアント型の配列の例について

    長々と失礼します。私の使用している教科書に 「バリアント型の2次元配列」と「バリアントに2次元配列を代入」というのを組み合わると「行列i要素とする行列」たとえば 2 5 9 4 1 8 7 3 6 1 5 9 8 0 1 6を的確に表現できます。 と書いており、下のように書かれているのですが上のような配列を表示しません。どこが間違っているのでしょうか?そもそも上のように表示できるのか理解に苦しんでおります Option Base 1 Private Sub Command1_Click() Dim a(2,2) As Variant Dim c(2,2) As Integer For i = 1 To 2 For j = 1 To 2 For p = 1 To 2 For q = 1 To 2 c(p,q) = p + q + i * j Next q Next p a(i,j) Next j Next i For i = 1 To 2 For p = 1 To 2 For j = 1 To 2 For q = 1 To 2 Print a(i,j)(p,q), Next q Next j Print Next p Next i End Sub

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub

  • VBAを使った九九、及び合計、平均の表の作り方

    Visual Basic初心者です。 Excel 2003を使って、九九表を表示させるプロジェクトを作りたいのですが、どうしても途中で詰まってしまい、九九だけどころか、合計と平均すら表示させることができない状態です。 私の途中まで組んだタグは以下の通りです。どなたかよろしくお願いします。 Private Sub CommandButton1_Click() Call Kuku End Sub Option Explicit Dim Sum(20) As Double Sub Kuku() Dim i As Double, j As Double, num As Integer num = InputBox("numの値を入力しなさい") Sheets("Date").Cells.Clear For i = 1 To num Sheets("Date").Cells(1, i + 1) = i Sheets("Date").Cells(1 + i, 1) = i Sum(i) = 0# For j = 1 To num Sheets("Date").Cells(i + 1, j + 1).Value = Sum(i) Sum(i) = i * j Next j Next i Call Heikin Call Hyoudai MsgBox ("処理が終了しました") Sheets("Date").Select End Sub Sub Heikin() Dim i As Double, num As Integer, n As Integer For i = 9 To num Sheets("Date").Cells(i + 1, n + 2).Value = Sum(i) Sheets("Date").Cells(i + 2, n + 1).Value = Sum(i) Next i End Sub Sub Hyoudai() Sheets("Date").Cells(1, 1) = "九九" Sheets("Date").Cells(1, 11) = "合計" Sheets("Date").Cells(1, 12) = "平均" End Sub

専門家に質問してみよう