2014-07-07 152 views
2

我的家人擁有一家中等規模的運輸公司,當我3年前進入這個行業時,我們沒有軟件來管理我們必須做的所有運輸。有20名車手出現這個問題,所以我坐下來,學習了VBA的基礎知識,並製作了一款應用程序,通過電子郵件向不同的駕駛員管理/發送不同的行程。它現在「起作用」,但我們正在計劃未來的擴展,所以我開始學習Xojo(即時消息在Mac上,與VBA最接近)計劃程序

我們收到一個Excel文件,告訴我們哪些行程需要提前一天完成(我們運送人)。基本上,它與所有不同的客戶的表。我在「星期文件」中導入此工作表,以便通過不同的宏使用這些數據。在這張表中有很多不相關的信息,但我們也會感興趣的是Type,Number和Hour。因此,基本上,我必須把我所有的行(100+),按類型和編號分組,然後按小時順序排列它們。

繼承人什麼我的表如下排序時像一個簡單的例子(不同的顏色有不同的驅動程序):
sorted sheet

我覺得我的程序,得到這樣的結果是不是真的那麼好。我使用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 
+1

你做了一個很好的選擇使用一個數據庫來存儲你的數據。雖然我覺得你對數據庫查詢不是很熟悉? SQL查詢是一種簡單直接的方式,可以查看數據庫的排序/分組/過濾。您的VBA代碼可能會被單個SQL查詢替代。 – Justin

+0

請務必訪問着名的Canuck和Database Genius Tony Teows,地址是http://msmvps.com/blogs/access/archive/tags/Granite+Fleet+Manager/default.aspx ...他使用數據庫管理卡車車隊! – Smandoli

+0

你剛剛在這裏公開了一堆客戶數據嗎? –

回答

2

在SQL中,「分組」是,不僅將行劃分組的操作,同時也聚集了一批的所有行以創建單個輸出行每個組。

在你的榜樣,行被簡單地按類型,數量和時間排序,這需要這樣的查詢:

SELECT * 
FROM MyTable 
ORDER BY Type, Number, Hour