[VBA] 規劃求解的實際運用 (AI解)

更新於 發佈於 閱讀時間約 7 分鐘

問題:

前幾天,LINE Meiko微課頻道 社群,奇大哥 不吝分享某個 Facebook 社團內問題的神奇解法。雖然我對數字沒啥概念,只好請出【神隊友 AI】來幫忙~



前言:

在數據導向的商業環境中,規劃求解技術是解決複雜問題的關鍵工具之一。這類技術尤其在財務和營運策略中顯得重要,其中需確定一組變量的最佳組合以達成特定目標。Excel VBA(Visual Basic for Applications)提供了一個強大的平台,使非程式設計背景的專業人士也能夠實現複雜的數據處理和自動化任務。

本文將通過一個實際例子—找出一組數值之和最接近指定目標—來探討規劃求解在實際應用中的流程和技術。



問題說明:

在這個案例中,所面對的挑戰是從 Excel 表格的 A 欄(A1 到 A16)中挑選幾個數字,使得所選數字的總和最接近 D1 單元格中的目標值(30303)。這是一個典型的優化問題,常見於財務領域,比如說配置資產組合以達到最接近預期回報的目標。

從 A1 ~ A16 挑選幾個數字,放入 E欄 內並加總後,才會使得 F1 和 D1 的值相等或最接近 ?

從 A1 ~ A16 挑選幾個數字,放入 E欄 內並加總後,才會使得 F1 和 D1 的值相等或最接近 ?



程式設計:

步驟一:讀取數據

首先,程式需要從 Excel 工作表中讀取數據。這包括從 A2 到 A16 的數據(由於 A1 是標題),以及 D1 單元格中的目標值。

步驟二:設計算法

為了解決這個問題,使用了一種稱為「回溯算法」(Backtracking),這是一種系統地遍歷所有可能組合的方法,以找到最佳解。這個算法從第一個數字開始,逐個檢查加入或不加入該數字的結果,並根據當前的組合計算總和,進而評估其接近目標值的程度。

步驟三:處理數據類型

在 VBA 中,數字處理的默認類型是 Integer,但當處理的數值或計算的範圍超過 Integer 所能表示的範圍時,就會導致溢位錯誤。為了避免這一問題,將所有的數字變數改用 Long 類型,它提供了更大的數值範圍。

步驟四:實現並優化

實現算法後,程式會逐一試驗所有可能的數字組合,計算每一組合的總和並與目標值比較,記錄下最接近的組合和相應的差異。為了提高效率,限制了組合的數量,避免不必要的計算。

步驟五:輸出結果

當找到最佳組合後,程式會將這些數值從 A 欄複製到 E 欄,讓結果數值能夠直觀地顯示出來。



程式碼實現:

下面是實現上述功能的 VBA 程式碼示例:

Sub FindClosestSum()

Dim target As Long
Dim nums As Range, cell As Range
Dim bestSum As Long, bestDiff As Long
Dim currSum As Long, currDiff As Long
Dim i As Long, combinations As Long
Dim bestCombination As String, currCombination As String
Dim eColumnIndex As Long

' 設定目標值和數字範圍
target = Sheets("Sheet1").Cells(1, 4).Value ' D1 單元格的值
Set nums = Sheets("Sheet1").Range("A2:A16") ' A欄的範圍

' 初始化最佳差異為一個很大的數
bestDiff = 99999999

' 初始化 E 欄索引
eColumnIndex = 1


' 計算所有可能的組合
combinations = 2 ^ nums.Cells.Count - 1
If combinations >= 2147483647 Then combinations = 2147483647 ' 限制組合數量以避免溢位


For i = 1 To combinations
currSum = 0
currCombination = ""
For Each cell In nums
If (i And 2 ^ (cell.Row - nums.Row)) <> 0 Then
currSum = currSum + cell.Value
currCombination = currCombination & cell.Row & ", "
End If
Next cell


' 計算當前組合的差異
currDiff = Abs(currSum - target)


' 更新最佳解
If currDiff < bestDiff Then
bestDiff = currDiff
bestSum = currSum
bestCombination = Left(currCombination, Len(currCombination) - 2)
End If
Next i


' 將最佳組合的數值寫入 E 欄
If bestCombination <> "" Then
Dim rowIndexes As Variant
rowIndexes = Split(bestCombination, ", ")
For i = LBound(rowIndexes) To UBound(rowIndexes)
Sheets("Sheet1").Cells(eColumnIndex + 1, 5).Value = Sheets("Sheet1").Cells(rowIndexes(i), 1).Value
eColumnIndex = eColumnIndex + 1
Next i
End If


' 輸出結果
MsgBox "Best sum: " & bestSum & vbNewLine & _
"Closest difference: " & bestDiff & vbNewLine & _
"Combination of rows: " & bestCombination

End Sub



檔案下載



結論:

這個案例不僅展示了如何使用 VBA 解決具體的規劃求解問題,還反映了計算技術如何幫助我們達成所要的目標。通過這樣的實踐,專業人士可以更好地理解並利用數據,進而在複雜的商業環境中做出更精確的決策。 VBA 的這種應用不僅限於財務規劃,其在各種業務過程中的潛力是巨大的,值得每一位專業人士深入學習和掌握。



參考文獻




以上就是這次的分享,請持續關注  和 Meiko微課頻道,謝謝大家 ~

有任何問題,請到【opa的沙龍】【Excel VBA 情境學習】一起討論有關 VBA 的問題,或加入 LINE社群 Meiko微課小綠群(粉絲交流群)


歡迎您的加入。

留言
avatar-img
留言分享你的想法!
avatar-img
Meiko微課頻道的沙龍
148會員
49內容數
Meiko微課頻道主要以辦公室應用為出發點,針對上班族群所遇到的問題進行分享
2025/04/06
本篇文章分享如何使用 Excel VBA 程式碼去除 Excel 儲存格裡文字或英文句子前後的空白,提供【基礎版】和【進階版】兩種 VBA 程式碼範例,並比較其功能差異。進階版程式碼可以保留句子中間的空白,只去除句子頭尾的空白。文章也包含程式碼下載連結以及相關參考資源。
Thumbnail
2025/04/06
本篇文章分享如何使用 Excel VBA 程式碼去除 Excel 儲存格裡文字或英文句子前後的空白,提供【基礎版】和【進階版】兩種 VBA 程式碼範例,並比較其功能差異。進階版程式碼可以保留句子中間的空白,只去除句子頭尾的空白。文章也包含程式碼下載連結以及相關參考資源。
Thumbnail
2025/01/08
本篇文章提供一個利用 Excel VBA 和 Google Map API,自動計算起迄地址里程數的解決方案。分享開發過程的心路歷程,以及如何克服使用Google Map API的挑戰,並感謝 Meiko老師 的教學 和 ChatGPT o1 pro 的協助,並提供檔案免費下載。
Thumbnail
2025/01/08
本篇文章提供一個利用 Excel VBA 和 Google Map API,自動計算起迄地址里程數的解決方案。分享開發過程的心路歷程,以及如何克服使用Google Map API的挑戰,並感謝 Meiko老師 的教學 和 ChatGPT o1 pro 的協助,並提供檔案免費下載。
Thumbnail
2024/11/29
在 Excel VBA 中,使用 ActiveSheet.ShowAllData 方法顯示篩選過的數據時,可能會遇到錯誤。如果當前沒有篩選條件而直接調用此方法,將導致執行錯誤。本文介紹檢查篩選狀態,來安全地使用 ShowAllData。還探討了使用 On Error Resume Next 的風險。
Thumbnail
2024/11/29
在 Excel VBA 中,使用 ActiveSheet.ShowAllData 方法顯示篩選過的數據時,可能會遇到錯誤。如果當前沒有篩選條件而直接調用此方法,將導致執行錯誤。本文介紹檢查篩選狀態,來安全地使用 ShowAllData。還探討了使用 On Error Resume Next 的風險。
Thumbnail
看更多
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
商業簡報不僅僅是呈現數據,更需要深入瞭解數據分析及有效的工具運用。本文探討於Excel中使用不同函數來改善數據處理效率,包括IF、IFS、VLOOKUP、XLOOKUP及INDEX與MATCH的結合,幫助商業人士更好地從數據中提取洞見,助力業務增值,學習優化數據分析過程,讓您的商業簡報更具影響力。
Thumbnail
商業簡報不僅僅是呈現數據,更需要深入瞭解數據分析及有效的工具運用。本文探討於Excel中使用不同函數來改善數據處理效率,包括IF、IFS、VLOOKUP、XLOOKUP及INDEX與MATCH的結合,幫助商業人士更好地從數據中提取洞見,助力業務增值,學習優化數據分析過程,讓您的商業簡報更具影響力。
Thumbnail
本文提供了一個關於模擬法演算法的問題,介紹了操作指令的格式及其解析。透過程式碼模擬每條指令,找出回到根目錄所需的操作次數。本文詳細說明瞭模擬法的複雜度分析,能夠幫助讀者更好地理解這個問題。
Thumbnail
本文提供了一個關於模擬法演算法的問題,介紹了操作指令的格式及其解析。透過程式碼模擬每條指令,找出回到根目錄所需的操作次數。本文詳細說明瞭模擬法的複雜度分析,能夠幫助讀者更好地理解這個問題。
Thumbnail
本文介紹瞭如何將Excel圖表轉成圖片,並解決了圖表資料量大時可能出現的錯誤訊息。此外,還分享了ChatGPT 4o (訂閱付費版) 的幫助與成功轉換圖片的經驗。 還有周杰倫關於一技之長的觀點分享,激勵讀者找到自己的優勢和興趣。並提供了相關參考文獻,讓讀者進一步深入瞭解主題。
Thumbnail
本文介紹瞭如何將Excel圖表轉成圖片,並解決了圖表資料量大時可能出現的錯誤訊息。此外,還分享了ChatGPT 4o (訂閱付費版) 的幫助與成功轉換圖片的經驗。 還有周杰倫關於一技之長的觀點分享,激勵讀者找到自己的優勢和興趣。並提供了相關參考文獻,讓讀者進一步深入瞭解主題。
Thumbnail
Excel好好玩VBA-菜緒 (https://portaly.cc/ezyvba) VBE輔助工具一個針對Excel VBA撰寫的輔助工具 代碼對齊排版、排序、刪空行、刪註解、簡易VBA收集(可新增、刪除)..
Thumbnail
Excel好好玩VBA-菜緒 (https://portaly.cc/ezyvba) VBE輔助工具一個針對Excel VBA撰寫的輔助工具 代碼對齊排版、排序、刪空行、刪註解、簡易VBA收集(可新增、刪除)..
Thumbnail
本文介紹瞭如何使用 Excel VBA 解決規劃求解問題的實際案例,並展示了「回溯算法」(Backtracking) 的應用。通過此案例,專業人士可以更好地理解並利用數據,進而在商業環境中做出更精確的決策。
Thumbnail
本文介紹瞭如何使用 Excel VBA 解決規劃求解問題的實際案例,並展示了「回溯算法」(Backtracking) 的應用。通過此案例,專業人士可以更好地理解並利用數據,進而在商業環境中做出更精確的決策。
Thumbnail
不會寫Excel VBA不再是問題了!如何讓數據說話,是職場必備的技巧!而Excel又是搜集數據的好工具,今天石頭哥帶你透過ChatGPT 來神救援!
Thumbnail
不會寫Excel VBA不再是問題了!如何讓數據說話,是職場必備的技巧!而Excel又是搜集數據的好工具,今天石頭哥帶你透過ChatGPT 來神救援!
Thumbnail
日前在LINE社群,有網友提出一個問題,要把資料進行分析,用日期來計算出將對應的資料。 原始資料,密密麻麻的數據,都看不清楚了 放大一點點 要把這些資料不同『料號』的各種『狀態』依據『日期』進行分析。 有興趣可以下載試著挑戰看看:檔案下載 作法有很多種,當然也可以用函數處
Thumbnail
日前在LINE社群,有網友提出一個問題,要把資料進行分析,用日期來計算出將對應的資料。 原始資料,密密麻麻的數據,都看不清楚了 放大一點點 要把這些資料不同『料號』的各種『狀態』依據『日期』進行分析。 有興趣可以下載試著挑戰看看:檔案下載 作法有很多種,當然也可以用函數處
Thumbnail
在 Excel 中,VLOOKUP 函數是一個強大的工具,它可以幫助你快速找到並擷取特定值對應的相關資訊。這篇教學將向你展示如何使用 VLOOKUP 函數來搜索數據,並提供一個實際的範例。
Thumbnail
在 Excel 中,VLOOKUP 函數是一個強大的工具,它可以幫助你快速找到並擷取特定值對應的相關資訊。這篇教學將向你展示如何使用 VLOOKUP 函數來搜索數據,並提供一個實際的範例。
Thumbnail
在Dcard有人求救一個問題:想要將layer與panel的資料提出出來,如下圖。 這個題目是很經典的需求,就是多條件查找,多條件查找有蠻多種不同的解決方法,甚至版本不同解法也是天壤之別哦。 準備動作 在寫函數之前,記得要先觀察一下我們想要提取的資料有什麼樣的規則,可以發現A欄中只
Thumbnail
在Dcard有人求救一個問題:想要將layer與panel的資料提出出來,如下圖。 這個題目是很經典的需求,就是多條件查找,多條件查找有蠻多種不同的解決方法,甚至版本不同解法也是天壤之別哦。 準備動作 在寫函數之前,記得要先觀察一下我們想要提取的資料有什麼樣的規則,可以發現A欄中只
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News