[[20220224135544]] 『他ブックを開き、値を並びかえたデータを取り込み』(マネージャー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『他ブックを開き、値を並びかえたデータを取り込みたい』(マネージャー)

皆様のお力をお貸しください。

選手の能力を見える化しようとしています。
選手のデータを計測するPC(仕組み)が2つあり、それぞれ結果をCSVで出力できます
計測する仕組みが2つあるため、1つの計測会で2つのCSVファイルができます。
2つのCSVのデータを1つのブックに取り込み、まとめて点数化し独自の点数をつけたいと考えています。

各CSVには多くのパラメータが保存されており、まとめるブックに取り込む際に
各パラメータで順位を並び替えた結果を取り込みたいと考えていますが、ブックから各CSV上で並び替える
マクロがわかりませんので質問させていただきました。

条件は以下のように考えております。

1)1つの計測会に参加する選手は最大10人
2)1日の計測会は最大20
3)管理表フォルダーがあり、その中に管理するBOOKを作り(BOOK名はPP)保存します。
1つ目のPCからCSVとして作成されるファイル名は01.csv〜20.csv
2つ目のPCからCSVとして作成されるファイル名は01a.csv〜20a.csv
したっがて、1回目の計測会で出力されるファイルは

	01.csv
	01a.csv
この2つとなり、計測会の回次が20回目となれば
	20.csv
	20a.csv  のファイルが出力されます
イメージとして
管理表フォルダーがあり、まとめるブック名=PPが入っています。
 管理表フォルダーに 20220223のような日付(YYYYMMD)の付いたフォルダーがあり、
その配下に
  01   (←01.csvから20.csvのファイルが入る)
  02   (←01a.csvから20a.csvのファイルが入る)  の2つのフォルダーがある構成です。

データは毎日作成されるために管理するBOOKで日付でフォルダーを指定して抽出するようにしたいと考えています。。

以下は01.csvの内容になります。

     |[A]      |[B]      |[D]      |[E]       |[AH]   |[AI]    |[AJ]     |[AK]     
 [1] |計測会No |タイム   |前半タイム|名前ゼッケン|平均速度  |Last20m |最高速度 |前回最高速度    
 [2] |        1|    1:00|    00:28|         6|       8.0|     7.5|      7.6|       7.5     
 [3] |        2|    1:01|    00:28|         5|       8.2|     7.6|      7.6|       7.4   
 [4] |        3|    1:02|    00:27|         1|       8.3|     7.7|      7.8|       7.5   
 [5] |        4|    1:03|    00:29|         2|       8.4|     7.9|      7.7|       7.5   
 [6] |        5|    1:04|    00:27|         3|       8.5|     7.8|      7.6|       7.6  
 [7] |        6|    1:05|    00:28|         4|       8.5|     7.8|      7.8|       7.5   
 [8] |        7|    1:06|    00:29|         7|       8.9|     7.9|      7.9|       7.8   
 [9] |        8|    1:07|    00:30|         8|       8.8|     7.9|      8.1|       7.6   
 [10]|        9|    1:08|    00:31|         9|       8.7|     7.9|      8.1|       7.5   
 [11]|       10|    1:08|    00:31|        10|       8.9|     7.9|      8.1|       7.7 

このCSVは保存される際にはB列(タイム)を昇順にした状態で保存されています。
その時のタイム順にならんだ「名前ゼッケン」を管理するBOOK(PP)転記するところまではできています。
以降
D列 前半タイム  昇順
AH 平均速度  昇順
AI Last20m 昇順
AJ 最高速度  降順
AK 前回最高速度 降順 で並べれ替えをした際のゼッケンを転記したいと考えていますが、そこのマクロが書けずに悩んでいます。
A列はA1セルを除き順位ですが、A1セルには計測会区分の番号が入ります(例えば01など)

◎考え方としては
 1)各CSVをまとめるブックPPに取り込んでから並び替える
 2)各CSVを操作して並び替えたデータ「名前ゼッケン」だけをブックPPに取り込む、CSVは保存せずに閉じる
この2通りは思いつくのですが、後者の方法ができないかと悩んでおります

以下は01a.csvの内容になります。

     |[A]      |[D]         |[R]      |[Z]      |[AA]     |[AB]    |[AG] 
 [1] |計測会No |名前ゼッケン|差    |X値   |z値   |ZZ値 |T値  |M値   
 [2] |        1|          6|       -2|       1|      8.0|     8.3|      2       
 [3] |        2|          1|       -2|       2|      8.1|     8.2|      3      
 [4] |        3|          5|       -1|       3|      8.1|     8.6|      1       
 [5] |        4|          4|        0|       4|      8.2|     8.5|      4       
 [6] |        5|          3|        0|       5|      8.2|     8.5|      6       
 [7] |        6|          2|        0|       6|      8.2|     8.7|      5       
 [8] |        7|          7|        0|       7|      8.3|     9.5|      7       
 [9] |        8|          8|        2|       8|      8.3|     8.5|      10       
 [10]|        9|         10|        3|       9|      8.4|     8.3|      9       
 [11]|       10|          9|        4|      10|      8.5|     8.2|      8   

このCSVは保存される際にはZ列(X値)を昇順にした状態で保存されています。
D列 01.csvのE列と同じ位置づけ
R  X値 昇順
Z z値 昇順
AA ZZ値  降順
AB T値 降順 
AG M値 昇順 
で並べれ替えをした際のゼッケンを転記したいと考えています。
A列は順位ですが、A1セルには計測会区分の番号が入ります(例えば01aなど)

    
管理するBOOKのPP
シート名は
	能力一覧  (抽出したデータを表示させるシート)
	ファイル名一覧 (フォルダーに収まっているファイル名を書き出すシート)
         						この2シートになります。

能力一覧  (抽出したデータを表示させるシート)への出力イメージは次の通りです

     |[A]       |[B]       |[C]|[D]|[E]|[F]|[G]|[H]|[I]|[J]|[K]|[L]     
 [3] |フォルダID| 20220223 |1  |2  |3  |4  |5  |6  |7  |8  |9  |10  ←順位    
 [4]  計測データ   
 [5] |        01|タイム   |1  |2  |3  |4  |5  |6  |7  |8  |9  |10  
 [6] |        01|前半タイム|2  |1  |3  |4  |5  |6  |7  |8  |9  |10   
 [7] |        01|平均速度  |1  |2  |3  |4  |5  |6  |7  |8  |9  |10 
 [8] |        01|Last20    |1  |2  |3  |4  |5  |6  |7  |8  |9  |10 
 [9] |        01|最高速度  |1  |2  |3  |5  |4  |6  |7  |8  |9  |10  
 [10]|        01|前回最高  |2  |2  |3  |4  |5  |6  |7  |8  |9  |10   
 [11]|       01a|A_data    |1  |4  |3  |2  |5  |6  |7  |8  |9  |10  
 [12]|       01a|B_data    |2  |3  |5  |4  |1  |6  |7  |8  |9  |10  
 [13]|       01a|C_data    |1  |2  |3  |4  |5  |10 |9  |8  |7  |6  
 [14]|       01a|D_data    |3  |2  |4  |1  |5  |6  |7  |8  |9  |10  
 [15]|       01a|E_data    |3  |2  |1  |4  |5  |6  |7  |8  |9  |10  
 [16]|        02|タイム   |   |   |   |   |   |   |   |   |   |     
 [17]|        02|前半タイム|   |   |   |   |   |   |   |   |   |     
 [18]|        02|平均速度  |   |   |   |   |   |   |   |   |   |     
 [19]|        02|Last20    |   |   |   |   |   |   |   |   |   |      
 [20]|        02|最高速度  |   |   |   |   |   |   |   |   |   |      
 [21]|        02|前回最高  |   |   |   |   |   |   |   |   |   |     
 [22]|       02a|A_data    |   |   |   |   |   |   |   |   |   |    
 [23]|       02a|B_data    |   |   |   |   |   |   |   |   |   |   
 [24]|       02a|C_data    |   |   |   |   |   |   |   |   |   |    
 [25]|       02a|D_data    |   |   |   |   |   |   |   |   |   |   
 [26]|       02a|E_data    |   |   |   |   |   |   |   |   |   |   

A16行名以降は2回目の計測データが続けて入る予定です(20計測会まで)
能力一覧のB3セルにYYYYMMDDで日付指定を行います。
フォルダーの階層は
¥管理表¥20220223_管理表¥01
                        ここに01〜20の名前の付いたCSVが入ります。
¥管理表¥20220223_管理表¥02
                        ここに01a〜20aの名前の付いたCSVが入ります。
PPのブックの能力一覧シートにマクロボタンをおき1クリックで展開できるマクロを目指しています。
ますは01フォルダーの分だけでもできでれば02が応用できると思います。
現在のマクロはここまでは書いています。

Option Explicit
Sub ファイル名一覧表作成()

    Application.ScreenUpdating = False
    Dim i As Long, bookname As String
    With Sheets("ファイル名一覧表")
        .Columns(1).ClearContents
        bookname = Dir(ThisWorkbook.Path & "\" & _
         Sheets("能力一覧").Range("B3") & "_管理表\01\*")
         Do While bookname <> ""
            i = i + 1
           .Cells(i, 1) = bookname
            bookname = Dir()
         Loop
    End With
End Sub

Sub ファイル名一覧表作成2()

    Application.ScreenUpdating = False
    Dim i As Long, bookname As String
    With Sheets("ファイル名一覧表")
        .Columns(1).ClearContents
        bookname = Dir(ThisWorkbook.Path & "\" & _
         Sheets("能力一覧").Range("B3") & "_管理表\02\*")
         Do While bookname <> ""
            i = i + 1
           .Cells(i, 1) = bookname
            bookname = Dir()
         Loop
    End With
End Sub

Sub R別能力一覧()

    Application.ScreenUpdating = False
    Dim i As Long, r As Long
    Dim f As Worksheet
    Set f = Sheets("ファイル名一覧表")
    With Sheets("能力一覧")
        .Range("A5").CurrentRegion.Offset(1, 0).ClearContents
        For i = 1 To f.Cells(Rows.Count, 1).End(xlUp).Row
            r = .Cells(Rows.Count, 1).End(xlUp).Row + 1
            Workbooks.Open ThisWorkbook.Path & "\" & _
             .Range("B3") & "_管理表\01\" & f.Cells(i, 1)
                .Cells(r, 1) = Range("A1") 'ネタ元ファイルのA1セルをA6セルから順番に書き込む
                .Cells(r, 2) = Range("D1") 'ネタ元ファイルのG38セルをB6セルから順番に書き込む
                .Cells(r, 3) = Range("E2") 'ネタ元ファイルのC38セルをC6セルから順番に書き込む
                .Cells(r, 4) = Range("E3") 'ネタ元ファイルのE38セルをD6セルから順番に書き込む
                .Cells(r, 5) = Range("E4") 'ネタ元ファイルのA1セルをA6セルから順番に書き込む
                .Cells(r, 6) = Range("E5") 'ネタ元ファイルのG38セルをB6セルから順番に書き込む
                .Cells(r, 7) = Range("E6") 'ネタ元ファイルのC38セルをC6セルから順番に書き込む
                .Cells(r, 8) = Range("E7") 'ネタ元ファイルのE38セルをD6セルから順番に書き込む
                .Cells(r, 9) = Range("E8") 'ネタ元ファイルのA1セルをA6セルから順番に書き込む
                .Cells(r, 10) = Range("E9") 'ネタ元ファイルのG38セルをB6セルから順番に書き込む
                .Cells(r, 11) = Range("E10") 'ネタ元ファイルのC38セルをC6セルから順番に書き込む
            ActiveWorkbook.Close savechanges:=False
        Next
    End With
End Sub

Sub R別能力一覧2()

    Application.ScreenUpdating = False
    Dim i As Long, r As Long
    Dim f As Worksheet
    Set f = Sheets("ファイル名一覧表")
    With Sheets("能力一覧")
       ' .Range("A6").CurrentRegion.Offset(1, 0).ClearContents
        For i = 1 To f.Cells(Rows.Count, 1).End(xlUp).Row
            r = .Cells(Rows.Count, 1).End(xlUp).Row + 1
            Workbooks.Open ThisWorkbook.Path & "\" & _
             .Range("B3") & "_管理表\02\" & f.Cells(i, 1)
                .Cells(r, 1) = Range("A1") 'ネタ元ファイルのA1セルをA6セルから順番に書き込む
                .Cells(r, 2) = Range("Z1") 'ネタ元ファイルのG38セルをB6セルから順番に書き込む
                .Cells(r, 3) = Range("D2") 'ネタ元ファイルのC38セルをC6セルから順番に書き込む
                .Cells(r, 4) = Range("D3") 'ネタ元ファイルのE38セルをD6セルから順番に書き込む
                .Cells(r, 5) = Range("D4") 'ネタ元ファイルのA1セルをA6セルから順番に書き込む
                .Cells(r, 6) = Range("D5") 'ネタ元ファイルのG38セルをB6セルから順番に書き込む
                .Cells(r, 7) = Range("D6") 'ネタ元ファイルのC38セルをC6セルから順番に書き込む
                .Cells(r, 8) = Range("D7") 'ネタ元ファイルのE38セルをD6セルから順番に書き込む
                .Cells(r, 9) = Range("D8") 'ネタ元ファイルのA1セルをA6セルから順番に書き込む
                .Cells(r, 10) = Range("D9") 'ネタ元ファイルのG38セルをB6セルから順番に書き込む
                .Cells(r, 11) = Range("D10") 'ネタ元ファイルのC38セルをC6セルから順番に書き込む
            ActiveWorkbook.Close savechanges:=False
        Next
    End With
End Sub

Sub TOTAL()

    Call ファイル名一覧表作成
    Call R別能力一覧
    Call ファイル名一覧表作成2
    Call R別能力一覧2
    MsgBox "完了しました"
End Sub

現在は、
01のフォルダーに01.csv
02のフォルダーに01a.csvを保存して上記マクロを実行するとになるところまで確認ができております

     |[A]       |[B]       |[C]|[D]|[E]|[F]|[G]|[H]|[I]|[J]|[K]|[L]     
 [3] |フォルダID| 20220223 |1  |2  |3  |4  |5  |6  |7  |8  |9  |10  ←順位    
 [4]  計測データ   
 [5] |        01|タイム   |6  |5  |1  |2  |3  |4  |7  |8  |9  |10  
 [6] |       01a|x値    |6  |1  |5  |4  |3  |2  |7  |8  |10 | 9   

アドバイスいただけたら嬉しいです。
よろしくお願いいたします。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


質問のポイントがつかめませんので、外しているかもしれませんが、ご参考。

 Sub R別能力一覧()
    Application.ScreenUpdating = False
    Dim i As Long, r As Long
    Dim f As Worksheet
    Set f = Sheets("ファイル名一覧表")
    With Sheets("能力一覧")
        .Range("A5").CurrentRegion.Offset(1, 0).ClearContents
        For i = 1 To f.Cells(Rows.Count, 1).End(xlUp).Row
            r = .Cells(Rows.Count, 1).End(xlUp).Row + 1
            Workbooks.Open ThisWorkbook.Path & "\" & _
             .Range("B3") & "_管理表\01\" & f.Cells(i, 1) 
             '                                                 ここから
             c = Array("B", "D", "AH", "AI", "AJ", "AK")
             For j = 0 To UBound(c)
                 Range("A1:AK10").Sort Key1:=Range(c(j) & "1"), Order1:=xlAscending, Header:=xlYes
                 .Cells(r + j, 1) = Range("A1")
                 .Cells(r + j, 2) = Range(c(j) & "1")
                 .Cells(r + j, 3) = Range("E2")
                 .Cells(r + j, 4) = Range("E3")
                 .Cells(r + j, 5) = Range("E4")
                 .Cells(r + j, 6) = Range("E5")
                 .Cells(r + j, 7) = Range("E6")
                 .Cells(r + j, 8) = Range("E7")
                 .Cells(r + j, 9) = Range("E8")
                 .Cells(r + j, 10) = Range("E9")
                 .Cells(r + j, 11) = Range("E10")
                 .Cells(r + j, 12) = Range("E11")
             Next
             '                                                 ここまで変更
            ActiveWorkbook.Close savechanges:=False
        Next
    End With
 End Sub

(わからん) 2022/02/24(木) 16:52


わからん様

 ありがとうございます。

 実行すると、「コンパイル エラー
        変数が定義されていません」

 デバッグ画面で C= のところが表示される結果となりました。
(マネージャー) 2022/02/25(金) 08:58


>実行すると、「コンパイル エラー 変数が定義されていません」

変数を定義してください。
https://www.google.com/search?q=VBA+%E5%A4%89%E6%95%B0+%E5%AE%9A%E7%BE%A9

(わからん) 2022/02/25(金) 09:12


わからん様 
ありがとうございます。

Dim c
Dim j As Long を追記でよいと思ったのですが
実行するとCSVファイルを探せなくなり

デバッグ画面で

 Workbooks.Open ThisWorkbook.Path & "\" & _
             .Range("B3") & "_管理表\01\" & f.Cells(i, 1)   のところが黄色くなってしまいます。

Dim j As Longを消すとファイルにはたどり着いている感じでした。
jの定義が違うのでしょうか?
(マネージャー) 2022/02/25(金) 10:11


>Dim c
>Dim j As Long
変数の定義はそれであっています。

>実行するとCSVファイルを探せなくなり
変数を定義したことが影響するとは思えません。

>のところが黄色くなってしまいます。
そのときの「i」と「f.Cells(i, 1) 」の値はどうなっていますか?

(わからん) 2022/02/25(金) 10:22


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.