您這段程式碼是用 dBASE 語法操作 Excel COM 對象,核心目標是將資料寫入 Excel 儲存格(Cell)。
您想將原本寫入資料庫欄位值 R.fields[‘複價’].value 的操作,改成寫入一個 Excel 公式 “=單價*數量”。
要實現這個目標,您只需要更改賦值給 formula 屬性的內容即可。
🛠️ 如何將程式碼改為寫入 Excel 公式
在您提供的程式碼中,oCell 是 Excel 儲存格對象,formula 屬性用於設定儲存格的內容,特別是公式。
原程式碼 (寫入值):
程式碼片段
if (R.fields[‘複價’].value)>0
oCell = o.ActiveSheet.cells( nRow, 6+(N-65) )
with ( oCell )
formula := R.fields[‘複價’].value // 寫入欄位的值
Font.ColorIndex := 5
endwith
endif
修改後的程式碼 (寫入公式):
您只需要將 R.fields[‘複價’].value 替換為包含您所需公式的字串。在 Excel 中,公式必須以等號 (=) 開頭。
程式碼片段
// 假設您想在任何情況下都寫入這個公式
// 注意:這裡假設單價和數量欄位在 Excel 中有固定的位置。
// 為了讓公式可以正常運作,您需要知道“單價”和“數量”所在的欄位字母或數字,
// 並使用 Excel 的 R1C1 或 A1 引用格式。
// 範例:假設單價是同一列的第 D 欄,數量是同一列的第 E 欄。
// 且 oCell 是在第 F 欄 (第 nRow 列)
// ———————————————————————————-
// **選項 1: 使用 Formula (A1 引用格式)**
// A1 格式 (如 B2, C2) 在複製公式時會自動調整行號。
// 這通常是您想要的:
// ———————————————————————————-
oCell = o.ActiveSheet.cells( nRow, 6+(N-65) )
with ( oCell )
// 假設「單價」是同一列的第 4 欄 (D欄),「數量」是第 5 欄 (E欄)
// 您的公式就會是 “=D[nRow]*E[nRow]”
formula := “=D” + STR(nRow) + “*E” + STR(nRow)
// 如果您想使用 Excel 的本地化公式屬性 (FormulaLocal)
// 確保公式以等號開頭,並使用您程式語言中的字串表達式。
// 這裡我們直接使用 Formula 屬性,它接受通用英文格式的公式。
// 如果不確定單價和數量在哪一欄,這裡使用一個**佔位符**:
// formula := “=A” + STR(nRow) + “*B” + STR(nRow)
Font.ColorIndex := 5
endwith
// ———————————————————————————-
// **選項 2: 使用 FormulaR1C1 (R1C1 引用格式) – 推薦**
// R1C1 格式 (如 R[0]C[-1]) 允許您引用相對位置的儲存格,這在迴圈中非常方便。
// ———————————————————————————-
// 假設 oCell 是當前要寫入的儲存格。
// 如果單價在左邊數兩欄 (C[-2]),數量在左邊數一欄 (C[-1]),則:
oCell = o.ActiveSheet.cells( nRow, 6+(N-65) )
with ( oCell )
// R[0]C[-2] 表示:同一行 (R[0]),當前欄位往左兩欄 (C[-2])
// R[0]C[-1] 表示:同一行 (R[0]),當前欄位往左一欄 (C[-1])
FormulaR1C1 := “=R[0]C[-2]*R[0]C[-1]”
Font.ColorIndex := 5
endwith
關於 IF 條件的處理
您原來的程式碼有一個 IF 判斷:
程式碼片段
if (R.fields[‘複價’].value)>0
// … 執行寫入 …
endif
如果您改成寫入公式,您可能就不再需要這個 IF 判斷,因為公式會在 Excel 中自動計算。如果您堅持在特定條件下才寫入公式,您可以保留 IF 結構,只需替換內部的賦值即可。