[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ここって』(ヒロユキ)
いつもお世話になっております
ここってグーグルのスプレッドシートのURL載せても大丈夫でしょうか
文章で説明しにくい内容なのでどうしたものかと悩んでいます
< 使用 Excel:unknown、使用 OS:Windows7 >
セキュリティの関係上、リンクを閲覧することを避ける回答者もいらっしゃいます。
リンクを張るのは自由ですが、回答者がリンク先を見るかどうかも 自由です。
↓はここの注意書きです。
初めての方へ https://www.excel.studio-kazu.jp/wiki/excelboard/
>5) Wikiに書き込む場合の整形ルール •http://www.hyuki.com/ のようなURLは自動的にリンクになります (通りすがり) 2021/01/18(月) 18:07
>悪
解決につながらない書き込みの方がよっぽど迷惑だ。
>ヒロユキさん
気にしないで書き込んでください。 (通りすがり) 2021/01/18(月) 20:49
2R
3歳未勝利
10:40 ダ1800m 16頭
以下続く
の状態のものを
べつのシートにて
1R 3歳未勝利 10:10 ダ1200m 16頭
2R 3歳未勝利 10:40 ダ1800m 16頭
みたいにしたいです
ただし
開催レース一覧 重賞スケジュール 今週のレース一覧へ PDF競馬新聞
より下のセルを対象にしたいです
わかりにくくてすいませんがよろしくお願いします
(ヒロユキ) 2021/01/18(月) 21:41
ウエブクエリではなくコピペですか。
今スマホからですのでデータの区切りかをスペースな
のかタブなのか分かりませんので、次のレスは明日パソ
コンから見てになります。
(通りすがり) 2021/01/18(月) 22:46
(γ) 2021/01/19(火) 00:12
試しに1/17 1回 中京 6日目の部分をWEB上でコピーし一旦テキストエディタ(今回は windows添付のメモ帳)に貼り付けた後テキストエディタをコピーし余計な色情報とか をクリアし、シートのA1に貼り付けたら、
A2に「1R」 A5に「3歳未勝利」 A7に[「10:01 ダ1200m 16頭 」
と貼り付きました。
別のシートのA1に =INDIRECT("Sheet1!A"&(ROW()*8)-6)&" "&INDIRECT("Sheet1!A"&(ROW()*8)-6+3)&" "&INDIRECT("Sheet1!A"&(ROW()*8)-6+5)
とし、後は必要なだけ式を下方向へコピーで行けました。
WEBクエリでざっと試しても、コピペの場合と同じ様なデータになりました。
中京競馬場だけで試しましたが、全競馬場分必要な場合は応用で行けると思いますので 試してみてください。 (通りすがり) 2021/01/19(火) 19:19
マクロで行う理由は? どこまでご自分で出来てますか? (通りすがり) 2021/01/19(火) 20:02
マクロで行うとしても、考え方は関数で行うのとさほど 変わらないと思いますよ? (通りすがり) 2021/01/19(火) 20:03
参考過去ログです。
[[20180129082743]] 『VBAを練習するには』(掛け時計)
(通りすがり) 2021/01/19(火) 20:09
Application.ScreenUpdating = False Dim cnt As Long Dim r As Long Dim レース番号 As Variant Dim レース名 As Variant Dim 時刻 As Variant Dim shp As Shape cnt = 1
For r = min_row To max_row
If Worksheets("マクロ処理前").Cells(r, 1).Value Like "*R" Then 'データ取得
レース番号 = Worksheets("マクロ処理前").Cells(r, 1).Value
レース名 = Worksheets("マクロ処理前").Cells(r + 1, 1).Value
時刻 = Worksheets("マクロ処理前").Cells(r + 2, 1).Value
'データマクロ処理後
Worksheets("マクロ処理後").Cells(cnt, 3).Value = レース番号
Worksheets("マクロ処理後").Cells(cnt, 4).Value = レース名
Worksheets("マクロ処理後").Cells(cnt, 5).Value = 時刻
cnt = cnt + 1
End If
Next r
Application.ScreenUpdating = True End Sub
とりあえずテストをしてみたところ 動きました
(ヒロユキ) 2021/01/19(火) 22:33
頑張りましたね。 (通りすがり) 2021/01/20(水) 07:33
>作業的には >サイトをコピペ→マクロで作業(ここまでで構いません)→蓄積用シートにコピペ >をかんがえています
全部をマクロ化してみては?
(何をどう蓄積するかわからないですが。)
エクセルにはWebからデータを取り込む機能があります。
「Webクエリ」だったり「パワークエリ→Web接続」だったりバージョンによって
名前が違うようですが。
例えば、
ヤフー競馬なら、
https://keiba.yahoo.co.jp/
ここから次週の予定を取り込みます。
Column1 Column2 Column3 1月23日土曜日 1回中山7日 初富士ステークス芝・右 1800m 1600万下 1月23日土曜日 1回中京7日 若駒ステークス(L)芝・左 2000m オープン 1月23日土曜日 1回小倉3日 小倉城特別ダート・右 1700m 1000万下 1月24日日曜日 1回中山8日 アメリカジョッキークラブカップ(GII)芝・右・外 2200m オープン 1月24日日曜日 1回中京8日 東海テレビ杯東海ステークス(GII)ダート・左 1800m オープン 1月24日日曜日 1回小倉4日 豊前ステークスダート・右 1700m 1600万下
で、
1回中山7日 のレース一覧は、
https://keiba.yahoo.co.jp/race/list/21060107/
たぶんここのアドレスで取得できます。(金曜午後に確定?)
で、このURLアドレスの最後の数字に注目してください。
21060107 の
21 → 西暦2021年
06 → 中京
01 → 1回
07 → 7日
という意味です。
なので、さっき取得した次回レースの
1回中山7日 を 21060107に変換することで、
その日のレース一覧のページのアドレスが作れます。
作ったアドレスで、またWebクエリしたら、欲しいデータが得られるかと
思います。
https://race.netkeiba.com/top/?rf=navi
↑こちらのサイトでは、
ブラウザで見た感じでは、アドレスが変わらないので、
ちょっと素人では手が出しにくいかなと思いました。
同じく馬や騎手にも番号が振られているので、
様々な公開されているデータを抽出し、
オリジナルの馬柱表も作成可能かと思います。
(まっつわん) 2021/01/20(水) 16:23
二つの日付のURLを比べてみましたが、日によってURLが変わる部分は日付の部分のみのようです。 WEBからワークシートへのコピペとWEBクエリを比較したら、WEBクエリの方が余計なブランク行が少ない分処理しやすそうです。
1/17 https://race.netkeiba.com/top/race_list_sub.html?kaisai_date=20210117¤t_group=1020210123#racelist_top_a
1/23 https://race.netkeiba.com/top/race_list_sub.html?kaisai_date=20210123¤t_group=1020210123#racelist_top_a
ただ、WEBからワークシートへのコピペにせよ、WEBクエリにせよ、WEBの構成が変わったらその都度コードの見直しは必要になってきます。
※余談です。VBAを始めったきっかけが、「自分独自の競馬の馬柱表を自動で作りたい。」だったまっつわんさんが登場されたので非常に心強い です。 (通りすがり) 2021/01/20(水) 17:02
通りすがりさんありがとうございます
昨夜書き込んで思ったのですが
日にちと場名を入れたいなとおもって
まず日にちの部分の取得は昨夜のコードの改良でいいと思うのですが
厄介なのが場名で
1R〜12Rまであって 1Rの6行上に場名があってそれを取得して それを12回(回数は決まってます)くり返して
また1Rの上の場名を取得したいのですが
まだそこまでわからなくて 教えていただきたいです わかりにくければすいません
(ヒロユキ) 2021/01/20(水) 18:01
まっつわんさんご紹介のHPは、日付と競馬場を指定して特定の日付の特定の競馬場の ページを指定できますので、そのページの全レースを取得すればお望みのことと同じ内容 が取得できると思いますが、それではだめなのでしょうか? (通りすがり) 2021/01/20(水) 18:20
に拘るのでしたら、
WEBクエリを試したら
「払戻一覧」の2行上が 「1回 中山 6日目」 とか 「1回 中京 6日目」 だったので、 「払戻一覧」を探して、その2行上を調べるようにすればいいかと思います。 (通りすがり) 2021/01/20(水) 18:27
検索等してみましたか?
VBA関連のサイトで勉強してみましたか?
VBA関連の本は買って勉強しましたか?
(通りすがり) 2021/01/20(水) 22:43
>でも私ループをしたことがなくてどうすればよろしいでしょうか
ご自分で書かれたコードにループが含まれてるんですけど。 (通りすがり) 2021/01/20(水) 22:45
このアドレスでWebクエリ出来ないんですが、
なんか設定あります?
あと、仕事の合間に書いてるので、おおっぴらに競馬のサイトを開けないんで^^;
過度な期待をされても困ります。
席が部長の目の前で、部長に用がある人がちょいちょい後ろ通るんで(爆
とりあえず、ループのやり方。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_for_next.html
(まっつわん) 2021/01/21(木) 08:12
貼り付ける際にリンクが文字化けしてました。 失礼しました。
https://race.netkeiba.com/top/race_list_sub.html?kaisai_date=20210117¤t_group=1020210123#racelist_top_a
(通りすがり) 2021/01/21(木) 08:16
あれ?プレビューではきちんと表示されるんですけど 投稿したら文字化けしますね。
貼り付ける際にリンクが文字化けしてました。 失礼しました。
¤t の部分を & current に修正してください。※「&」と「current」の間のスペース は削除してください。つなげると文字化けするようです。 (通りすがり) 2021/01/21(木) 08:24
Option Explicit
Sub テスト()
'
' Macro4 Macro
Dim max_row As Long
Dim min_row As Long
'開始行と最終行の行番号取得
min_row = Worksheets("マクロ処理前").UsedRange.Row
max_row = Worksheets("マクロ処理前").UsedRange.Rows.Count - min_row - 1
Application.ScreenUpdating = False Dim cnt As Long Dim r As Long Dim レース番号 As Variant Dim レース名 As Variant Dim 時刻 As Variant Dim 場所 As Variant Dim shp As Shape cnt = 1
For r = min_row To max_row
If Worksheets("マクロ処理前").Cells(r, 1).Value Like "*R" Then 'データ取得
レース番号 = Worksheets("マクロ処理前").Cells(r, 1).Value
レース名 = Worksheets("マクロ処理前").Cells(r + 1, 1).Value
時刻 = Worksheets("マクロ処理前").Cells(r + 2, 1).Value
'データマクロ処理後
Worksheets("マクロ処理後").Cells(cnt, 3).Value = レース番号
Worksheets("マクロ処理後").Cells(cnt, 4).Value = レース名
Worksheets("マクロ処理後").Cells(cnt, 5).Value = 時刻
cnt = cnt + 1
End If
Next r
For r = min_row To max_row
If Worksheets("マクロ処理前").Cells(r, 1).Value Like "払戻一覧" Then 'データ取得 場所 = Worksheets("マクロ処理前").Cells(r - 2, 1).Value 'データマクロ処理後
Worksheets("マクロ処理後").Cells(cnt, 2).Value = 場所
cnt = cnt + 1
End If
Next r
Application.ScreenUpdating = True End Sub
ですが動かしてみたところ 場名が変な位置に表示されてしまいましたなぜでしょうか
(ヒロユキ) 2021/01/21(木) 18:21
(ヒロユキ) 2021/01/21(木) 22:23
(ヒロユキ) 2021/01/22(金) 22:53
横から失礼。 各Rの処理をすべて実行して、 そのあとで、場名処理をしているので、 そのとおりの順番で出力されているのでは?
For r = min_row To max_row If Worksheets("マクロ処理前").Cells(r, 1).Value Like "*R" Then ''ここで 各レースの処理(今のとおりのもの) ElseIf Worksheets("マクロ処理前").Cells(r, 1).Value Like "払戻一覧" Then ''ここで 場名の処理(今のとおりのもの) EndIf Next とでもすればよいのでは?
インデントをきちんと付けた方がいいと思います。人のためでなく、自分のためにも。 (γ) 2021/01/23(土) 09:18
Option Explicit
Sub テスト()
'
' Macro4 Macro
Dim max_row As Long
Dim min_row As Long
'開始行と最終行の行番号取得
min_row = Worksheets("マクロ処理前").UsedRange.Row
max_row = Worksheets("マクロ処理前").UsedRange.Rows.Count - min_row - 1
Application.ScreenUpdating = False Dim cnt As Long Dim r As Long Dim レース番号 As Variant Dim レース名 As Variant Dim 時刻 As Variant Dim 場所 As Variant Dim shp As Shape cnt = 1
For r = min_row To max_row
If Worksheets("マクロ処理前").Cells(r, 1).Value Like "*R" Then 'データ取得
レース番号 = Worksheets("マクロ処理前").Cells(r, 1).Value
レース名 = Worksheets("マクロ処理前").Cells(r + 1, 1).Value
時刻 = Worksheets("マクロ処理前").Cells(r + 2, 1).Value
ElseIf Worksheets("マクロ処理前").Cells(r, 1).Value Like "払戻一覧" Then 場所 = Worksheets("マクロ処理前").Cells(r - 2, 1).Value 'データマクロ処理後
cnt = cnt + 1
End If
Next r
Worksheets("マクロ処理後").Cells(cnt, 2).Value = 場所
Worksheets("マクロ処理後").Cells(cnt, 3).Value = レース番号
Worksheets("マクロ処理後").Cells(cnt, 4).Value = レース名
Worksheets("マクロ処理後").Cells(cnt, 5).Value = 時刻
Application.ScreenUpdating = True End Sub としたところ何故か一つしかでなくてまた色々と試してみます
(ヒロユキ) 2021/01/23(土) 17:33
(γ) 2021/01/23(土) 17:53
ループ処理 というものを今一度勉強してください。 ループの中では何も処理がなされてなく、ループ を抜けた後にループのカウントを使った処理を書いても 何の意味もありません。 (通りすがり) 2021/01/23(土) 22:24
2021/01/21(木) 18:21 のヒロユキさんのコードと 2021/01/23(土) 17:33 のヒロユキさんのコードを 見比べてみてください。
何か違いがありませんか? (通りすがり) 2021/01/23(土) 22:26
(1) あなたが提示されたコードにインデントをきちんとつけるとこうなります。
Sub テスト() Dim max_row As Long Dim min_row As Long
'開始行と最終行の行番号取得 min_row = Worksheets("マクロ処理前").UsedRange.Row max_row = Worksheets("マクロ処理前").UsedRange.Rows.Count - min_row - 1 Application.ScreenUpdating = False
Dim cnt As Long Dim r As Long Dim レース番号 As Variant Dim レース名 As Variant Dim 時刻 As Variant Dim 場所 As Variant Dim shp As Shape
cnt = 1 For r = min_row To max_row If Worksheets("マクロ処理前").Cells(r, 1).Value Like "*R" Then レース番号 = Worksheets("マクロ処理前").Cells(r, 1).Value '処理A レース名 = Worksheets("マクロ処理前").Cells(r + 1, 1).Value '処理A 時刻 = Worksheets("マクロ処理前").Cells(r + 2, 1).Value '処理A Worksheets("マクロ処理後").Cells(cnt, 3).Value = レース番号 '処理A Worksheets("マクロ処理後").Cells(cnt, 4).Value = レース名 '処理A Worksheets("マクロ処理後").Cells(cnt, 5).Value = 時刻 '処理A cnt = cnt + 1 '処理A End If Next r For r = min_row To max_row If Worksheets("マクロ処理前").Cells(r, 1).Value Like "払戻一覧" Then 場所 = Worksheets("マクロ処理前").Cells(r - 2, 1).Value '処理B Worksheets("マクロ処理後").Cells(cnt, 2).Value = 場所 '処理B cnt = cnt + 1 '処理B End If Next r Application.ScreenUpdating = True End Sub
(2) 処理Aとか処理Bとかで説明上だけの文字列を使って書くと、 上のコードの大まかな流れは、次のようになります。 cnt = 1 For r = min_row To max_row If Worksheets("マクロ処理前").Cells(r, 1).Value Like "*R" Then 処理A(レース情報の転記) End If Next r For r = min_row To max_row If Worksheets("マクロ処理前").Cells(r, 1).Value Like "払戻一覧" Then 処理B(場名情報の転記) End If Next r これは、 ・まず各行を見ていって、レース情報をすべていったん転記し、 ・その後、また最初からデータを見ていって、場名情報を転記します。 いわば二段階処理です。 だから、最後に場名だけがかたまって出力されます。 そこが、意図と違うんでしょ?
(3) どうなればよいのか、転記列とか詳細は知りませんが、 少なくとも現状(最後に場名情報がかたまって転記される)から抜けるには、次のようにします。
二段階処理ではまずいのだから、下記のように、 一段階処理で、上から各行を見ていって、レース情報、場名情報を発見したつど、 それぞれを転記すればよいのでは、と申し上げたのです。
つまり、おおまかには、 cnt = 1 For r = min_row To max_row If Worksheets("マクロ処理前").Cells(r, 1).Value Like "*R" Then 処理A(レース情報の転記) ElseIf Worksheets("マクロ処理前").Cells(r, 1).Value Like "払戻一覧" Then 処理B(場名情報の転記) End If Next r ということです。 処理A、処理Bのところは、元のコードのそれらを一切変更することなく、 そのままコピーペイストすればいいんですよ。 と書きました。
(4) 上記を理解して、コードを書くのはあなたのほうでお願いします。 (コードを単にもらうだけだと、理解するというプロセスが抜けてしまいます。 そういう積もりで書きましたが、まったく違う方向に進んでしまい少々驚きました。)
インデントのことも書いたけど、無視されているのは何故ですか? しっかりインデントをつけてください。 そうすることで、コードの構造が分かり易くなるはずです。 これはあなたに利益をもたらすことなんです。
また、コードが想定と違う動きをしたら、 ステップ実行 をしてみて下さい。 一行一行がどういう動作になっているかをよく確認して理解してください。
コードを書く作業と、コードを確認して必要に応じて修正する作業は、 どちらも大切な作業です。 正しいコードを頭から書き下せる人は稀です。 だれもがなんらかの勘違いで、想定と異なる結果となることは珍しくありません。 それを修正する作業にも力を入れて取り組んでください。
私はここまでとさせて下さい。
(γ) 2021/01/24(日) 07:23
Option Explicit
Sub テスト()
'
' Macro4 Macro
Dim max_row As Long
Dim min_row As Long
'開始行と最終行の行番号取得
min_row = Worksheets("マクロ処理前").UsedRange.Row
max_row = Worksheets("マクロ処理前").UsedRange.Rows.Count - min_row - 1
Application.ScreenUpdating = False Dim cnt As Long Dim r As Long Dim レース番号 As Variant Dim レース名 As Variant Dim 時刻 As Variant Dim 場所 As Variant Dim shp As Shape cnt = 1
For r = min_row To max_row
If Worksheets("マクロ処理前").Cells(r, 1).Value Like "*R" Then 'データ取得
レース番号 = Worksheets("マクロ処理前").Cells(r, 1).Value
レース名 = Worksheets("マクロ処理前").Cells(r + 1, 1).Value
時刻 = Worksheets("マクロ処理前").Cells(r + 2, 1).Value
Worksheets("マクロ処理後").Cells(cnt, 3).Value = レース番号
Worksheets("マクロ処理後").Cells(cnt, 4).Value = レース名
Worksheets("マクロ処理後").Cells(cnt, 5).Value = 時刻
cnt = cnt + 1
ElseIf Worksheets("マクロ処理前").Cells(r, 1).Value Like "払戻一覧" Then 場所 = Worksheets("マクロ処理前").Cells(r - 2, 1).Value '処理B Worksheets("マクロ処理後").Cells(cnt, 2).Value = 場所 '処理B cnt = cnt + 1 '処理B End If Next r Application.ScreenUpdating = True End Sub
動かしてみたところ
うごくのはうごくのですが
1回 中山 6日目
1R
2R となってしまいます ではなくて
1回 中山 6日目 1R
1回 中山 6日目 2R というふうにしたいです もう少し考えてみます (ヒロユキ) 2021/01/24(日) 19:31
>Worksheets("マクロ処理後").Cells(cnt, 2).Value = 場所 '処理B
これの意味が分かっているのなら、自ずと答えは出てくると思います。 (通りすがり) 2021/01/25(月) 19:53
変数に格納した文字列を結合するだけだと思います。
◯.Value = 変数A & " " & 変数B (通りすがり) 2021/01/26(火) 17:10
' ' Macro4 Macro Dim max_row As Long Dim min_row As Long '開始行と最終行の行番号取得 min_row = Worksheets("マクロ処理前").UsedRange.Row max_row = Worksheets("マクロ処理前").UsedRange.Rows.Count - min_row - 1 Application.ScreenUpdating = False Dim cnt As Long Dim r As Long Dim レース番号 As Variant Dim レース名 As Variant Dim 時刻 As Variant Dim 日付 As Variant Dim 場所 As Variant Dim shp As Shape cnt = 1
For r = min_row To max_row
If Worksheets("マクロ処理前").Cells(r, 1).Value Like "*R" Then 'データ取得
レース番号 = Worksheets("マクロ処理前").Cells(r, 1).Value レース名 = Worksheets("マクロ処理前").Cells(r + 1, 1).Value 時刻 = Worksheets("マクロ処理前").Cells(r + 2, 1).Value Worksheets("マクロ処理後").Cells(cnt, 3).Value = レース番号 Worksheets("マクロ処理後").Cells(cnt, 4).Value = レース名 Worksheets("マクロ処理後").Cells(cnt, 5).Value = 時刻 cnt = cnt + 1
ElseIf Worksheets("マクロ処理前").Cells(r, 1).Value Like "払戻一覧" Then 場所 = Worksheets("マクロ処理前").Cells(r - 2, 1).Value '処理B 日付 = Worksheets("マクロ処理前").Cells(r - 4, 1).Value '処理B
Worksheets("マクロ処理後").Cells(cnt, 2).Value = 場所 & レース番号 '処理B Worksheets("マクロ処理後").Cells(cnt, 1).Value = 日付 cnt = cnt + 1 '処理B End If Next r (ヒロユキ) 2021/01/26(火) 19:37
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.