人口あたりのJリーグ試合出場選手が多い都道府県ランキング(2026/3/22) その2

続いて、どの年代の選手が多いかを出してみた。

静岡県は、ゆるやかに、下がってきている感じ。
鹿児島県は、1980年~1994年のあたりの選手が多い。
熊本県は、1995年~2000年代のあたりが多く、勢いがある感じ。
山梨県は、二極化、1975年~1979年の選手、1995年~1999年の選手が多い。逆にそれ以外の選手は極端に少ない。
徳島県は、熊本県と同じ状況で、1995年~2000年代のあたりの選手が多い。こちらは徳島ヴォルティス効果もあるかもしれない。

と、一つ一つ見ていくと面白いかもしれない。

これは、Excelファイルで作ったモノですが、Excelファイルはこちら

あとは、、、選手データ_都道府県名.xlsx を作ってるんですが、ここからデータを取得するようにしている。
以下みたいな感じ。割と力業で。

# 全体の処理時間の計測開始
$swTotal = [System.Diagnostics.Stopwatch]::StartNew()

try {
    # JustCalc COMオブジェクトの作成
    $app = New-Object -ComObject "JustCalc.Application"
    $app.Visible = $false
    
    # メインのブックを開く
    $mainBookPath = "J出場割合.xlsx"
    $book = $app.Workbooks.Open($mainBookPath)
    $sheet = $book.Worksheets.Item("J出場割合(20260322)")
    
    $folderPath = "C:\dev\tools\output\"

    # 行 4 から 50 までループ
    for ($i = 4; $i -le 50; $i++) {
        $swStep = [System.Diagnostics.Stopwatch]::StartNew()
        
        $targetValue = $sheet.Cells.Item($i, 2).Value()
        if (-not $targetValue) { continue } # 値が空ならスキップ
        
        $fileName = "選手データ_$targetValue.xlsx"
        $targetFilePath = Join-Path $folderPath $fileName
        
        if (Test-Path $targetFilePath) {
            # ターゲットのブックを読み取り専用(True)で開く
            $targetWorkbook = $app.Workbooks.Open($targetFilePath, 0, $true)
            $targetSheet = $targetWorkbook.Sheets.Item("Sheet1")
            
            # CountIf の実行 (K列: 11番目, AI列: 35番目)
            $rangeK = $targetSheet.Range("K:K")
            $countResult1 = $app.WorksheetFunction.CountIf($rangeK, $targetValue)
            $sheet.Cells.Item($i, 5).Value = $countResult1
            
            $rangeAI = $targetSheet.Range("AI:AI")
            $countResult2 = $app.WorksheetFunction.CountIf($rangeAI, ">0")
            $sheet.Cells.Item($i, 9).Value = $countResult2
            
            # AI, AK, AM 列の値をチェックするループ
            $rowCount = 0

            $counts = @{
                1955=0; 1960=0; 1965=0; 1970=0; 1975=0; 1980=0; 1985=0; 1990=0; 1995=0; 2000=0; 2005=0; 2010=0
            }
            # ループ範囲: 4 から countResult1 + 4 まで
            $maxRow = [int]$countResult1 + 4
            for ($row = 4; $row -le $maxRow; $row++) {
                $valAI = $targetSheet.Cells.Item($row, 35).Value()
                $valAK = $targetSheet.Cells.Item($row, 37).Value()
                $valAM = $targetSheet.Cells.Item($row, 39).Value()
                
                # すべて空ならループを抜ける
                if ($null -eq $valAI -and $null -eq $valAK -and $null -eq $valAM) { break }
                
                # 数値として加算
                $sumValue = [double]$valAI + [double]$valAK + [double]$valAM
                
                if ($sumValue -gt 0) {
                    $rowCount++
                    
                    # --- 年代別集計の追加 ---
                    $valN = $targetSheet.Cells.Item($row, 14).Value()
                    if ($valN -is [System.DateTime]) {
                        $year = $valN.Year
                        # 5年刻みの開始年を算出 (例: 1958 -> 1955, 1962 -> 1960)
                        $startYear = $year - ($year % 5)
                        
                        # 対象の年代が連想配列(hashtable)に存在すればカウントアップ
                        if ($counts.ContainsKey($startYear)) {
                            $counts[$startYear]++
                        }
                    }
                }
                
            }
            # 13列目:合計カウント
            $sheet.Cells.Item($i, 13).Value = [int]$rowCount
            
            # 16列目以降:年代別の値を設定
            $sheet.Cells.Item($i, 16).Value = [int]$counts[1955]
            $sheet.Cells.Item($i, 17).Value = [int]$counts[1960]
            $sheet.Cells.Item($i, 18).Value = [int]$counts[1965]
            $sheet.Cells.Item($i, 19).Value = [int]$counts[1970]
            $sheet.Cells.Item($i, 20).Value = [int]$counts[1975]
            $sheet.Cells.Item($i, 21).Value = [int]$counts[1980]
            $sheet.Cells.Item($i, 22).Value = [int]$counts[1985]
            $sheet.Cells.Item($i, 23).Value = [int]$counts[1990]
            $sheet.Cells.Item($i, 24).Value = [int]$counts[1995]
            $sheet.Cells.Item($i, 25).Value = [int]$counts[2000]
            $sheet.Cells.Item($i, 26).Value = [int]$counts[2005]
            $sheet.Cells.Item($i, 27).Value = [int]$counts[2010]
            
            # ターゲットブックを閉じる(保存しない)
            $targetWorkbook.Close($false)
            
            $swStep.Stop()
            $stepTime = [Math]::Round($swStep.Elapsed.TotalSeconds, 3)
            Write-Host "$targetValue : $stepTime 秒"
        }
        else {
            Write-Warning "ファイルが見つかりません: $fileName"
        }
    }

    # メインブックを保存して終了
    $book.Save()
    $book.Close()
    $app.Quit()
}
catch {
    Write-Error "エラーが発生しました: $_"
    # エラーが発生した場合の詳細表示
    Write-Host "--- エラー詳細 ---" -ForegroundColor Red
    Write-Host "行番号: $row"
    Write-Host "取得した値: $valN"
    Write-Host "エラーメッセージ: $($_.Exception.Message)"
    # さらに詳しい原因(スタックトレース)が必要な場合
    Write-Host "詳細トレース: $($_.ScriptStackTrace)"
}
finally {
    # メモリ解放
    if ($null -ne $app) {
        [System.Runtime.InteropServices.Marshal]::ReleaseComObject($app) | Out-Null
    }
    Remove-Variable app -ErrorAction SilentlyContinue

    $swTotal.Stop()
    $totalTime = [Math]::Round($swTotal.Elapsed.TotalSeconds, 3)
    Write-Host "---"
    Write-Host "総処理時間: $totalTime 秒"
}

コメント

タイトルとURLをコピーしました