• ベストアンサー

エクセル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バイト単位で表示されています。 高度な処理だと思いますが分かる方教えてください。よろしくお願い致します。

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

  • ベストアンサー
  • gu-tarou
  • ベストアンサー率42% (6/14)
回答No.5

申し訳ないのですが私は 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

okkouta
質問者

お礼

プログラミングの知識がないばっかりに皆さんにご迷惑をおかけしましたが、親切にご回答くださる方がいらっしゃったので助かりました。ありがとうございます。うれしい限りです。

その他の回答 (5)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.6

#1です。 #5さんの回答で出来ますね。素晴らしいです。 いまさら出る幕は無いのですが、ちょっと別のアプローチを思いついたので書きます。 頭数によって枠番と馬番の関係は決まっていると思いますし、データの位置も同じなら、事前に希望の形で出走頭数毎のシートを用意しておいたらどうでしょう? 枠列の値が 1-5 なら先頭の1と最後の5で、オッズデータの読む行と読む位置を見つけて転記するって感じです。

  • gu-tarou
  • ベストアンサー率42% (6/14)
回答No.4

やっとアップ出来た。 こんな感じで如何ですか? '元データ 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

okkouta
質問者

お礼

No.1の方のお礼と補足欄に書いたようにお願いしているんですが、上のプログラムをそのままVBAのEditorにコピー&ペーストしても動きませんよね?それに出来上がりイメージのようになるのかな~。"*"(アスタリスク:出走取り消し馬の取り扱いもされてないみたいだし・・・。申し訳ないけどプログラミングの知識が超初級なのでこのコーナーでお願いした次第です。すみません。

  • gu-tarou
  • ベストアンサー率42% (6/14)
回答No.3

ちょっとお聞きしたいのですが 元データとは JRA-VAN Data Lab ですか KOL ですか? JRA-VAN Data Lab の場合  (1)馬毎データ  (2)オッズ1 単複枠  (3)オッズ2 馬連 の3つを同時に読込むことで枠連と馬連の関係はクリアー出来ると思いますが。 馬毎データに馬番と枠番が載っているのですから。 其処からオッズを読込んで行けば何とかなると思いますが。

okkouta
質問者

お礼

回答のデータは有料でしょう? 私は無料のソフトから入手しているので・・・

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 九天社に以下のような本がありますから、参考にしてみたらいかがですか? Excel VBAで自分で作る 『DIY 競馬プログラミング』 私などは、まったく分かりませんし、単発のデータだけでは、無理だと思いますから。

参考URL:
http://www.9-ten.co.jp/list/key_keiba.php
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

最後までお付き合い出来るか解りませんが、、、 ご質問を読んでいくつか疑問が出ました。 元データは固定長とありますが、同じレースの枠番データなら同じ長さなのでしょうか? これが1枠のデータなら、 01:------000151000055000234000524000036000235 2枠のデータはこう? 02:000151------000344000012000988000123000036 あと、枠連データと馬連データは別々に取得するのでしょうか? もう少しサンプルデータや完成形のイメージがわく説明があると理解されやすいかも。

okkouta
質問者

お礼

まさにおっしゃるとおりで、同じレースの枠番データなら同じ長さです。すなわち 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:------------------------------------------------------------------------------------------------------------という風に記載されています。 ちなみに出走取り消し馬の馬番のところは******になります。 今ちょっと時間がないので、貼り付けイメージは後で記入させていただきます。

okkouta
質問者

補足

下の補足です。質問に書いたもの 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           ・           ・           ・  です。よろしくお願いします。

関連するQ&A

  • 競馬データベースをエクセルの関数で作りたいのですが

     初めまして。少し前にここのカテゴリと違う場所で質問をしてしまいましたので、改めてこの場所をお借りして質問させて頂きます。  私、EXCELで趣味的に競馬データを作っている者ですが、ある部分で躓いてしまい難儀しております。  添付画像のように競馬データをサイトからテキストでコピーしているのですが、黄色の「B3~B12」の部分は出走頭数により行全体が上下に可変します。  膨大なデータ量となるため、同じセル範囲に1レース分を一度にコピー・ペーストし、あとでデータベースとなる固定のフォーマットを作りたいのです。  当然ながら払戻金の項目も出走数により上下するのですが、これを解決しようと可変しても、セル中の文字がどのレースデータをペーストしても固定である、「B14」の「▼払戻金」という文字を基準に下へ向いて関数を作ることは出来ました。  F5=INDEX(B3:B30,MATCH("▼払戻金",B3:B30,0)+1,1,1)で+の右数字を増やす事で、3つの複勝や同着だった場合の枠連・馬連の空欄にも対応できる項目のペーストがF列に出来たのですが、その横にあるC列の馬番やD列の払い戻し金額をそのままG列・H列に抽出するところで挫折しています。  F列に入力してある関数を利用して違う関数をネストするように組まなければ、上下にデータが動くためセルを固定できないので、何とか「▼払戻金」の文字位置を基準に抽出できないかと試行錯誤してみたのですが、単勝の横にある7の数字も680円の数字も出現してくれません。  当方VBAなど触った事もなく、できれば関数で処理できる方法があれば、どなたかご教授くださいませ。  よろしくお願いいたします。

  • EXCELのデータベース利用について(VBA)

    VBA初心者の者です。 下記の様なEXCELファイルを作りたいのですが、どのようにすれば良いのか まったくわかりません。 ACCESSでの構築が簡単なのかもしれませんが、データ量がそれほど多くないことと 職場にACCESSがないため、可能であればEXCELで構築したいと考えています。 私自身、プログラムの知識がなく、EXCEL VBAのサイトを確認するのですが、いまいち どうすれば良いのかわかりません。 ぜひご教授の程よろしくお願いします。 3つのシートの構成は以下になります。 【入力シート】 A1セルに文字列(A~Z)入力欄 【○○データシート】 A列に A~Z の文字列 B列に 001~100までの数値 C列に 001~100までの数値 D列に 001~100までの数値 E列に 001~100までの数値 例)    A列   B列   C列   D列   E列 1   A   001 2   B   001    002    003   004 3   C   003 4   D   002    003 【▽コマンドシート】 A列に 001~100までの一意の数字 B列に 文字列(コマンド) C列に 文字列(コマンド詳細) 例)    A列    B列    C列 1   001   xx     blank 2   002   xxx△   xxx 3   003   xxxx    x○ 4   004   xxxxx   xxx 【欲しいVBA】 1、入力シートのA1セルに○○データシートのA列に該当するA~Zの 文字列を入力。 2、○○データシートのB列~F列までの数値を参照 3、2の数値において▽コマンドシートのA列に記載ある番号と紐づけを行い、 ▽コマンドシートのB列、C列に記載がある文字列を入力シートのB列、C列にコピー ※コピー時は▽コマンドシートの書式や体裁情報も含めてコピー。 例としては以下になります。 入力シートの A1セルにDを入力した場合は 入力シート    A列    B列    C列 1   D    xxx△  xxx 2        xxxx    x○ 3 以上、ご教授よろしくお願いします。

  • エクセルVBAについて

    エクセルVBA初心者です。 以下のような処理をしたくて、色々な質問等を見て組み合わせて動かしてみたものの、なかなかうまくいかず困っております。アドバイスいただけないでしょうか? 「Sheet1」に以下のようなデータがあります。 <A列> <B列> <C列> ok59  886 ok88 ok70 777 ok75 okGG 478 ok66 ok97 358 ok58 ok69 764 ok47 ok39 368 ok40 okGG 794 ok68 ok85 463 ok75 ・    ・ ・ ・    ・ ・ A列とC列にはそれぞれ「ok+2桁の数字or文字」が入っています。 B列は特に今回は使わないデータですが、数字が入っています。 やりたいことは以下の通りです。 A列に「GG」を含む文字列(実質okGGしかない状態です)が出てきたとき、 その1つ下の行のA列とC列のセルをピックアップし、背景色をピンク色にします。 上の例だと、A列は「ok97」と「ok85」、B列は「ok58」と「ok75」のセルが該当します。 さらにピンク色にピックアップしたセルのから、頭の「ok」を除いた数字を3.5倍した数字を、 別のシートに抽出したいのです。 なので、上の例を使用した場合の抽出したデータは以下のようになります。 <A列> <B列> 339.5 203 297.5 262.5 ちょっと複雑なのですが、どのようにするのがよいのでしょうか? また、別シートに抽出したいのですが、 「Sheet1」の特定のセルに日付が入っているので、 できればその日付の名前のシートを作り、そこに抽出できたらなぁ・・・と考えています。 「Sheet1」にデータを貼り付けて、ボタンをポンっとおしたら日付の名前のシートができて、 欲しいデータが抽出されていく・・・というイメージです考えています。 どうぞよろしくお願いします。

  • エクセル関数の文字列操作で困ったことが

    競馬のオッズデータの取り込みを行っていますが、外部データをエクセルのシート(sheet2)に取り込んだ際、決まった場所に単勝と複勝のオッズデータが入っているのですが、(000022000336・・・のように6バイトを1頭分のオッズとして表示:上の例では馬番(1)のオッズが2.2倍、馬番(2)のオッズが33.6倍というように)17頭までは文字列でずらーっと表示されるのになぜか18頭のときだけ1.17E+105などというような表示になってしまいます。 このオッズデータからMID関数で6文字ずつ分割してそれぞれの馬番のセルに貼り付けていたので18頭の時はエラーになってしまいます。参考書はVBAでプログラムを組んでオッズの取り込みからセルへの貼り付けまでスムーズに行えているようですが、私がやってもVBAでうまくいかないためやむを得ずエクセル関数で処理した次第です。 この問題うまく解決できますか?

  • Excel VBAを使って会員検索

    Sheet1のA列に会員番号、B列に氏名、C列にフリガナ、D列に住所といったデータがあります。 Sheet2のA列に会員番号のみがあります。 この2つのデータを照合して、一致した場合のみ、Sheet1の該当会員データの横のセルに“一致”もしくは“1”などの値(上の例だとSheet1のE列に)を入力できるようなVBAを組みたいのですが、教えていただけますでしょうか?

  • エクセルVBAで困ってます。

    エクセルVBAで困っています。 データ入力済みのシートが2つあります。 シート名を「Sheet1」「Sheet2」とします。 「Sheet1」のA列のデータが「Sheet2」のA列のデータと一致した時に それぞれのシートのセル番地を取得したいのですが出来ません。 教えて下さい。 データの並び順は「Sheet1」と「Sheet2」で異なります。

  • エクセルVBA 文字列の検索

    お知恵をお貸しいただけますと幸いです。 複数のシートがあるエクセルブックで、sheet1のA1には文字列(例:あああ)が入っています。 sheet2のA1には「=sheet1!A1」が入っており、sheet3のA1には「=sheet2!A1」としています。 また、必ずsheet1にデータが入っているわけではなく、sheet2・sheet3から入力されている場合もあります。 VBAを使って任意のシートから「あああ」を検索したいのですが、この場合sheet2と3では検索できません。 どうすれば検索することができるでしょうか? どうぞご教授くださいますようお願いします。

  • エクセルVBAで、指定した文字列間のデータをコピー

     似たようなものがあるのですが、うまくいかないため、 詳しい方お願いします。  指定した2種類の文字列間のデータをコピーするエクセルVBAです。 データは、A1~A50の1列に入っています。 たとえば 北海道:札幌50 函館 20 青森 青森60 弘前30 岩手 盛岡50 rt 500 30 秋田 秋田1 と続きます。 「青森という文字列以降」から「岩手という文字列の前まで」の間のデータ をコピーして、Sheet2へ貼り付けたいです。 可能であれば、青森のデータは、Sheet2のA5,A6へ 岩手のデータはSheet2のA8,A9へ貼り付けたいです。 よろしくお願いします。 エクセル2007です。

  • エクセルVBAによる、行の整理

     始めまして、よろしくお願いします。  シート1とシート2に次のようになっています。 シート1      A  B  C   1     2       ・      99      100 9     101 5     102 3       103 7    104        105   ・  ・ シート2      A  B  C   1     2       ・      99      100 9  3  4  ・・・・     101 5  3  2  ・・・・   102 3  1  0  ・・・・     103 7  5  3  ・・・・  104  105  106 9  ・・ 107 5  ・・ 108 3  ・・ 109 7  ・・ 110  111 9  ・・ 112 5  ・・ 113 3  ・・ 114 7  ・・ 115 116 ・  ・  ・  ・  シート1、シート2のA列にはデーター銘の番号が。シート2のB、C、D・・・列にはデーターが入っています。シート1のA列データー銘の番号の追加(データー銘番号1)、順番を変え、マクロを実行すると シート1      A  B  C   1     2       ・      99      100 3     101 7     102 1       103 9    104        105   ・  ・ シート2      A  B  C   1     2       ・      99      100 3  1  0  ・・・・     101 7  5  3  ・・・・   102 1       103 9  3  4  ・・・・  104  105  106 3  ・・ 107 7  ・・ 108 1   109 9  ・・ 110  111 3  ・・ 112 7  ・・ 113 1   114 9  ・・ 115 116 ・  ・  ・  ・ シート2の(100-103、106-109,111-114の3グループ)行ごとデーターすべてが、シート1A列のデーター銘番号順に整理したいと思います。実際は整理されるデーター銘番号や、行ごと(ここでは整理される100-103、106-109,111-114の3グループですが)の数はかなり多くなります。シート1で削除されたデーター銘番号は、シート2ではデーターすべてが削除されます。(ここではデーター銘番号5がそうです)  解る方、できる方、よろしくお願いします。

  • Excel VBA

    Sheet1は個票データで、 第一列にid番号、第二・三・四列にそれぞれの属性の種類が(数値で)入っているとします。 (例 id 性別 年齢 身長) Sheet2には、 第一・二・三列にSheet1の第二~三列に対応する属性の種類が辞書的順番に網羅されていて、 第四列に、第一~三列に対応する値が入っているとします。 (例 性別 年齢 身長 体重) このときSheet1の第五列に、Sheet2の第四列から対応する値を貼り付けるには、 どのようなプログラムを書けばよろしいでしょうか。 よろしくお願いします。