2

私の家族は中規模の輸送会社を経営しており、私が 3 年前にこの業界に参入したとき、必要なすべての輸送を管理するためのソフトウェアはありませんでした。20 人のドライバーにとってこれは問題だったので、私は腰を下ろし、VBA の基本を学び、さまざまな旅行をさまざまなドライバーにメールで管理/発送するためのアプリを Excel で作成しました。今のところ「動作」していますが、将来の拡張を計画しているので、Xojo の学習を開始しました (私は Mac を使用しており、VBA に最も近いものです)。

1日前に行う必要がある旅行を示すExcelファイルを受け取ります(人を輸送します)。基本的に、さまざまな顧客がすべて含まれるシートです。このシートを「週ファイル」にインポートして、後でさまざまなマクロを介してデータを使用します。このシートには無関係な情報がたくさんありますが、関心のある列はタイプ、数、時間です。

したがって、基本的には、すべての行 (100 以上) を取得し、タイプと数でグループ化し、時間で並べ替える必要があります。

並べ替えたときにシートがどのように見えるかの簡単な例を次に示します (異なる色は異なるドライバーです)。
ソートされたシート

この結果を得るための私の手順はあまり良くないと思います。新しいタイプまたはトリップ番号かどうかを確認する If ステートメントを使用して、データ シート (非表示) のすべての行をループし、時刻と行参照 (最初の行、最後の行) を配列に保存してから、配列を使用して、表示シートの範囲をエクスポートします。VBA の存在を知ってから 3 週間後にこれを書いたことを覚えておいてください。それは「機能します」が、より良いプロセスが必要です。

SQLite を使用して、書き始めたアプリケーションにすべての情報を保存します。SQL を使用してすべてのデータをより速くソートする方法について提案したいと思います。手順を探しています。コード化する方法を見つけることができます。

私が作ったコードのサンプルです。

    For RowSearch = 2 To RowCount
        If Sheets(DataSheetName).Cells(RowSearch, 2).Value <> Sheets(DataSheetName).Cells(RowSearch - 1, 2).Value _
        Or Sheets(DataSheetName).Cells(RowSearch, 3).Value <> Sheets(DataSheetName).Cells(RowSearch - 1, 3).Value Then
            Blocks(TripCount, 1) = Position
            Blocks(TripCount, 2) = RowSearch - 1
            Blocks(TripCount, 3) = Format(Sheets(DataSheetName).Cells(Position, 4).Value, "hh:mm")
            TripCount = TripCount + 1
            Position = RowSearch
        End If
    Next RowSearch

    Blocks(TripCount, 1) = Position
    Blocks(TripCount, 2) = RowSearch - 1
    Blocks(TripCount, 3) = Format(Sheets(DataSheetName).Cells(Position, 4).Value, "hh:mm")

'Sorts the blocks by time, loops trought the trips row range to sort the trips by time and type and writes the blocks
    RowSelect = 1

    For BlockSearch = 1 To TripCount
        TempHour = "99:99"

        For RowOrder = 1 To TripCount
            If Blocks(RowOrder, 3) <= TempHour Then
                TempHour = Blocks(RowOrder, 3)
                Trips(BlockSearch, 1) = Blocks(RowOrder, 1)
                Trips(BlockSearch, 2) = Blocks(RowOrder, 2)
                RowChange = RowOrder
            End If
        Next RowOrder

        RowRange = Trips(BlockSearch, 2) - Trips(BlockSearch, 1) + 1
        FieldValue = Sheets(DataSheetName).Range("A" & Trips(BlockSearch, 1) & ":" & "R" & Trips(BlockSearch, 2))
        Sheets(SheetName).Range("A" & RowSelect & ":" & "R" & RowSelect + RowRange - 1) = FieldValue
        Sheets(SheetName).Rows(RowSelect + RowRange).Insert Shift = xlDown
        RowSelect = RowSelect + RowRange + 1
        Blocks(RowChange, 3) = "99:99"
    Next BlockSearch
4

1 に答える 1

2

SQL では、「グループ化」とは、行をグループに分割するだけでなく、グループのすべての行を集約して、グループごとに 1 つの出力行を作成する操作です。

あなたの例では、行は単純にタイプ、数、および時間でソートされます。これには、次のようなクエリが必要です。

SELECT *
FROM MyTable
ORDER BY Type, Number, Hour
于 2014-07-07T20:30:35.787 に答える