2014-07-07 66 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