監造報表-數量計算-數量填寫

🙌前言

監造報表的數量填寫為施工紀錄時最重要的基本功,填寫方式可分為以儲存格填寫、使用者表單填寫,如果掌管工地現場的工地主任對資訊比較不了解的,也很有可能會將內容寫在紙本或白板上拍照上傳群組回報,再由內業工程人員進行資料登打,無論哪種方式,填寫內容都還是以契約項目為依據,只在數量部分做琢磨而已。

契約項目以可量化型態、一式型態、百分比型態為主,這部分請參考前文,不再另外闡述,本篇內容主要介紹填寫時透過單元的概念進行組合項目的過程,當內容以單元進行時,除了工地主任的回報會比較明確,同時也可以針對單元的進行輔以相對的檢核機制與防呆機制,會省下很多麻煩。

✒️填寫方式

儲存格填寫

儲存格可能是文字、數字、日期...等,除非有先修改儲存格格式,否則他會根據當下的狀況自動判斷要以哪種方式存在,這通常會造成一些奇怪的問題,例如原本輸入日期2023/2/5顯示卻變成44962,還有輸入手機號碼的時候,最前面的0會被去掉,此時就需要將數字變成字串(在手機號碼最前面打上')才能正確顯示。

即便可以將儲存格的格式問題排除,建議複雜資料還是不要讓使用者直接用儲存格進行填寫,你永遠不知道使用者他們會怎麼亂給資料,後續的資料再利用會有很多限制。

使用者表單填寫

使用者表單為VBA所提供的介面,透過拖曳的方式將控制項放入表單畫面,並且針對各控制項的事件進行邏輯判斷與後續處理,需要一點VBA的基本功才有辦法掌握,以下介紹用的到的控制項、事件名稱、用途說明,關於使用者表單的教學再另開一篇專文說明。

控制項目 用途說明
Lable 顯示內容
TextBox 提供使用者填寫內容
ComboBox 提供既有內容讓使用者選擇
CheckBox 註記功能是否進行
CommandButton 執行功能

好處是可以有效控制使用者填寫內容的正確性,後續資料再利用時比較不會有困擾,盡可能在收集複雜資料的過程都採用這種方式,簡單資料還是可以透過直接填寫儲存格完成沒有關係。

Fig1. 填寫施作資料介面

紙本填寫

當工程資料大多都以紙本進行時,如果要進行統計分析時會消耗很多人力,這也是為什麼EXCEL這類的試算表會被發展出來的原因,也因此紙本資料轉換對於資料電腦化會是一件很痛苦的事情,每次的資料搬遷都可能會有資料丟失跟資料誤繕的可能,但營建產業這樣的情況可說是很常見。

對於不太會使用電腦的工地人員而言,人人有一隻有網路的手機,也是滿合情合理的,只要有網路就可以將手機作為表單的填寫媒介先送到雲端上面,再由內業人員將資料彙整出來,字太小可以用平板電腦克服,甚至用響應式網站的方式進行調整,資料能夠減少一次搬遷對於後續都會是一件好事。

Fig2. Google表單+Sheets

📔契約項目

一般項目

透過直接採用契約項目之可量化型態、一式型態進行填寫,百分比型態則後續報表產製時根據比例進行換算。

監造報表-數量計算-引用來源

組合項目

在進行經費估算時,數量計算表的產製為降低錯誤,通常會給圖說上出現的組合構件進行編號,對於帶狀工程則會有每進行米的概念,因為不管在哪個樁號其實都長得差不多,只要算出每進行米有多少材料,計算時乘上總長度即可得到答案。

單元構件

建築工程常見的構件是柱梁板牆,橋梁工程常見的構件是墩柱、節塊,單元可以自行定義,主要是為了方便撿料及工班說明而已。

每進行米

灌溉排水工程會以矩型溝作為每進行米的撿料標準,道路工程則會以鋪面剖面或擋土構造物(重力式擋土牆、懸臂式擋土牆...等)為每進行米的撿料標準,整體會考慮漸變段,採用平均值計算,工程細節如要再進行拆分,則又會分成襯底、渠底、鋼筋組立、左右牆身...等進行每進行米的填寫依據。

☑️檢核機制

將圖面內容轉為單元去進行分析,最大的好處就是可以進行單元統計了解與數量計算表之間的差異、透過計算樁號區段繪製條狀圖理解目前施工工序及預測下階段施作樁號、達成樁號重覆填寫的防呆,更重要的是藉由工項更正可以批次調整已經紀錄的內容,即時修正單元的數量計算。

單元統計

當發生單元填寫完畢卻與契約數量不符時,可以使用單元統計,先將所有單元名稱材料進行總計,確認契約數量與單元統計總計所得之總數量是否相符,如果不相符則是當初在切分單元的時候就已經存在錯誤。

確定是切分單元的時候的錯誤後,可以根據不同單元名稱作為分類,將該合計內容總數量與數量計算表的相關工項名稱逐行列表進行比對,從最小單元進行錯誤查找,通常都會抓到一些問題,可以進行後續的工項更正。

Fig3. 單元統計範例

工項更正

工項更正則是利用單元名稱於施工紀錄表上的註記,將正確的單元材料回推至施工紀錄表上的數量,藉此更新資訊並提示使用者更正明細。

有些內業人員會擔心工項更正後會影響已經製作的日報內容,希望可以透過錯誤暫存的方式,在未來填寫新的日報時做些微的增刪來調整,要點選這顆按鈕時要慎思,當然也可以在工程剛開始就先全部紀錄上去試試,有發現與契約數量不符時馬上更正,但若是遇到變更設計就沒轍,變更設計還是有可能會更改到單元材料。

Fig4. 工項更正範例

條狀圖查看

透過施工進程的拆分、進行樁號區間的繪製,搭配樁號防呆機制,能夠有效檢核施工進程的合理性,通常以灌溉排水工程為例,工序為襯底>鋼筋組立>大底>左右牆身,此外因應施工規範要求需要以隔段施工進行,並預留模板拆除時間,從施工進度條狀圖上所登載的日期與單元名稱便可掌握整體施工順序。

Fig5. 條狀圖範例

樁號防呆

帶狀工程最容易出現的問題就是重複紀錄樁號區間,在單元統計的時只能知道目前總長度為多少,但卻無法知道區間是否重疊,尤其當工序相當複雜時,沒有將區間進行可視化更是難以判別,因此最方便的方式便是在填寫樁號時就先判定是否有重複,重複的原因可能是起始樁號位於既設樁號區間(A)、結束樁號位於既設樁號區間(B)、起訖樁號包含既設樁號區間(C)。

Fig6. 樁號區間衝突情境

程式碼運作上會先把樁號轉成數字再進行區間判斷,節錄自我的Github

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94

Function TranLoc(ByVal Data As String) As Double

'樁號型態轉成可計算之樁號

tmp = split(Data, "+")

If UBound(tmp) = -1 Or Data = "" Then Exit Function ' TranLoc = CDbl(Data): Exit Function

tloc = tmp(0) '千位數
dloc = tmp(1)


If dloc Like "*(*" Then

tmp2 = split(dloc, "(")

If tmp2(0) Like "*.*" Then

tmp3 = split(tmp2(0), ".")
dloc = tmp3(0) + tmp3(1) / 10

Else

dloc = tmp2(0)

End If

If dloc > 1000 Then Exit Function

End If

For i = 1 To Len(tloc)

loc_ch = mid(tloc, i, 1)
If IsNumeric(loc_ch) Then ref = ref & loc_ch

Next

TranLoc = CDbl(ref) * 1000 + CDbl(dloc)

End Function

Function IsRecLocPass(ByVal rec_loc As String, ByVal item_loc As String) ', ByVal r As Integer)

IsRecLocPass = False

Dim myfunc As New clsMyfunction

tmp = split(rec_loc, "~")

rec_sloc = myfunc.TranLoc(tmp(0))
rec_eloc = myfunc.TranLoc(tmp(1))

tmp2 = split(item_loc, "~")

item_sloc = myfunc.TranLoc(tmp2(0))
item_eloc = myfunc.TranLoc(tmp2(1))

If item_sloc >= rec_sloc And item_sloc < rec_eloc Then

err_prompt = "第" & r & "列衝突=>紀錄起點【" & tmp2(0) & "】已包含於本次填報【" & rec_loc & "】"

If err_prompt <> "" Then p = p & err_prompt & vbNewLine

End If

If item_eloc > rec_sloc And item_eloc <= rec_eloc Then

err_prompt = "第" & r & "列衝突=>紀錄終點【" & tmp2(1) & "】已包含於本次填報【" & rec_loc & "】"

If err_prompt <> "" Then p = p & err_prompt & vbNewLine

End If

If rec_sloc >= item_sloc And rec_sloc < item_eloc Then

err_prompt = "第" & r & "列衝突=>填報起點【" & tmp(0) & "】已包含於舊有紀錄【" & item_loc & "】"

If err_prompt <> "" Then p = p & err_prompt & vbNewLine

End If

If rec_eloc > item_sloc And rec_eloc <= item_eloc Then

err_prompt = "第" & r & "列衝突=>填報終點【" & tmp(1) & "】已包含於舊有紀錄【" & item_loc & "】"

If err_prompt <> "" Then p = p & err_prompt & vbNewLine

End If

If p = "" Then IsRecLocPass = True

End Function