- ベストアンサー
エクセルVBAプログラミングに関して(競馬ソフト)
あるテキストファイルから文字列データ(オッズデータ)を取り出してエクセルのシートに貼り付けようと試みています。競馬をされている方は分かると思いますが、出走頭数により枠連と馬連の関連が変わります。(例:馬連(1)-(13)は18頭立てなら枠連1-7、13頭立てなら枠連1-8。馬連(7)-(15)は18頭立てなら枠連4-7、16頭立てなら4-8。)これを出走頭数の変化に伴ってエクセルの同一シート内にそれぞれ対応したオッズを貼り付けるにはどういったプログラムを(VBAマクロ)組めばいいでしょうか? A列に枠連の番号(若い番号順に1-1、1-2、・・・) B列にその枠連のオッズ C列に対応する馬連の番号(先ほどの例で言えば馬連(1)-(13)は18頭立てなら枠連1-7に、13頭立てなら枠連1-8に含まれる) D列にその馬連のオッズ A列の枠連の番号に関していえば、当然出走頭数により存在しないものが出てくる(例:13頭立てのときの1-1,2-2,3-3いわゆる”ゾロ目”) 元データには枠連、馬連ともにA列のある行に固定長文字列で 01:------000151000055000234000524000036000235 などというように 01:=軸1番から 枠連(馬連)1-1=オッズなし(------) 枠連(馬連)1-2=15.1 枠連(馬連)1-3=5.5 と6バイト単位で表示されています。 高度な処理だと思いますが分かる方教えてください。よろしくお願い致します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
申し訳ないのですが私は EXCEL の知識が全くないんです。 セルからデータを読み、別のセルに代入と言う事もできません。 EXCEL の VBAのEditor と言われても何の事か分かりません。 Sub プロシージャ の事をいうのでしょうか? だったらそのまま貼り付ければ動くと思います。 競馬の予想ソフトを作ろうとしている方が、これを EXCEL に移植出来ない。なんて信じられません。 もしこのプログラムが理解できないのであれば、私にはお手伝い出来ません。 (出走頭数と馬番・枠番の関係は非常に難しいんです。出来る人は限られるかも。) Ozz$(153, 4)の出来上がりイメージは、以下の様になります。 1(枠連)2:枠オッズ 3:馬連 4:馬オッズ 1-1 .0 01-02 15.1 1-2 15.1 01-03 5.5 1-2 15.1 01-04 23.4 1-3 5.5 01-05 52.4 1-3 5.5 01-06 3.6 取消し、除外馬の箇所のオッズは Val関数で変換された時点で0になります。 自分の好きな様に表示を変えてください。(有効オッズで0になる事はありません!) とりあえず間違えてしまった箇所を訂正しておきます。 「枠に何頭入っているかを調べる。」の部分を勘違いして間違えました。以下の様に訂正して下さい。 '元データ Dim 枠Data(8), 馬Data(18), Wozz, Uozz 'Ozz$(153,4) は 153通りあり、1:枠 2:枠連OZZ 3:馬連 4:馬連OZZ を入れる。 Dim 枠頭数%(8), 枠番%(18), Ozz$(153, 4), uma1%, uma2% 'サンプルデータ tousu = 18 枠Data(1)="01:------000151000055000234000524000036000235000324" 馬Data(1)="01:------000151000055000234000524000036000235000324" '枠に何頭入いるかを調べる。 For i = 1 To tousu If i <= 8 Then w = i Else w = 9 - i Mod 8: If w = 9 Then w = 1 End If 枠頭数(w) = 枠頭数(w) + 1 Next i '馬番と枠の関係 ban = 0 For w = 1 To 8 For i = 1 To 枠頭数(w) ban = ban + 1 枠番(ban) = w Next i, w '組み合わせ と オッズ n = 0 For uma1 = 1 To tousu - 1 For uma2 = uma1 + 1 To tousu n = n + 1 waku1 = 枠番(uma1): waku2 = 枠番(uma2) '枠連 Ozz(n, 1) = Format(waku1, "#") + "-" + Format(waku2, "#") '枠連オッズ Wozz = Val(Mid(枠Data(waku1), 6 * (waku2 - 1) + 4, 6)) / 10 Ozz(n, 2) = Format(Wozz, "#.0") '馬連 Ozz(n, 3) = Format(uma1, "0#") + "-" + Format(uma2, "0#") '馬連オッズ Uozz = Val(Mid(馬Data(uma1), 6 * (uma2 - 1) + 4, 6)) / 10 Ozz(n, 4) = Format(Uozz, "#.0") Next uma2 Next uma1
その他の回答 (5)
- papayuka
- ベストアンサー率45% (1388/3066)
#1です。 #5さんの回答で出来ますね。素晴らしいです。 いまさら出る幕は無いのですが、ちょっと別のアプローチを思いついたので書きます。 頭数によって枠番と馬番の関係は決まっていると思いますし、データの位置も同じなら、事前に希望の形で出走頭数毎のシートを用意しておいたらどうでしょう? 枠列の値が 1-5 なら先頭の1と最後の5で、オッズデータの読む行と読む位置を見つけて転記するって感じです。
- gu-tarou
- ベストアンサー率42% (6/14)
やっとアップ出来た。 こんな感じで如何ですか? '元データ Dim 枠Data(8), 馬Data(18), Wozz, Uozz 'Ozz$(153,4) は 153通りあり、1:枠 2:枠連OZZ 3:馬連 4:馬連OZZ を入れる。 Dim 枠頭数%(8), 枠番%(18), Ozz$(153, 4), uma1%, uma2% tousu = 18 '枠に何頭入っているかを調べる。 For i = 1 To tousu w = i Mod 8: If w = 0 Then w = 8 枠頭数(w) = 枠頭数(w) + 1 Next i '馬番と枠の関係 ban = 0 For w = 1 To 8 For i = 1 To 枠頭数(w) ban = ban + 1 枠番(ban) = w Next i, w '組み合わせ と オッズ n = 0 For uma1 = 1 To tousu - 1 For uma2 = uma1 + 1 To tousu n = n + 1 waku1 = 枠番(uma1): waku2 = 枠番(uma2) '枠連 Ozz(n, 1) = Format(waku1, "#") + "-" + Format(waku2, "#") '枠連オッズ Wozz = Val(Mid(枠Data(waku1), 6 * (waku2 - 1) + 1, 6)) / 10 Ozz(n, 2) = Format(Wozz, "#,0") '馬連 Ozz(n, 3) = Format(uma1, "0#") + "-" + Format(uma2, "0#") '馬連オッズ Uozz = Val(Mid(馬Data(uma1), 6 * (uma2 - 1) + 1, 6)) / 10 Ozz(n, 4) = Format(Uozz, "#,0") Next uma2, uma1
お礼
No.1の方のお礼と補足欄に書いたようにお願いしているんですが、上のプログラムをそのままVBAのEditorにコピー&ペーストしても動きませんよね?それに出来上がりイメージのようになるのかな~。"*"(アスタリスク:出走取り消し馬の取り扱いもされてないみたいだし・・・。申し訳ないけどプログラミングの知識が超初級なのでこのコーナーでお願いした次第です。すみません。
- gu-tarou
- ベストアンサー率42% (6/14)
ちょっとお聞きしたいのですが 元データとは JRA-VAN Data Lab ですか KOL ですか? JRA-VAN Data Lab の場合 (1)馬毎データ (2)オッズ1 単複枠 (3)オッズ2 馬連 の3つを同時に読込むことで枠連と馬連の関係はクリアー出来ると思いますが。 馬毎データに馬番と枠番が載っているのですから。 其処からオッズを読込んで行けば何とかなると思いますが。
お礼
回答のデータは有料でしょう? 私は無料のソフトから入手しているので・・・
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 九天社に以下のような本がありますから、参考にしてみたらいかがですか? Excel VBAで自分で作る 『DIY 競馬プログラミング』 私などは、まったく分かりませんし、単発のデータだけでは、無理だと思いますから。
- papayuka
- ベストアンサー率45% (1388/3066)
最後までお付き合い出来るか解りませんが、、、 ご質問を読んでいくつか疑問が出ました。 元データは固定長とありますが、同じレースの枠番データなら同じ長さなのでしょうか? これが1枠のデータなら、 01:------000151000055000234000524000036000235 2枠のデータはこう? 02:000151------000344000012000988000123000036 あと、枠連データと馬連データは別々に取得するのでしょうか? もう少しサンプルデータや完成形のイメージがわく説明があると理解されやすいかも。
お礼
まさにおっしゃるとおりで、同じレースの枠番データなら同じ長さです。すなわち 01:------000151000055000234000524000036000235000324 02:000151------000344000012000988000123000036000555 03:000055000344------000654000789000256000258000156 04:000234000012000654------000625000369000147000056 05:000524000988000789000625------000654000789000321 06:000036000123000256000369000654------000951000753 07:000235000036000258000147000789000951------000684 08:000324000555000156000056000321000753000684------ という様にA列の26行目から34行目までに固定長文字列で並んでいます。 馬連も同様の並びで38行目から55行目まで(すなわち18頭分すべて)並んでいます。17頭立てのときは 18:------------------------------------------------------------------------------------------------------------という風に記載されています。 ちなみに出走取り消し馬の馬番のところは******になります。 今ちょっと時間がないので、貼り付けイメージは後で記入させていただきます。
補足
下の補足です。質問に書いたもの A列に枠連の番号(若い番号順に1-1、1-2、・・・) B列にその枠連のオッズ C列に対応する馬連の番号(先ほどの例で言えば馬連(1)-(13)は18頭立てなら枠連1-7に、13頭立てなら枠連1-8に含まれる) D列にその馬連のオッズ A列の枠連の番号に関していえば、当然出走頭数により存在しないものが出てくる(例:13頭立てのときの1-1,2-2,3-3いわゆる”ゾロ目”) の出来上がりのイメージとしては A(枠連)B(枠連オッズ)C(馬連)D(馬連オッズ) 1-2 5.2 1-2 6.8 1-3 12.6 1-3 15.9 1-3 12.6 1-4 30.8 1-4 8.9 1-5 9.8 1-4 8.9 1-6 15.7 1-5 35.9 1-7 46.8 1-5 35.9 1-8 98.9 ・ ・ ・ です。よろしくお願いします。
お礼
プログラミングの知識がないばっかりに皆さんにご迷惑をおかけしましたが、親切にご回答くださる方がいらっしゃったので助かりました。ありがとうございます。うれしい限りです。