私はExcel初心者で、VBAは使用したことがありません。またAccessはまったく使用したことがありません。
以下のことがExcelやAccessでは可能なのかおわかりの方、お返事いただけたらと思います。

現在、Excelで競艇の予想と結果の過去のデータを集計したり統計をとったりして検証しています。
データは手作業で入力しているのですが、競艇は1日に1場で12Rあり、全国で20場近く開催されているので年間のデータは膨大でとても手作業では対応しきれません。

データは「予想」と「結果」があります。1日分の「予想ファイル(CSV)」と「結果ファイル(TEXT)」があり、これが1年分あるのでファイル数は数千あります。

これらの膨大なファイルをExcelやAccessに取り込むというのは自動でできるのでしょうか?
私は現在はTEXTやCSVをコピー&ペーストなどで手作業で入力しているので非常にたいへんなのです。
Accessは使用したことがなく、このようなことが可能なのかもわかりません。

毎日増えていく予想・結果データをExcelかAccessに取り込んで集計データが更新されるようにしたいと思いますが、このようなことはExcelやAccessで可能でしょうか?

Windows2000とExcel2000:Access2000を持っています。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

お返事がついたので、もう少しお話させていだたくと、私個人ではしないのですが、似たようなものの開発も手がけたことがあります。

(私個人では完成には至っていませんが。)
インターネット検索などで、開発した人は、その開発の内容については教えるサイトないようですね。だいたい、シェアウェア化されてしまっているような気がします。

ですから、また、逆にそういうツールを探してみるのも、手だと思います。意外と便利なツールが見つかるかもしれません。

>「CSVのまま処理をする」という部分が具体的にはどうやるかはわかりませんが、こちらも勉強してみたいと思います。

これは、目からウロコです。

MS-DOS上で行っても構わないのですが、VB系(VBSを含む)ですと、
例えば、
 A ="a.csv"
 B ="b.csv"
 C ="new.csv"
 Shell("cmd.exe /c copy " & A & "+" & B & " " & C)
などとしていくわけなんですね。(上書きも可能です)
以前に、この方法は、実証済みです。

これを、ループ(Do~Loop)などにすれば、簡単に出来上がってしまいます。
ファイル名を取得する部分に、コツが必要ですが、Win2000でしたら、ロングファイルネームを使えますから、そのまま、ファイル名をコマンドに与えることも出来ます。
    • good
    • 0
この回答へのお礼

お返事が遅れてすみませんでした。先ほど仕事から帰ってきました。
再びのご回答ありがとうございます。

シェアウエア化されたソフトはいくつか使ってみました。非常によくできていますが、過去の結果データを一括で分析できる機能はないようです。その他の機能はさすがという部分ばかりで参考になりました。

CSVはすごいですね。簡単にデータを集計できそうです。
本日も本屋によっていろいろ調べてみました。まだまだ序の口ですががんばってみたいと思います。

お礼日時:2005/04/26 01:51

suffreさん、こんばんは。


返事つけてくださり、ありがとうございます。

DIY競馬プログラミング
DIY競馬プログラミング (JRA-VAN Data Lab.編)
著者:吉田章太郎
http://www.amazon.co.jp/exec/obidos/search-handl …

こういうものまで、ExcelのVBAの本があるのかと、ちょっと驚きました。
たぶん、この著者は、わたしの力と比較すれば、神様レベルの人だ思います。

こういう利殖のプログラミングを垣間見たことがありますが、みんな、それなりの実績を以って、プログラム等を紹介してお金を取っているので、私も憧れはしますが、元を一切知らないので、単なる興味で終わってしまいます。おまけに、実際に、この種類の統計というのは、高等数学が必要のようで、統計の本を買ってきても、さっぱり分からないので、今の私のレベルでは歯が立たないことを知りました。でも、私も、興味を感じましたので、とにかく、その本を探して見てみます。
    • good
    • 0
この回答へのお礼

Wendy02さんこんばんは。
さっそくDIY競馬プログラミングを買ってきました。500ページ近くもありまだ全然読んでいませんが、とてもわかりやすそうです。
私は競馬ではなく競艇ですが参考になりそうで今から楽しみです。

ExcelVBA大辞典も購入して本日から勉強してみます。統計ですがExcelで統計するための専門書もあるのですね。立ち読みでしたがなんとなく興味が惹かれました。

お礼日時:2005/04/27 01:24

お話を伸ばしてすみません。


過去のデータって、どのぐらいあるのですか?
相当の量なんでしょうね。

Excelのブック(計算処理をする)としての限界は、せいぜい、数メガまでと考えてよいのですが、例えば、CSVの巨大ファイル、mdbファイル(Excelだけで作れるし、Accessのテーブルを利用も出来ます)、ランダムファイル(Excelだけで作れます)を、外部データ(メニューのデータ-外部データの取り込み)として、MSクエリで、Excelをちょうど、Accessのフォーム兼クエリ代わりに使うことによって、検索中は多少遅いのですが、その後の統計処理は、やはり、Excelの豊富な関数で自由なレイアウトで処理することが可能です。

本当は、ここら辺りが、Excelを使っていくか、Accessを使っていくかの分かれ道になりますが、Excelの得意な人は、このようにしています。Accessが得意な人には、ばかばかしく思うかもしれません。

ただ、これは、VBAを専門に勉強する必要もないし、数日もあればコツが分かります。また、ExcelのVBA専門掲示板で、特に、ここらに明るい人がいらっしゃいます。
    • good
    • 0
この回答へのお礼

お返事いただきましてありがとうございます。
過去のデータは3年分ほど使う予定ですが、1年ごとに分けて分析したいと考えています。しかしそれでも膨大な量になりそうです。
EXCELは関数が魅力的ですね。やはりEXCELで計算させたいというのはあります。
VBAを勉強する必要がなければ早くにデータの分析ができそうです。いろいろ情報を下さってありがとうございます。

いずれはにAccessも勉強してみようと思っています。昨日本屋で初級向けを読んだかぎりでは到達点は程遠い気もしましたが・・・。

また、昨日ネットで調べているうちに「DIY競馬プログラミング」という本があるのを発見しました。
http://www.yannies.com/book/diy1/index.htm
Excelを使ってCSVやTEXTデータの取り込み方法などを解説しているようで、参考になるかもしれません。本日購入してみたいと思っています。

お礼日時:2005/04/26 13:57

結論から言えば、


>これらの膨大なファイルをExcelやAccessに取り込むというのは自動でできるのでしょうか?

今の話の中では、特にアプリケーションは特定しませんが、「出来る」といって差し支えないと思います。

特に、CSV は、CSVのままでExcelなどを通さずに、ファイルのまま処理をするのが、簡単で速いです。人の手で1時間も作業でされていたことは、おそらく、数秒で終えてしまうに違いないです。

ただ、今回でもお気づきだと思いますが、個人の賭け事などに関する質問は、ひじょうに応対が悪くなりますので、よく内容と要点をかいつまんで、要領よくご質問されることをお勧めします。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
まずは賭け事に関しての質問ということでお答えづらい方もいるかもしれないこと承知しました。

上記のことが可能ということで大分前身できそうです。やり方は本などを購入して勉強しようと思っています。
「CSVのまま処理をする」という部分が具体的にはどうやるかはわかりませんが、こちらも勉強してみたいと思います。
ありがとうございました。

お礼日時:2005/04/25 14:20

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q回帰式のR2が高くない場合の考え方について

たとえば、以下の数値の並びがあります。

A  B
100 70
80  114
81  95
84  80

Aが下がれば、Bが上がるという数列で、BをYとして今後推移を予測する回帰式を求めると

 Y=-1.6443X+231.57 (R2=0.645)

という結果が出ました。

ここで、Aが仮に「87」になった場合上記数式に当てはめてBを求めると「91.8」という結果になりました。この場合、これまでの「Aが下がればBが上がる」という関係と違い「Aが上がればBが上がる」
という結果になってしまいます。

この様になるのは、「R2が0.645と高くないことに因る。」といっても良いのでしょうか?

統計的な話に疎いため、どなたかご教授頂ければ幸いでございます。

<補足>
上記の回帰式はエクセルグラフツールの散布図を使って求めました。

Aベストアンサー

 一般的に、4つのデータで回帰式、というのは、検量線のときだけでしょう。
なにより、データ数が4でr2=0.645だと、「相関に有意差が無い」と結論されます。すなわち、統計学的には、関係を証明できない=関係があるとは言えない式に、87を代入して、云々カンヌン論究するのは誤りです。
 成立していない回帰式を使って、それに関して論究しても救いようが無い、とまでは書きませんが。

>この場合、これまでの「Aが下がればBが上がる」という関係と違い「Aが上がればBが上がる」という結果になってしまいます。
 回帰式に、あらたな数値をxに代入(挿入)すれば、r=1.000で無い限り、yの値はずれます。全体では、上にズレタリ、下になったりするのは、当然です。1点だけで、「結果が逆になった」なんぞは、近視眼的。

>この様になるのは、「R2が0.645と高くないことに因る。」といっても良いのでしょうか?
 R2が0.645なら、「強い相関が見られた」と統計学的には表現するのが正しい。高くないという認識は、間違っています。
 予想した値からズレルノハ、r=1.000でないから。0.999でもズレマス。ただ。ズレは0.6より小さいでしょうが。
 ズレを小さくするには、適正な回帰式を選択することによって可能です。この場合、指数回帰を選べば、ズレを小さくできるハズ。ただ、回帰式は、モデルですから、そのモデルは直線になる、という根拠があれば、直線回帰しか選べませんが。

 回帰分析、相関分析は、有名大学の教員でも、噴飯ものの論文を見かけます。最近は、パソコンで簡単に計算できるので、多変量解析さえ、初心者が手を出せます。
 表面だけ、数値だけでなく、因果関係について、洞察力を養って下さい。

 一般的に、4つのデータで回帰式、というのは、検量線のときだけでしょう。
なにより、データ数が4でr2=0.645だと、「相関に有意差が無い」と結論されます。すなわち、統計学的には、関係を証明できない=関係があるとは言えない式に、87を代入して、云々カンヌン論究するのは誤りです。
 成立していない回帰式を使って、それに関して論究しても救いようが無い、とまでは書きませんが。

>この場合、これまでの「Aが下がればBが上がる」という関係と違い「Aが上がればBが上がる」という結果になってしまいま...続きを読む

Q【Excel/CSV】csv内にhtmlタグがあるとExcelで化ける

Excel2000(Win-XP)使用者です。
CSVファイルをメモ帳などで作成する場合、

aaa,bbb,これは<table>です,ddd

などと記入し保存、Excelで開くとおかしな表示になってしまいます。
""で囲ったり\を付けたり実体参照符号を使ったりしましたがうまくいきません。
Excel自身がhtmlのようなしくみになっているのが原因なのでしょうが、何かいい方法はないのでしょうか。
おそらく無理なんだろうとは思いますが一応質問してみることにしました。
お詳しい方、よろしくお願いします。

Aベストアンサー

こんばんは。

現象を確認しました。Excel2000でのトラブルのようです。タグの後は、すべてが文字化けしていました。
そこで、データ--外部データの取り込み--テキストファイルのインポートで、「すべてのファイル(*.*)」を選んで、テキストファイルのインポートで、区切り文字を「コンマ」を選んで、実行してみてください。

Q物理の問題について質問です 問題 起電力V1,V2の電池と抵抗値R1,R2,R3の抵抗からなる回路が

物理の問題について質問です


問題
起電力V1,V2の電池と抵抗値R1,R2,R3の抵抗からなる回路がある。bの電位はいくらか。

解答

bの電位 R2V1/R1+R2

なぜbの電位は、R2V1/R1+R2なのでしょうか?

どこに着目すればR2V1/R1+R2の式が導きだせるでしょうか?

解説よろしくお願いします

Aベストアンサー

今、b点の電圧を考えるのですから、左側の回路だけを考えればよいことが分かります。この回路は、2つの抵抗の直列回路です(V1 の電池から a を通ってR1, b, R2 を通って電池に戻ります) 。直列回路の電流は、
  I = V1/(R1 + R2)
です。b 点の電圧は、R2 の電圧ですから、
  Vb = R2 x I = V1 R2/(R1 + R2)
となります。

QAccess2000からExcel2000の罫線の削除

Access2000でデータを抽出し、Excel2000に出力する作業を行っています。
VBAで以下のような記述で行っています。

'ファイルパス指定
lBookNm = "D:\temp\test.xls"
'Excelのオブジェクトを設定
Set lExcelObj = CreateObject("Excel.Application")
'Excelを開く
lExcelObj.Workbooks.Open (lBookNm)
'Excelの表示
lExcelObj.Application.Visible = True

'シートのコピー
lExcelObj.Worksheets("master").copy After:=lExcelObj.Worksheets("master")
lExcelObj.Worksheets("master (2)").Name = "テスト"

'シートの操作
With lExcelObj.Worksheets("master")
.Activate
.Cells(8, 1).Value = "test"
End With

lExcelObj.ActiveWorkbook.Save '保存


以下の2点について、わかる方おりましたらご教示お願いします。

1、罫線の削除
罫線を削除したいと思い、以下の記述をしましたが、
「アプリケーション定義またはオブジェクト定義のエラーです。」となってしまいます。
どのように記述すればよいでしょうか。

With lExcelObj.Worksheets("master")
  .Range("B39:B42").Select
  .Application.Selection.Borders(xlEdgeRight).LineStyle = xlNone
End With


2、シートの削除
シートを削除したいと思い、以下のように記述しましたが、
Excel上で、「シートを削除します。」「OK」、「キャンセル」
と問い合わせ画面が出てしまいます。
無条件で削除を行いたいのですが、可能でしょうか。

lExcelObj.Worksheets("テスト").Delete

Access2000でデータを抽出し、Excel2000に出力する作業を行っています。
VBAで以下のような記述で行っています。

'ファイルパス指定
lBookNm = "D:\temp\test.xls"
'Excelのオブジェクトを設定
Set lExcelObj = CreateObject("Excel.Application")
'Excelを開く
lExcelObj.Workbooks.Open (lBookNm)
'Excelの表示
lExcelObj.Application.Visible = True

'シートのコピー
lExcelObj.Worksheets("master").copy After:=lExcelObj.Worksheets("master")
lExcelObj.Worksheets("master (2)").Name = "...続きを読む

Aベストアンサー

xlEdgeLeft=7
xlInsideVertical=11
です。

VisualBasicEditorの[ツール]から[参照設定]でExcelを参照設定するとこれらの値を定義しなくても使用できると思います。
Excelを参照設定して、F2キーのオブジェクトブラウザから値は確認できます。
参照設定すれば、
Set lExcelObj = CreateObject("Excel.Application")も
Dim lExcelObj As Excel.Application
と同等の意味になると思われます。

Q度々申し訳ありません。 (2)で 時計回りに閉路をみて、 V1-V2=R1I1-R2I2=R1I1-

度々申し訳ありません。
(2)で
時計回りに閉路をみて、
V1-V2=R1I1-R2I2=R1I1-R2(I3-I1)=(R1+R2)I1-R2I3

V1=R1I1+R3I3
の2つの式を立てて、
その先のI3の求め方がわかりません。
教えてください。

Aベストアンサー

>時計回りに閉路をみて、
>V1-V2=R1I1-R2I2=R1I1-R2(I3-I1)=(R1+R2)I1-R2I3
>と
>V1=R1I1+R3I3

左のループの時計回りの電流が I1、右のループの時計回りの電流が I3 ということですか?
だとすれば、キルヒホッフの第2法則(電圧則)より
左のループの時計回りの電圧の関係式は
 V1 - I1R1 - (I1 - I3)R2 - V2 = 0
→ V1 - V2 = (R1 + R2)I1 - I3R2    ①
右のループの時計回りの電圧の関係式は
 V2 - (I3 - I1)R2 - I3R3 = 0
→ V2 = (R2 + R3)I3 - I1R2   ②
ですね。

 お示しの「V1=R1I1+R3I3」は最外周ループの時計回りの電圧の関係式
  V1 - I1R1 - I3R3 = 0   ③
でしょうか。

 いずれにせよ、①②③のいずれか2つを使って、I1、I3 を求めればよいだけです。

 ①と③で解いてみれば、③より
  I3 = (V1 - I1R1) / R3    ④
を①に代入して
  V1 - V2 = (R1 + R2)I1 - (V1 - I1R1)R2 / R3
→ (R1 + R2 + R1R2/R3)I1 = V1 - V2 + V1R2/R3
→ (R1R3 + R2R3 + R1R2)I1 = V1R3 - V2R3 + V1R2
→ I1 = ( V1R2 + V1R3 - V2R3) / (R1R3 + R2R3 + R1R2)

これを④に代入して
  I3 = V1/R3 - (R1/R3)(V1R3 - V2R3 + V1R2) / (R1R3 + R2R3 + R1R2)
   = [ V1(R1R3 + R2R3 + R1R2) - R1(V1R3 - V2R3 + V1R2) ] / [ R3(R1R3 + R2R3 + R1R2) ]
   = ( V1R1R3 + V1R2R3 + V1R1R2 - V1R1R3 + V2R1R3 - V1R1R2) / [ R3(R1R3 + R2R3 + R1R2) ]
   = ( V1R2R3 + V2R1R3) / [ R3(R1R3 + R2R3 + R1R2) ]
   = ( V1R2 + V2R1) / (R1R3 + R2R3 + R1R2)

>時計回りに閉路をみて、
>V1-V2=R1I1-R2I2=R1I1-R2(I3-I1)=(R1+R2)I1-R2I3
>と
>V1=R1I1+R3I3

左のループの時計回りの電流が I1、右のループの時計回りの電流が I3 ということですか?
だとすれば、キルヒホッフの第2法則(電圧則)より
左のループの時計回りの電圧の関係式は
 V1 - I1R1 - (I1 - I3)R2 - V2 = 0
→ V1 - V2 = (R1 + R2)I1 - I3R2    ①
右のループの時計回りの電圧の関係式は
 V2 - (I3 - I1)R2 - I3R3 = 0
→ V2 = (R2 + R3)I3 - I1R2   ②
ですね。

 お示しの「V1=R1I1+...続きを読む

QExcelで膨大なデータを処理する方法

1000個ある数値データを、上から5つずつ平均したいのですが、初歩的なやり方だと同じような手順を200回繰り返さないとなりません。
平均処理をいっぺんに行うことのできる方法はないでしょうか。

Aベストアンサー

A1]A1000にデータがあるとして
B5とかに
=IF(MOD(ROW(),5)=0,AVERAGE(A1:A5),"")
と入れて、下のほうに式を複写する。
B1000間での式の複写が手間なら
B5をコピー(編集ーコピーでもCTRL+Cでも可)
B6をクリック
名前ボックスにB1000と入れて
SHIFTキーを押しつつ
ENTER(結果B6:B1000が範囲指定される)
CTRL+V(貼り付け)
VBAででも簡単にできる。Step 5とAVERAGEワークシート関数を使えば、数行。

Q1/R=1/R1+1/R2に何故なる??

オームの法則の並列接続の公式で

合成抵抗 

1/R=1/R1+1/R2

になると書いていてその下に

R=R1×R2/R1+R2

とかかれておりますがどのように計算するとこいう公式になるのでしょうか。
社会人になって電気工事師の勉強をしていて久しぶりに計算するとド忘れしてしまったようです。

よろしくおねがいします。

Aベストアンサー

たとえば1/2 + 1/3 という足し算を計算する時に、「通分」という操作をしますよね。
この場合は、
1/2の分母と分子を各々3倍して3/6、1/3の分母と分子を各々2倍して2/6として、
1/2 + 1/3 = 3/6 + 2/6 = (3+2)/6 = 5/6
と計算できます。

どうです?小学校の算数ですよ。思い出しましたか?
1/R1 + 1/R2 = (R1+R2)/(R1*R2)
は、上記の計算を一般的な形式で表しただけです。

QEXCELの数式結果で困っています(TEXT関数について)

A列に1から5までの数字どれかひとつを入力するとB列へ自動的に指定した文字を返す作業を試みています。
B1に下記の関数を入れましたが、数式の結果がおかしくなってしまい困っています。

A1に入力した『1』をB1には『10本』と反映したいので

=TEXT(A1,("[=1]10台;[=2]20台;[=3]30台;[=4]40台;[=5]50台;;"))

と入れましたが、数式結果が11台となってしまいます。
『10台』を数字とみなしてしまっているためなのか…と思い、いろいろ
と修正を試みましたが、原因がわかりませんでした。

また、TEXT関数の他に何か良い方法がありましたら、ご伝授ください。
どうぞ、よろしくお願いいたします。

Aベストアンサー

#3です。
補足に関して、
ユーザー定義の書式に
(1)文字色の書式記号の[]
http://homepage1.nifty.com/kenzo30/ex_kisotoku/ex_ks_tokubetu3.htm
(2)正の場合の書式;負の場合の書式;ゼロの場合の書式
のほかに3つまで書式が設定できるように見える場合があるますね
[=1]"男子";[=2]"女子";;のように。
しかし;でいくつでも続けられるわけでなく、3つまでのようです。それを超えると#VALUE!になるようです。ですから質問の例では使えません。本来正負0の各場合の書式のはずが、[=1]"男子";[=2]"女子";;のように使える関連は、同じパターンに当たるのかどうか、よく理解できないでいます。
http://www.excel.studio-kazu.jp/lib/e3g/e3g.htmlの「基本」のところ
http://kiyopon.sakura.ne.jp/situmon/kaitou/index07.htm
(3)条件の書式記号
これも文字色の書式設定。
http://homepage1.nifty.com/kenzo30/ex_kisotoku/ex_ks_tokubetu3.htmの最後のあたり
そういうことで
=TEXT(A1,("[=1]10台;[=2]20台;[=3]30台;[=4]40台;[=5]50台;;"))
は無理があります。

#3です。
補足に関して、
ユーザー定義の書式に
(1)文字色の書式記号の[]
http://homepage1.nifty.com/kenzo30/ex_kisotoku/ex_ks_tokubetu3.htm
(2)正の場合の書式;負の場合の書式;ゼロの場合の書式
のほかに3つまで書式が設定できるように見える場合があるますね
[=1]"男子";[=2]"女子";;のように。
しかし;でいくつでも続けられるわけでなく、3つまでのようです。それを超えると#VALUE!になるようです。ですから質問の例では使えません。本来正負0の各場合の書式のはずが、[=1]"男子";[=2]"...続きを読む

Q物理学の問題です この問題の答えが出ません 答えは(R1E2+R2E1)/R1R2+jωLR1+jω

物理学の問題です
この問題の答えが出ません
答えは(R1E2+R2E1)/R1R2+jωLR1+jωLR2です
計算方法を教えてください

Aベストアンサー

E1による左半分の回路の時計向き電流 I1, E2による右半分の回路の反時計向き電流 I2 とすれば
 E1 = I1*R1 + (I1 + I2)*jωL  ①
 E2 = I2*R2 + (I1 + I2)*jωL  ②

I = I1 + I2 より、I2 = I - I1 を使って
① E1 = I1*R1 + I*jωL     ③
② E2 = (I - I1)*R2 + I*jωL = I*R2 - I1*R2 + I*jωL   ④

③*R2 + ④*R1 より
  E1*R2 + E2*R1 = I*R1*R2 + (R1 + R2)*I*jωL
          = I*[R1*R2 + (R1 + R2)*jωL]

よって
  I = (E1*R2 + E2*R1) / [R1*R2 + (R1 + R2)*jωL]

QExcel2002VBAを使っての集計方法(集計条件が多い場合)

Excel2002を使用しています。
“コード”を Sheet1のセルA1 として
下記の様なリストがあります。

コード 対象区分 件数
201     1    1
102     5    5
503     4    2
201     2    2
108     2    3
108     8    4
324     9    5

このリスト使って件数を集計するのですが、
集計条件が下記の条件です。
 集計条件
  コード 201 503
  対象区分 1 4 7 8 9

この条件を満たす件数の合計3をExcelVBAを使って
Sheet2のセルA1に入力したいのですが、効率の良い
書き方が思い付きません。

現在の私の知識では、以前こちらでご教授頂いた
下記の方法

Dim x As Range
Dim sum

sum = 0

For Each x In Sheets(1).Range("A:A")
If x.Value = 201 _
And (x.Offset(0, 1).Value = 1 Or _
x.Offset(0, 1).Value = 4 Or x.Offset(0, 1).Value = 7 Or _
x.Offset(0, 1).Value = 8 Or x.Offset(0, 1).Value = 9) Then
sum = sum + x.Offset(0, 2).Value
End If

If x.Value = 503 _
And (x.Offset(0, 1).Value = 1 Or _
x.Offset(0, 1).Value = 4 Or x.Offset(0, 1).Value = 7 Or _
x.Offset(0, 1).Value = 8 Or x.Offset(0, 1).Value = 9) Then
sum = sum + x.Offset(0, 2).Value
End If
Next

Sheets(2).Range("A1").Value = sum
End Sub

しか分からないのですが、以前よりも仕事で扱う
コード数が増えてしまい、実際は集計条件のコード
が100ぐらいあり、
 If x.Value = 集計条件のコード
  ・・中略・・
 End If
を100近く書いて処理するのは、効率の面、速度の面からきびしくなってしまいました。

定数等を使ってやってみたものの上手くいかず煮詰まっています。
何とぞご教授よろしくお願いします。

Excel2002を使用しています。
“コード”を Sheet1のセルA1 として
下記の様なリストがあります。

コード 対象区分 件数
201     1    1
102     5    5
503     4    2
201     2    2
108     2    3
108     8    4
324     9    5

このリスト使って件数を集計するのですが、
集計条件が下記の条件です。
 集計条件
  コード 201 503
  対象区分 1 4 7 8 9

この条件を満たす件数の合計3をExcelVBAを使っ...続きを読む

Aベストアンサー

そうねぇ・・・・まずは、すぐできるとこからチューンしていきましょうか。

If x.Value = 503 And (x.Offset(0, 1).Value = 1 or x.Offset(0, 1).Value = 4 or x.Offset(0, 1).Value = 7 or x.Offset(0, 1).Value = 8 or x.Offset(0, 1).Value = 9) then
sum = sum + x.Offset(0, 2).value
Endif
の代わりに、
If x.Value = 503 Then
Select Case x.Offset(0, 1).Value
Case 1, 4, 7, 8, 9
sum = sum + x.Offset(0, 2).Value
End Case
End If
という構文が利用できる。さらに、x.Valueの201と503で、x.Offset(0, 1)の条件が変わらないのであれば、
Select Case x.Value
Case 201, 305 ' -[1]
Select Case x.Offset(0, 1).Value
Case 1, 4, 7, 8, 9
sum = sum + x.Offset(0, 2).Value
End Select
End Select
という風に、Select Case構文をx.Valueとx.Offset(0, 1).Valueに対して入れ子で書いてあげると、x.Valueの値が201と305の他に増えていっても、[1]の部分にその数字を追加してあげるだけで動作するようになる。

まぁ、残念ながらこれでは集計速度は変わらない。が、効率は格段に向上するはずだ。

' 修正後 全ソース
Dim x As Range
Dim sum
sum = 0
For Each x In Sheets(1).Range("A:A")
Select Case x.Value
Case 201, 305 ' -[1] 集計条件のコードが増えたら、ここにコードを追加する
Select Case x.Offset(0, 1).Value
Case 1, 4, 7, 8, 9
sum = sum + x.Offset(0, 2).Value
End Select
End Select
Next
Sheets(2).Range("A1").Value = sum
End Sub

今机上でプログラムを修正したので、実行テストはしていないのでよろしく。

そうねぇ・・・・まずは、すぐできるとこからチューンしていきましょうか。

If x.Value = 503 And (x.Offset(0, 1).Value = 1 or x.Offset(0, 1).Value = 4 or x.Offset(0, 1).Value = 7 or x.Offset(0, 1).Value = 8 or x.Offset(0, 1).Value = 9) then
sum = sum + x.Offset(0, 2).value
Endif
の代わりに、
If x.Value = 503 Then
Select Case x.Offset(0, 1).Value
Case 1, 4, 7, 8, 9
sum = sum + x.Offset(0, 2).Value
End Case
End If
という構文が利用できる。さらに、x.Valueの201と503で、...続きを読む


人気Q&Aランキング

おすすめ情報