• ベストアンサー

65536行6列×6で10シートを連続して計算

1つのブックに為替のデータが時系列で年ごとに10シート(10年分)あります。 各シートには項目が「日付、時間帯、始値、高値、安値、終値」と6列あり、それぞれの時系列データは1年分で65536行以上あって縦にすべてを並べることはできないので65536行ごとに分割しています。(2009年が3分割でそれ以前は6分割になっています。) このブックをもとに他のブックのシート1枚へ、終値過去5つ分の単純移動平均値を並べて書き出したいと思っているのですが、 データの最後の行とその次の1行目からをあわせた計算、シートとシートをまたいだ計算がうまくできず困っております。 そこで、シート1のセルA1から数値が入っているシート10の最後のセルまでを1列とみなすようなマクロを作りたいのですが、何か良い方法はございますでしょうか。 エクセルは2003を使っています。 宜しくお願い致します。

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

巨大な配列が使えるかどうか分かりませんので、クラスモジュールを使うのはいかがでしょうか。データを一個入れると、ところてん式に古いデータを押し出して、単純移動平均を計算するという、なんのひねりもないコードです。 下記コードは、VBEで挿入/クラスモジュールで生成されるClass1に記述してください。コードは単純明快なので、当方の理解に誤りがあればご訂正下さい。 Private dataNum As Long Private dataArray(5) As Double Public Function SMA(newData As Double) As Double Dim tempSum As Double Dim i As Long If dataNum < 5 Then dataNum = dataNum + 1 dataArray(5) = dataArray(4) dataArray(4) = dataArray(3) dataArray(3) = dataArray(2) dataArray(2) = dataArray(1) dataArray(1) = newData For i = 1 To dataNum tempSum = tempSum + dataArray(i) Next i SMA = tempSum / dataNum End Function 使用例です。こちらは標準モジュールに記述してください。列、シートの切り替わりの部分で苦労されているだけで、複数シート、列にまたがるループは既に達成されていると思うので、割愛します。 Sub test() Dim calcSMAcls As New class1 Dim i As Long For i = 1 To 1000 Step 100 Debug.Print calcSMAcls.SMA(CDbl(i)) Next i End Sub

tksman
質問者

お礼

遅くなってしまいましたが、ご回答有難うございました。 自分の用途にはこの方法が一番あっていたようです。全て計算することができました!

その他の回答 (3)

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

非常に矮小な例で考えた。 納得できればコードの定数面を拡張してやってみてください。 For j = 1 To 3 For i = 1 To 5 の3や5の部分や avg = (st3(1) + st3(2) + st3(3)) / 3 の3の部分です。 ==== A列5行の3シートを対象とする。 シートタブの位置が左から3シート分ということ。シートの名前に関係させてない。 Sub test01() For j = 1 To 3 For i = 1 To 5 t = t + Sheets(j).Cells(i, "A") Next i Next j MsgBox t End Sub これで3シートの合計は取れた。 配列などに溜め込むのは、データ数が多いときはやめたほうが良い。 エクセルのセルが一種の配列構造だ。 === 3個データの移動平均を出すなら、データ3つは貯めておくとやりやすいかも。 例 Sub test01() Dim st3(3) For j = 1 To 3 For i = 1 To 5 x = Sheets(j).Cells(i, "A") 't = t + x st3(1) = st3(2): st3(2) = st3(3): st3(3) = x avg = (st3(1) + st3(2) + st3(3)) / 3 MsgBox avg Next i Next j 'MsgBox t End Sub ーー 例データ Sheet1 A1;A5 1 2 3 4 5 Sheet2 A1:A5 1 2 3 4 5 Sheet3 A1:A5 10 11 12 13 14 テスト結果が見やすいように Sheet1にA6:A15にSheet2,Sheet3のA1:A5データをコピーしておき A列  B列 1 2 3 2 4 3 5 4 5 4.666666667 4 4.666666667 3 4 2 3 1 2 10 4.333333333 11 7.333333333 12 11 13 12 14 13 B列は、b3に移動平均式 =(A1+A2+A3)/3を入れて下方向に式を複写したもの。B1,B2の式は小生詳しくない。 上記コードを実行するとSheet1のB列の通りの数がMsgbox で次々出てきて一致した数である。 と言うことは、シート間のつなぎでも、上記のロジックで、旨くいくということと思う。 各シートで数行程度行数が違うときもあろうかと思う。その場合は 各シートの最終行を配列にもつとkか ループに入る前に最終行を Sub test02() j = 2 d = Sheets(j).Range("A65536").End(xlUp).Row MsgBox d End Sub で類推できる方法で捉えて、上記では For i = 1 To 5 t = t + Sheets(j).Cells(i, "A") の5をdに置き換えればよいだろう。

tksman
質問者

お礼

わかりやすい説明で、最後まで計算するのにとても良いヒントとなりました。ご回答有難うございました。

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.2

Dim target_range As Range Set target_range = Application.Union( _ Worksheets("Sheet1").Range("A1:A65536"), _ Worksheets("Sheet2").Range("A1:A65536"), _ Worksheets("Sheet3").Range("A1:A65536") _ ) でtarget_rangeを操作すればよいでは

tksman
質問者

お礼

この方法を基に作ってみたのですがうまく動きませんでした。ご回答有難うございました。

  • Sinogi
  • ベストアンサー率27% (72/260)
回答No.1

シート名は 1 2 3 のような数値 A列のみデータが複数シートにデータがあって、「表示」シートに10000行ずつの合計を表示するマクロをつくってみました。 全データを配列に格納して処理しています。質問者さんのデータでメモリが耐えられるかどうか不明ですが参考までに Option Explicit Sub ss() Dim Row1, ShName, MySum(), MyData(), SumCount, SHRow, ShNumber, AllRow, PreRow, ModRow, MAN, AMARI ShNumber = 0 Row1 = 1 PreRow = 0 Do ShNumber = ShNumber + 1 ShName = CStr(ShNumber) Worksheets(ShName).Activate SHRow = Cells(Row1, 1).End(xlDown).Row AllRow = AllRow + SHRow For Row1 = 1 To SHRow ReDim Preserve MyData(PreRow + Row1) MyData(PreRow + Row1) = Cells(Row1, 1).Value Next Row1 PreRow = AllRow Row1 = 1 Loop While SHRow = 65536 SumCount = Int(AllRow / 10000) + 1 ModRow = AllRow - SumCount * 10000 ReDim MySum(SumCount) Worksheets("表示").Activate For Row1 = 1 To AllRow 'AMARI = Row1 Mod 10000 MAN = Int((Row1 - 1) / 10000) MySum(MAN) = MySum(MAN) + MyData(Row1) Cells(MAN + 1, 1).Value = MySum(MAN) Next Row1

tksman
質問者

お礼

今回の自分の用途には合いませんでしたが、VBA覚えたての自分にはとても良い勉強になりました。ご回答有難うございました。

関連するQ&A

  • 1行を1シートずつに書き出すには

    顧客データのシートがあります。 1人分のデータが1行になっていて、300行ほどあります。 顧客1人ずつのデータを1シートごとに分割して、 300シートを書き出したいのですが、 どのようにすればできるでしょうか。 この際、できれば、シート名は顧客名に、 1行は1列に変換して(行列入れ替え)できれば、なお嬉しいのですが… よろしくお願いいたします。

  • エクセルマクロの条件分岐を列単位で行う

    エクセルで株価取得の仕組みを作ろうと思い マクロのIf~ElseIfを列単位で条件分岐できないかと考えています。 今、作りたいと思っているのは (1)列に特定の数値があった場合は (2)セルに入力されている銘柄コードの (3)始値・高値・安値・終値・出来高といった時系列データをネットから取得 を考えています。 添付画像で言うと例えば (1)C列の「前日比が+」であった場合は (2)A列の「銘柄コード」の (3)始値・高値・安値・終値・出来高といった時系列データをネットから取得 という事を考えています。 分かりにくくて申し訳ありません 添付画像では3銘柄ほどしかありませんが、 実際は150銘柄ほどでこれを行い、 条件を満たしている銘柄のすべてで時系列データを取得したいと思っています。 自分でやろうと思ったやり方では C1,C2,C3...と一つ一つ指定するくらいしか出来なかったため、 マクロが長文になってしまいました。 そこで列単位で一括で条件分岐する方法はないでしょうか。 アドバイス頂けると助かります。

  • 株価の上げ下げのパターンをVBAで計算する方法

    株価には「3日前上がって2日前下がって1日前上がると当日は上がる」といった法則がたまにみつかります。 それを効率よくVBAで計算したいのですが、VBA初心者のため組み方がわかりません・・・。 例えば、Excel上の株価は以下のようになっています。 始値 高値 安値 終値 上下? 240  300 210 280 1 245 320 220 230 0 「始値<終値」のとき右端の時系列は1と表示させてます。  つまり、0010とか1010といった組み合わせを自動化して、「0010と価格が動いたときには翌日セルに1を表示する」といった感じで計算をしたいのです。   どなたか詳しい方おりましたえら是非ご教授下さい。

  • エクセルのワークシートAの1列目(A列)の日付と、ワークシートBの1列

    エクセルのワークシートAの1列目(A列)の日付と、ワークシートBの1列目(A列)の日付を一致させて1つのワークシートに纏める方法を探しています。 2つの時系列データがあるのですが、データA(為替データ)とデータB(株式データ)のデータ管理方法が下記のように異なっています。 データA(為替データ)・・・1週間のうち6日間(月曜から土曜まで) データB(株式データ)・・・1週間のうち5日間(月曜から金曜まで) おのおのワークシートのA列に日付が入っています。 データAは月曜から土曜までなので、1週間に6行要します。データBは月曜から金曜なので1週間に要するのは5行です。従って、単純にこの2つのデータを張り合わせるだけでは(データBをデータAのシートに張り合わせた時)、1週間に要する行数が違うので1行ずつずれてしまいます。 1週間に要する行数の違いだけでなく、マーケットが休みの日はデータそのものがないため日付が存在しません。(マーケットの休みもおのおの別の日でバラバラです。) これらの理由により、ただ単に張り合わせるだけだとずれが広がるばかりです。 そこでデータAの日付とデータBの日付を認識して一致させる関数を教えて欲しいと思います。 データAの構成はA1=日付、B1=始値、C1=高値、D1=安値、E1=終値で、データBの構成も同じです。 データAのF1にデータAのA1と同じ日付のデータBの行を貼り付るように設定したいと思っています。 説明が分かり辛い場合は補足しますので、その際はご指摘下さい。 宜しくお願いします。

  • 文字列の計算について。。。

    Excelでなのですが、外部データの取り込みをしました。 その時に、文字列で取り込んだ数値を計算したいのですが、 うまく出来ません。 セルの書式設定で数値にしたのですが、計算出来ません。 関数を使って数値に変換すると出来たのですが、 50枚シートがあるものが10ブックあります。 計算したい列もそれぞれのシートでばらばらなので困ってます。 簡単に出来る方法はないでしょうか?

  • エクセルでシート1の連続している行をシート2に表示

    こんにちは。エクセルでの作業方法の質問です。 早速ですが、シート1のA列が縦に1日~月末まで月日表示されています。その1日分は2行を結合して1日分となっています。 また1日分の横(B列~Z列)に数字のデータが並んでいます。 その中で1日分の行だけを隣のシート2に表示したいのです。 さらにその表示する1日分のデータ(B列~Z列)は、いわゆる現在の 日付『=TODAY()』のようにエクセルを開いた時に当日のデータをシート1から持ってきて表示(参照?)したいのです。 例えば:シート1に下記のデータがあります。 A   B   C    D    E 7/1  6    3    9    11 7/2  10   2 8 15 7/3 2 1 8 12 今日が7/2だとしたら上記シート1から 7/2 10 2 8 15の行だけをシート2の任意の 行に表示させたいわけです。 翌日になったら、7/3の行をシート2の同じ位置に 表示させたいのです。 前日(この場合7/2のデータは上書きされて7/3のデータ が表示されればよいです。) 以上ですが、質問の表現方法がうまくなくてすみません。 どうか、よろしくお願いします。

  • エクセルでシート1の連続している行をシート2に表示

    こんにちは。エクセルでの作業方法の質問です。 早速ですが、シート1のA列が縦に1日~月末まで月日表示されています。その1日分は2行を結合して1日分となっています。 また1日分の横(B列~Z列)に数字のデータが並んでいます。 その中で1日分の行だけを隣のシート2に表示したいのです。 さらにその表示する1日分のデータ(B列~Z列)は、いわゆる現在の 日付『=TODAY()』のようにエクセルを開いた時に当日のデータをシート1から持ってきて表示(参照?)したいのです。 例えば:シート1に下記のデータがあります。 A   B   C    D    E 7/1  6 3 9 11 7/2  10 2 8 15 7/3 2 6 1 7 今日が7/2だとしたら上記シート1から 7/2 10 2 8 15の行だけをシート2の任意の 行に表示させたいわけです。 翌日になったら、7/3の行をシート2の同じ位置に 表示させたいのです。 前日(この場合7/2のデータは上書きされて7/3のデータ が表示されればよいです。) 以上ですが、質問の表現方法がうまくなくてすみません。 どうか、よろしくお願いします。

  • エクセル (1)行削除 (2)列追加と計算式入力 

    エクセル マクロで自動で計算させたいのですが、マクロの記録しかやったことがない者です。 添付画像のように、 元のデータとして、A列に黄色のセルがある表があります。 やりたいことは2種類あって (1):A列に黄色がある行のみを残す。 (1)-1:(1)をやった後に、列を追加し、計算式をデータがある行分だけ入力して計算させる。 (2):A列が無色の行のみを残す。 (2)-1:(2)をやった後に、列を追加し、計算式をデータがある行分だけ入力して計算させる。 (1)、(1)-1と、(2)、(2)-1それぞれのマクロを教えてください。 色の指定の違いだけになるかと思いますが、良く判らないので、お願いいたします。 また、例えば赤色などへの変更も可能か、教えて欲しく。 行を残す内容と、列追加や、計算式入力等、それぞれ判るように、コメント行を入れていただけると助かります。 申し訳ありませんが、お願いいたします。

  • エクセルで株価の1分足を他の分足に変える事ができますでしょうか?

    エクセルで1分足の株価を10分足に変えたいのですが、できますでしょうか? A列に日付、B列に時刻(9:00・9:01・9:02・・・・)、C列に始値 D列に高値、E列に安値、F列に終値が入っています。 これをH列に日付、I列に時刻(9:00・9:10・9:20・・・・) J列に始値D列に高値、K列に安値、L列に終値が入っています。 (9:00の列には9:00~9:09までの始値・高値・安値・終値が入ります。) 宜しくお願いします。

  • エクセル 合計条件が行と列の時の計算式

    エクセルで、データがはいっている”データシート”と 合計を表示させたい”合計シート”があり、 合計シートに同じ番号の品名でおなじ日付のものを合計して 表示させたいと思っています。 データシートには、以下のように品名が同じものが複数はいっています     A列 B列 C列 D列・・・・Z列これからさらにデータが増えていきます 1行目品名 4/1 4/4 4/5 2行目Z100 10  20  30 3行目Z300 40  50  60 4行目Z100 11  22  33 5行目Z200 70  80  90  ・  ・ 200行くらいデータがありこれからさらにデータが増えていきます。 合計シートもデータシートと同じような形で データシートのA列の 同じ番号&同じ日付 の数字をそれぞれセルB2からZ200まで合計した 数字を表示させたいです。     A列 B列 C列 D列・・・・Z列 1行目    4/1 4/4 4/5 2行目Z100 21  42  63 3行目Z300 40  50  60 4行目Z200 70  80  90  ・  ・ 200行目 合計シートのB2セルに入力したのですが、#VALUEエラーがでてしまい ました。 =SUMPRODUCT((データシート'!$A$2:$A$500=合計シート!$A2)*(データシート'!$B$1:$Z$1,合計シート!$B1)) SUMIFでも試してみたのですが、エラーがでてしましました。 説明が分かりにくく申し訳ないですが、どなたか分かる方いらしたら 教えてください。よろしくお願いします。