三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。
よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

Excel VBAで表示変更 10倍以下を赤 小数点を0.0でそろえる 例題:JRA 単勝オッズ取得

タイトルサムネイル

1.小数点をそろえる、オッズ10倍以下を赤にする
見た目を少し、修正してみます。
時間稼ぎの見た目修正よりも、異常なオッズや勝ち馬を探すロジックを組み込めよ・・・
なんて、声が聞こえてきますが。。。

下記、いつもの あのあの 解説動画です・・・
youtu.be
https://youtu.be/rAi_uL41Bp0

2.いつものマクロ記録で作成 ぉぃぉぃ
コードをマクロ記録から探ってみます

'小数点を00.0にする
    Range("E4").Select
    Selection.NumberFormatLocal = "0.0"
'色を赤にする
    Range("E4:E6").Select
    With Selection.Font
        .Color = -16776961
        .TintAndShade = 0
    End With

このコードを組み込みました。

3.オッズの桁と色を変える、ついでに一番人気の馬番(位置)を求める

'2022/05/15 追加 単勝の列 先頭(見出しの部分)を受け取り一番人気を返す
'ついでに 10倍以下のオッズを赤に、小数点の桁をそろえる
Public Function 単勝一番人気を探す(r As Range) As Integer
    Dim オッズ As Double
    Dim 一番人気 As Integer
    
    '初期値を代入
    オッズ = r.Offset(1, 0) '馬番1のオッズを初期値にする
    一番人気 = 1  '馬番1を初期セット
    
    For n = 1 To 18  'MAX18頭まわす、といっても途中で抜けるならForじゃなくても・・
        With r.Offset(n, 0)  'n下のセルを操作したり値を比べる
            If Len(Trim("" & .Value)) = 0 Then Exit For 'データ無しなら抜ける
            '99.9 と 小数点の桁をそろえる
            .NumberFormatLocal = "0.0"
            '10倍以下なら、赤にする
            If .Value < 10 Then
                .Font.Color = -16776961 '赤にする
            End If
            'オッズを比べる
            If .Value < オッズ Then  '一時保存されているオッズより低かったら
                オッズ = .Value 'オッズを代入 更新
                一番人気 = n  '馬番nをセット
            End If
        End With
    Next
    
    単勝一番人気を探す = 一番人気  'リターン値を返す
    '※まったく もう 日本語変数と関数名は良くないな・・・

End Function

'↑今日作成したコード




すべてのソース、昔の必要ないコードも・・・ぉぃぉぃ、ハヤクまとめろよ

#If Win64 Then
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If


'IEのリンクオブジェクトから文字列をInStrで探してクリックする
Public Function IE_Link_InnerHTML_InStr_Click(oDocument As Object, strINSTR As String) As String

    Dim i As Integer
    Dim objA As HTMLAnchorElement
    Dim strWORK As String
    Dim n As Integer
    'リンクから受け取った文字列を返す
    IE_Link_InnerHTML_InStr_Click = "ERR"  '初期値にERRセット
    For i = 0 To oDocument.Links.Length - 1
        '文字列を見つけたら クリック
        If InStr(oDocument.Links(i).outerHTML, strINSTR) > 0 Then '内側のHTML
            
            IE_Link_InnerHTML_InStr_Click = oDocument.Links(i).outerHTML  '見つけたAタグオブジェ(リンク)を代入
            
            Exit For '見つけたのでループを抜ける
        End If
    Next i

End Function


Public Function JRA_Bodyからオッズの時刻を返す(oDocument As Object) As String

    Dim strTEMP As String
    Dim strRETURN As String  'リターン値
    Dim n As Integer
    
    'errでリターン値を初期化
    strRETURN = "ERR 文字列が見つかりませんでした"
    
    'HTMLのBODYテキストを代入
    strTEMP = oDocument.body.innerText

    'まず最終オッズを探す
    If InStr(strTEMP, "最終オッズ") > 0 Then
        strRETURN = "最終"
    End If

    '探す 13時03分現在オッズ  2018/12/09 修正
    '次週確認 7時03分現在オッズ 一けた台の時刻の時
    n = InStr(strTEMP, "現在オッズ")
    If n > 0 Then
        strRETURN = Mid(strTEMP, n - 6, 6)  '時刻を取り出す
    End If

    'リターン値をセット
    strRETURN = Replace(strRETURN, vbLf, "")  '改行vblfを""消す
    JRA_Bodyからオッズの時刻を返す = strRETURN

End Function

Public Function JRA_Bodyから発走時刻を返す(oDocument As Object) As String

    Dim strTEMP As String
    Dim strRETURN As String  'リターン値
    Dim n As Integer
    
    'errでリターン値を初期化
    strRETURN = "発走時刻が見つかりませんでした"
    
    'HTMLのBODYテキストを代入
    strTEMP = oDocument.body.innerText

    '5回中山4日 発走時刻:13時05分
    n = InStr(strTEMP, "発走時刻")
    If n > 0 Then
        strRETURN = Mid(strTEMP, n + 5, 6)  '後ろの時刻を取り出す
    End If

    'リターン値をセット
    JRA_Bodyから発走時刻を返す = strRETURN

End Function




'処理を強引に待つ? oDocument As Object の中身をチェック
Sub htmlfile_WAIT_TEST(oDocument As Object)
    Dim date05 As Date   '5秒後の時刻
    date05 = DateAdd("s", 5, Now())
    
    Do While True
        If Now() < date05 Then Exit Do
        Sleep 250  '0.25秒
        Debug.Print Now()
        On Error Resume Next
        If oDocument.body.innerText > 0 Then Exit Do
        On Error GoTo 0
    Wend
    
End Sub

'20220501 テスト
Sub ie_JRA単勝オッズをレース別に複数蓄積する()  'JRA 単勝オッズの取り込み 馬番順テスト

ActiveWindow.WindowState = xlMinimized '最小表示
DoEvents
    Sleep 1000  '1秒待つ

ActiveWindow.WindowState = xlNormal 'ノーマル表示
DoEvents

'JRA TOP ページの表示
    '処理したいページをGET
    Dim strURL  As String
    Dim strHTML As String
    strURL = "https://www.jra.go.jp/"
    strHTML = get_htmlfile(strURL)  'JRA TOPをGetする

'TOPページ文章に対して、処理を行います。
       
    Dim i     As Integer '添え字 i番目などで使用
    Dim yLINE As Integer '行カウンタ、Y行目
    
    Dim oDocument As Object
    Set oDocument = CreateObject("htmlfile")
    'Set oDocument = New HTMLDocument   '参照設定したとき
    'oDocument.write "<html><body>test</body></html>"  'HTMLをセット
    'Stop
    strHTML = Replace(strHTML, "script", "") 'scriptを止めるTEST

    oDocument.write strHTML  '取得したHTMLをセット
    DoEvents
    Sleep 1000  '1秒待つ
    'htmlfile_WAIT_TEST (oDocument)
    
    Dim objA As HTMLAnchorElement

    Dim objTABLEs As Object 'TABLE複数の格納用
    Dim objTABLE As HTMLTable 'テーブル単体
    
    Dim x As Integer  '列の管理
    Dim y As Integer  '行の管理
    
    Dim SET_Y As Integer  'Excel側のセット位置
    Dim SET_X As Integer  'Excel側のセット位置
    
    Dim objCELL As HTMLTableCell

    Dim nRACE As Integer   'レース 1-12
    Dim strRACE As String  '文字列 1Rなどを作るため

    Dim Waku_str As String
    Dim Waku_n As Integer

'リンクからオッズを押す
    Dim strLINK As String
    strLINK = IE_Link_InnerHTML_InStr_Click(oDocument, "オッズ")
    If strLINK = "ERR" Then
        MsgBox "オッズが見つかりません"
        Stop
    End If
    
    'オッズのページ HTMLを取り出す
    '<A onclick="doAction('/JRADB/accessO.html','pw15oli00/6D');return
    '文字列切り出し(strMOJI, "doAction('","','")
    '文字列切り出し(strMOJI, "','","')")
    Dim strPARA As String
    strURL = "https://www.jra.go.jp" & 文字列切り出し(strLINK, "doAction('", "','") 'URL
    strPARA = "cname=" & 文字列切り出し(strLINK, "','", "')")   'パラメーター
    strHTML = get_htmlfile_post(strURL, strPARA)  'パラメーターを付けて開く
    
    Set oDocument = Nothing
    Set oDocument = CreateObject("htmlfile")
    oDocument.write strHTML  '取得したHTMLをセット
    DoEvents
    Sleep 1000  '1秒待つ
    DoEvents

    '開催日のリンクをあさる
    strLINK = IE_Link_InnerHTML_InStr_Click(oDocument, Sheets("MENU").Range("B2"))
    If strLINK = "ERR" Then
        MsgBox Sheets("MENU").Range("B2") & "が見つかりません"
        Stop
    End If
    
    strURL = "https://www.jra.go.jp" & 文字列切り出し(strLINK, "doAction('", "',") 'URL
    strPARA = "cname=" & 文字列切り出し(strLINK, "', '", "')")   'パラメーター
    strHTML = get_htmlfile_post(strURL, strPARA)  'パラメーターを付けて開く
    
    oDocument.write strHTML  '取得したHTMLをセット
    DoEvents
    Sleep 1000  '1秒待つ
    DoEvents

'1R-12R 単勝の表を取り込む
    
    Dim r単勝の列 As Range   '2022/05/15追加 10倍以下を赤くする、小数点そろえる
    Dim n一番人気 As Integer '一番人気の馬番受け取る。馬番=位置なんだけど・・・
    Dim strWORK As String    'C1にセットする文字列を作る
    
    '1Rから12Rまで、ループする。※これだと前日発売の時1Rでトラブルなぁ
    For nRACE = 1 To 12  '一から十二まで
        'B5からのフラグが立っていたら And 最終じゃなければ
        'レースを取り込む
        If Sheets("MENU").Range("B4").Offset(nRACE, 0) = 1 _
          And Sheets("MENU").Range("B4").Offset(nRACE, 1) <> "最終" Then
        
            '出力先をクリアする
            'まず、書き込み先シート、データをクリアする
            'Sheets(nRACE & "R").Select  'シートの切り替え
            Sheets("作業用").Select  'シートの切り替え
            Cells.Delete Shift:=xlUp 'シート全体を削除する
            Range("A1").Select       '先頭A1を選択する、
            SET_Y = 0  'セット位置を初期化
        
            strRACE = nRACE & "レース"   '1Rなど 文字にする
        
            'リンクから該当するレースを探しクリックする "1R".."12R"
            'Call IE_Link_InnerHTML_InStr_Click(oDocument, """" & strRACE & """")
            strLINK = IE_Link_InnerHTML_InStr_Click(oDocument, strRACE)
            If strLINK = "ERR" Then
                MsgBox strRACE & "が見つかりません"
                Stop
            End If
            
            strURL = "https://www.jra.go.jp" & 文字列切り出し(strLINK, "doAction('", "',") 'URL
            strPARA = "cname=" & 文字列切り出し(strLINK, "', '", "')")   'パラメーター
            strHTML = get_htmlfile_post(strURL, strPARA)  'パラメーターを付けて開く
            
            Set oDocument = Nothing
            Set oDocument = CreateObject("htmlfile")
            oDocument.write strHTML  '取得したHTMLをセット
            DoEvents
            Sleep 1000  '1秒待つ
            DoEvents

            'Call IE_WAIT(objIE)   'ページの表示完了を待ちます。

            'レース番号をセルに書く
            SET_Y = SET_Y + 1
            Cells(SET_Y, 1) = Sheets("MENU").Range("B2") & " " & strRACE
            Cells(SET_Y, 2) = JRA_Bodyからオッズの時刻を返す(oDocument)
            
            Sheets("MENU").Range("C4").Offset(nRACE, 0) = JRA_Bodyからオッズの時刻を返す(oDocument)
            Debug.Print "オッズ:" & JRA_Bodyからオッズの時刻を返す(oDocument)
            
            '発送時刻のセット
            'JRA_Bodyから発走時刻を返す
            Sheets("MENU").Range("A4").Offset(nRACE, 0) = strRACE & "発走" & JRA_Bodyから発走時刻を返す(oDocument)
            Debug.Print strRACE & "発走:" & JRA_Bodyから発走時刻を返す(oDocument)
            
            SET_Y = SET_Y + 1
        
            '単勝の表を取り込む
            '表、テーブルを探る
            'テーブルを探す
            'タグの取出しが、.getElementsByTagName("TABLE")で 可能なので、
            
            'TABLEタグを抜き 複数のテーブルをセット
            Set objTABLEs = oDocument.getElementsByTagName("TABLE")
            '↑で代入したオブジェクトからテーブルデータを取り出す。
            
            Set objTABLE = Nothing  'オブジェクトを空にする
            For i = 0 To objTABLEs.Length - 1  'テーブル数分回す
                If objTABLEs(i).Rows(0).Cells(0).innerText = "枠" Then '左上が枠番を見つける
                    Set objTABLE = objTABLEs(i)  'i盤目を代入
                    Exit For
                End If
            Next i
            
            '↑で見つかったかチェックする
            If objTABLE Is Nothing Then
                MsgBox "枠番のテーブルが見つかりません"
                Exit Sub  'エラー表示して抜ける
            End If
            
            
            '表をDATAシートに書き出す
            
            'Webの表をシートへ転記(代入する)
            For y = 0 To objTABLE.Rows.Length - 1  '行のループ
                SET_X = 1
                For x = 0 To objTABLE.Rows(y).Cells.Length - 1  '列数分ループ
                    ' objTABLE.rows(行).cells(列)
                    Set objCELL = objTABLE.Rows(y).Cells(x)
                    
                    'X=0 一番左端の枠の時 見出し行より下(y>0)で
                    If y > 0 And x = 0 Then  '枠と馬番
                        'imgのaltから枠の文字 次の数値を取り出す
                        Waku_n = InStr(objCELL.innerHTML, "枠")
                        If Waku_n > 0 Then
                            'img alt="枠4青" src="/JRADB/img/waku/4.png"></td
                            Waku_str = Mid(objCELL.innerHTML, Waku_n + 1, 1)
                            Cells(SET_Y, SET_X) = Waku_str  'データセット
                            
                            '結合セル、枠などに対応
                            If objCELL.rowSpan > 1 Then  '縦に複数の時
                                
                                Cells(SET_Y + 1, SET_X) = Waku_str  '下にも同じくセット
                                'ホントはループがいいけど、一枠に三頭までなので
                                If objCELL.rowSpan = 3 Then  '3頭め 8枠18番など・・
                                    Cells(SET_Y + 2, SET_X) = Waku_str
                                End If
                            End If
                        Else  '枠じゃなく、馬番の時
                            '既にデータありか、縦に結合されているか?
                            If Len(Trim("" & Cells(SET_Y, SET_X))) > 0 Then
                                SET_X = SET_X + 1  '縦結合を飛ばすために横に移動
                            End If
                            
                            Cells(SET_Y, SET_X) = objCELL.innerText  'データセット
                        End If
                    Else
                        '結合セル以外
                        Cells(SET_Y, SET_X) = objCELL.innerText  'データセット
                    End If
                    
                    '横に結合されているか判断じゃなかった、横にカラム分移動
                    SET_X = SET_X + objCELL.colSpan  '横に移動 通常は1 結合なし
                Next
                SET_Y = SET_Y + 1
            Next
            SET_Y = SET_Y + 1  '空白を一行追加
            
            '作業用シートからレース別に転記する
            Sheets(nRACE & "R").Select  'シートの切り替え

            '初回か判断 レース場や開催日が変わっているか 馬名で判断
            
            If Sheets("作業用").Range("C3") <> Range("C3") Then  'C3馬名が違ったら
                'シートをクリア
                Cells.Delete Shift:=xlUp 'シート全体を削除する
                Range("A1").Select       '先頭A1を選択する、
                '初回は、馬名もコピーする
                Sheets("作業用").Range("A1:D20").Copy
                Range("A1").Select
                ActiveSheet.Paste
                'オッズの時刻をセット
                Sheets("作業用").Range("B1").Copy
                Range("D2").Select
                ActiveSheet.Paste
                Set r単勝の列 = Range("D2")   '初回はD2をセット 2022/05/15
            Else
                '二回目以降は、後ろに追記
                '元データをコピー
                Sheets("作業用").Range("D2:D20").Copy  'オッズの列
                '貼り付け先を探す
                For x = 1 To 256  '空白列を探す
                    'セル二行目のx列が空白か調べて抜ける
                    If Len(Trim("" & Cells(2, x))) = 0 Then Exit For
                Next x
                Cells(2, x).Select '貼り付け先を選択
                ActiveSheet.Paste
                Set r単勝の列 = Cells(2, x)   '貼り付けたx列をセット 2022/05/15
                
                '時刻を貼り付ける
                Sheets("作業用").Range("B1").Copy
                Cells(2, x).Select '貼り付け先を選択
                ActiveSheet.Paste
            End If
            
            '10倍以下を赤に、小数点をそろえ、一番人気を探す 2022/05/15
            n一番人気 = 単勝一番人気を探す(r単勝の列)  '単勝の列から一番人気を探す
            strWORK = "一番人気は" & n一番人気 & "番 " & Range("c2").Offset(n一番人気, 0)
            strWORK = strWORK & " オッズは " & r単勝の列.Offset(n一番人気, 0) & "です"
            Range("c1") = strWORK
            
            '読み上げる※動画用
            DoEvents
            Range("B1").Clear
            Range("A1,C1").Speak  'A1とC1を読み上げ
            
            
        End If  'フラグが立っていたら↑
        
    Next

    'MENUに戻り、保存
    Sheets("MENU").Select
    Range("A3").Select
    ActiveWorkbook.Save
   
End Sub



'URLを受け取り、HTML文字列を返す(シフトJISページ用に変換後)
Public Function get_htmlfile(strURL As String) As String

    Dim objDOC As Object
    
    Set objHTML = CreateObject("MSXML2.XMLHTTP")
    
    objHTML.Open "GET", strURL, False
    'objHTML.overrideMimeType "text/plain; charset=Shift_JIS"
    DoEvents
    objHTML.send
    Sleep 250  '0.25秒待つ

    DoEvents
    Do While objHTML.readyState <> 4
        DoEvents
    Loop
    
    Dim strHTML As String
    'strHTML = objHTML.responseText
    strHTML = StrConv(objHTML.responseBody, vbUnicode)

    'テキスト確認 デバッグ用
    Dim strFNAME As String
    strFNAME = ThisWorkbook.Path & "\testhtml.txt"
    Open strFNAME For Output As #1
    Print #1, Now() & " に実行"
    Print #1, "strURL:" & strURL
    Print #1, strHTML
    Close #1

    'Debug.Print strHTML
    Sleep 250  '0.25秒待つ
    get_htmlfile = strHTML  'リターン値で返す

End Function


'URL,パラメータを受け取り、HTML文字列を返す(シフトJISページ用に変換後)
Public Function get_htmlfile_post(strURL As String, strPARA As String) As String

    Dim objHTML As Object
    
    Set objHTML = CreateObject("MSXML2.XMLHTTP")
    
    objHTML.Open "POST", strURL, False
    objHTML.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    objHTML.send (strPARA)
    DoEvents
    Sleep 250  '0.25秒待つ

    DoEvents
    Do While objHTML.readyState <> 4
        DoEvents
    Loop
    
    Dim strHTML As String
    'strHTML = objHTML.responseText
    strHTML = StrConv(objHTML.responseBody, vbUnicode)

    'テキスト確認 デバッグ用
    Dim strFNAME As String
    strFNAME = ThisWorkbook.Path & "\testhtml.txt"
    Open strFNAME For Output As #1
    Print #1, Now() & " に実行"
    Print #1, "strURL:" & strURL
    Print #1, "strPARA:" & strPARA
    Print #1, strHTML  'HTML
    Close #1

    'Debug.Print strHTML
    
    get_htmlfile_post = strHTML  'リターン値で返す

End Function

'左右のキーワードを受け取り、文字を切り出す
'<A onclick="doAction('/JRADB/accessO.html','pw15oli00/6D');return
'文字列切り出し(strMOJI, "doAction('","','")
'文字列切り出し(strMOJI, "','","')")
Public Function 文字列切り出し(strMOJI As String, strLEFT As String, strRIGHT As String) As String

    文字列切り出し = ""  'データ無しで初期化

    Dim nLEFT  As Integer
    Dim nSTART As Integer
    Dim n      As Integer
    
    '左側の位置を探す
    n = InStr(strMOJI, strLEFT)  '左側の区切り文字を探す
    If n = 0 Then Exit Function  '見つからない時抜ける
    
    '開始位置をセット
    nSTART = n + Len(strLEFT) '抜き取り開始位置

    '右側キーワードを探す
    n = InStr(nSTART, strMOJI, strRIGHT)  '右側の区切り文字を探す
    If n = 0 Then Exit Function  '見つからない時抜ける

    'MIDで抜き出す
    文字列切り出し = Mid(strMOJI, nSTART, (n - nSTART))

End Function

'2022/05/15 追加 単勝の列 先頭(見出しの部分)を受け取り一番人気を返す
'ついでに 10倍以下のオッズを赤に、小数点の桁をそろえる
Public Function 単勝一番人気を探す(r As Range) As Integer
    Dim オッズ As Double
    Dim 一番人気 As Integer
    
    '初期値を代入
    オッズ = r.Offset(1, 0) '馬番1のオッズを初期値にする
    一番人気 = 1  '馬番1を初期セット
    
    For n = 1 To 18  'MAX18頭まわす、といっても途中で抜けるならForじゃなくても・・
        With r.Offset(n, 0)  'n下のセルを操作したり値を比べる
            If Len(Trim("" & .Value)) = 0 Then Exit For 'データ無しなら抜ける
            '99.9 と 小数点の桁をそろえる
            .NumberFormatLocal = "0.0"
            '10倍以下なら、赤にする
            If .Value < 10 Then
                .Font.Color = -16776961 '赤にする
            End If
            'オッズを比べる
            If .Value < オッズ Then  '一時保存されているオッズより低かったら
                オッズ = .Value 'オッズを代入 更新
                一番人気 = n  '馬番nをセット
            End If
        End With
    Next
    
    単勝一番人気を探す = 一番人気  'リターン値を返す
    '※まったく もう 日本語変数と関数名は良くないな・・・

End Function

コードをまとめないとなぁ・・・・



関連動画のリスト

1.
CreateObject("htmlfile")でDocumentを作りweb上のhtmlデータを抜き出す 例としてJRAのHPからオッズを取得してみた
www.youtube.com
https://www.youtube.com/watch?v=RjZZUq40gxY

2.
JRAホームページ「onClick=doAction が なんでPOSTだとわかったんですか?」と質問されたので
www.youtube.com
https://www.youtube.com/watch?v=NPnKju8rkVw

3.
VBScript 定期実行 タスクスケジューラの設定テスト 終了設定でつまづく VBSを5分単位で実行させてみた
www.youtube.com
https://www.youtube.com/watch?v=4IkuWVECTVo

4.
ExcelVBAで表示変更 10倍以下を赤 小数点を0.0でそろえる 例題:JRA 単勝オッズ取得
youtu.be
https://youtu.be/rAi_uL41Bp0

5.
Excel 読み上げ Range(範囲).Speak で簡単にできます Application.Speech.Speakもアリかな
www.youtube.com
https://www.youtube.com/watch?v=c4mH9szOo2w

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。
・[Excel/Access VBA]の解説
・[ASP(Active Server Pages)]の解説。
・[元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
・[プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
三流君を踏み台にする
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)