(类似数据库 )excel+gemini+VBA脚本语言做的项目,VBA脚本代码部分类似自动化?
起因是我看这个策划岗位貌似需要excel经验,比如excel里的: 原型图和基础编辑器还有vlookup/xlookups等

这些貌似也要学

策划岗位需要的其他经验是这些(放大查看),感觉还需要补充

上图右上角写的东西启发了我去写这个项目
excel项目组成(概括就是一个游戏的攻击力/防御/属性/技能/爆率/关卡boss难度等变量都是可以量化成吸引玩家玩/提高留存率的系统 )
6个图表来显示所有游戏数值等:
1.经济平衡表 2.核心数值平衡表 3.模拟器控制台(调整关卡强度看结果) 4.技能树成长库 5.汇总分析日志(只对多个表的数值修改后结果) 6.参数寻优的更改回溯记录(只对某一个表4的数值修改后结果)
表1,2,4都存放可以修改的数据。表3,5,6存放用VBA代码微调表1,2,4后的数据。表3模拟器控制台(调整关卡强度看结果) ,表5汇总分析日志(对表1,2,4的数值修改后结果),表6参数寻优的更改回溯记录(对表4的数值修改后结果)
6个表:
1.经济平衡表
2.核心数值平衡表
3.模拟器控制台
4.技能树成长库
5.汇总分析日志
6.参数寻优的更改回溯记录
项目的核心逻辑代码(需要VBA脚本(数据库)<-excel中打开Visual Basic<-快捷键Fn+Alt+F11(所有F1到12需要同时按下Fn才起作用))
实现表3:Sub RunSmartSimulation() Dim i As Integer, playerPower As Double, monsterPower As Double Dim resources As Double, prevPower As Double Dim wsLogs As Worksheet, wsShop As Worksheet Dim balanceStatus As String Set wsLogs = Sheets("模拟器控制台") Set wsShop = Sheets("技能树与成长库") wsLogs.Cells.Clear wsLogs.Range("A1:F1").Value = Array("轮次", "关卡强度", "当前战力", "状态", "累计资源", "诊断报告") playerPower = 10 resources = 0 For i = 1 To 20 ' 模拟 20 轮 ' 1. 引入动态环境 (怪物强度随机波动 + 资源掉落随机) monsterPower = 12 + (Rnd * 8) ' 12到20之间波动 Dim dropReward As Double dropReward = 30 + (Rnd * 40) ' 资源掉落30到70之间波动 prevPower = playerPower ' 记录上一轮战力 ' 2. 挑战与反馈 If playerPower < monsterPower Then resources = resources + dropReward balanceStatus = "失败" ' 购买逻辑 If resources >= wsShop.Range("D2").Value Then playerPower = playerPower * (1 + wsShop.Range("C2").Value) resources = resources - wsShop.Range("D2").Value balanceStatus = "失败 -> 强化" End If Else balanceStatus = "胜利" End If ' 3. 自动诊断机制 (这是你的检查器) Dim diagnostic As String If playerPower = prevPower Then diagnostic = "? 警告:卡关" ' 战力没变,说明卡住了 ElseIf (playerPower / prevPower) > 1.2 Then diagnostic = "? 警报:成长过猛" ' 增长超过20%,太快了 Else diagnostic = "? 平滑成长" End If ' 4. 写入数据 wsLogs.Cells(i + 1, 1).Value = i wsLogs.Cells(i + 1, 2).Value = Round(monsterPower, 1) wsLogs.Cells(i + 1, 3).Value = Round(playerPower, 2) wsLogs.Cells(i + 1, 4).Value = balanceStatus wsLogs.Cells(i + 1, 5).Value = Round(resources, 0) wsLogs.Cells(i + 1, 6).Value = diagnostic Next i MsgBox "智能测试完成!请查看‘模拟器控制台’的‘诊断报告’列。" End Sub该代码流程图如下
实现表5:' ================================================================= ' 完整自动化分析模块 (覆盖所有旧代码) ' ================================================================= ' 1. 总指挥 Sub RunFullProcess() ' 启动自动化灵敏度分析引擎 Call SensitivityManager ' 生成图表 Call GeneratePerformanceCharts ' 汇总仪表盘 Call CreateDashboard MsgBox "全流程自动化分析已完成!" End Sub ' 2. 自动化引擎:控制变量灵敏度分析 Sub SensitivityManager() Dim wsLog As Worksheet, wsTarget As Worksheet Dim targets As Variant, addr As String, wsName As String Dim i As Integer ' 初始化汇总表 On Error Resume Next Set wsLog = Sheets("汇总分析日志") If wsLog Is Nothing Then Set wsLog = Sheets.Add: wsLog.Name = "汇总分析日志" wsLog.Cells.Clear wsLog.Range("A1:E1").Value = Array("参数位置", "原始值", "变动率", "变动后数值", "模拟结果(资源)") On Error GoTo 0 ' 定义测试清单 (格式:工作表名|单元格范围) targets = Array("技能树与成长库|C2:C20", "核心数值平衡表|A3", "核心数值平衡表|B3", "经济平衡表|C2:C20", "经济平衡表|D2:D20") For i = LBound(targets) To UBound(targets) Dim parts As Variant parts = Split(targets(i), "|") wsName = parts(0) addr = parts(1) Set wsTarget = Sheets(wsName) Call ScanRange(wsTarget, addr, wsLog) Next i MsgBox "全维度灵敏度分析完成!数据已汇总至【汇总分析日志】。" End Sub Sub ScanRange(ws As Worksheet, addr As String, logWs As Worksheet) Dim rng As Range, cell As Range Set rng = ws.Range(addr) For Each cell In rng If IsNumeric(cell.Value) And cell.Value <> 0 Then Dim org As Double: org = cell.Value Dim step As Integer For step = 1 To 5 Dim rate As Double: rate = step * 0.01 cell.Value = org * (1 + rate) ' 运行你的模拟器 Call RunSmartSimulation ' 记录结果 (假设最后一轮资源在 E21) Dim res As Double res = Sheets("模拟器控制台").Range("E21").Value Dim r As Long r = logWs.Cells(logWs.Rows.Count, 1).End(xlUp).Row + 1 logWs.Cells(r, 1).Value = ws.Name & "!" & cell.Address logWs.Cells(r, 2).Value = org logWs.Cells(r, 3).Value = Format(rate, "0%") logWs.Cells(r, 4).Value = cell.Value logWs.Cells(r, 5).Value = res cell.Value = org ' 恢复原值 Next step End If Next cell End Sub ' 3. 原有的智能模拟器 (必须保留) Sub RunSmartSimulation() Dim i As Integer, playerPower As Double, monsterPower As Double Dim resources As Double, prevPower As Double Dim wsLogs As Worksheet, wsShop As Worksheet Dim balanceStatus As String Set wsLogs = Sheets("模拟器控制台") Set wsShop = Sheets("技能树与成长库") wsLogs.Cells.Clear wsLogs.Range("A1:F1").Value = Array("轮次", "关卡强度", "当前战力", "状态", "累计资源", "诊断报告") playerPower = 10: resources = 0 For i = 1 To 20 monsterPower = 12 + (Rnd * 8) Dim dropReward As Double: dropReward = 30 + (Rnd * 40) prevPower = playerPower If playerPower < monsterPower Then resources = resources + dropReward If resources >= wsShop.Range("D2").Value Then playerPower = playerPower * (1 + wsShop.Range("C2").Value) resources = resources - wsShop.Range("D2").Value End If End If wsLogs.Cells(i + 1, 1).Value = i wsLogs.Cells(i + 1, 2).Value = Round(monsterPower, 1) wsLogs.Cells(i + 1, 3).Value = Round(playerPower, 2) wsLogs.Cells(i + 1, 5).Value = Round(resources, 0) Next i End Sub ' 4. 图表与仪表盘 Sub GeneratePerformanceCharts() ' 这里可以复用你之前的图表逻辑 ' 如果需要针对【汇总分析日志】生成图表,可以修改这里的逻辑 End Sub Sub CreateDashboard() ' 仪表盘生成逻辑 End Sub Function PrepareLogSheet(sn As String) As Worksheet ' 辅助工具 Set PrepareLogSheet = Sheets.Add PrepareLogSheet.Name = sn End Function
实现表6:' ================================================================= ' 核心改进:梯度加压测试 ' ================================================================= Sub RunSensitivityAnalysis() Dim wsEcon As Worksheet, wsCore As Worksheet, wsSkill As Worksheet Dim wsEconLog As Worksheet, wsCoreLog As Worksheet, wsSkillLog As Worksheet Set wsEcon = Sheets("经济平衡表") Set wsCore = Sheets("核心数值平衡表") Set wsSkill = Sheets("技能树与成长库") Set wsEconLog = PrepareLogSheet("经济的回溯日志") Set wsCoreLog = PrepareLogSheet("核心的回溯日志") Set wsSkillLog = PrepareLogSheet("技能的回溯日志") ' 定义一个梯度循环:从 1% 到 5% Dim step As Integer For step = 1 To 5 Dim rate As Double rate = step * 0.01 ' 依次产生 0.01, 0.02, 0.03, 0.04, 0.05 ' 执行梯度测试 Call TestImpact(wsEcon, "C2", rate, wsEconLog) Call TestImpact(wsCore, "B3", rate, wsCoreLog) Dim i As Integer For i = 2 To 5 Call TestImpact(wsSkill, "C" & i, rate, wsSkillLog) Next i Next step MsgBox "梯度压力测试已完成,日志已更新。" End Sub ' 辅助工具:增加参数,记录具体的测试比例 Sub TestImpact(ws As Worksheet, addr As String, rate As Double, logWs As Worksheet) Dim org As Double, testV As Double, r As Long org = Val(ws.Range(addr).Value) testV = org * (1 + rate) ' 临时修改值 ws.Range(addr).Value = testV ' 记录到日志 r = logWs.Cells(logWs.Rows.Count, 1).End(xlUp).Row + 1 logWs.Cells(r, 1).Value = ws.Name & "!" & addr logWs.Cells(r, 2).Value = org logWs.Cells(r, 3).Value = testV logWs.Cells(r, 4).Value = "变动率: " & (rate * 100) & "%" ' 恢复原值 ws.Range(addr).Value = org End Sub
一些不重要的VBA代码优化细节/思考/以后可以注意的点(无关本项目)
1.可以把问AI的代码改为对代码的自动化的提问方式
比如AI说可以设置可以改数值的选项->改为写代码自动对不适合某要求时触发改一些变量数值->写循环调优功能的代码
也不知道这是自动化还是数学建模思维中的某一步?
循环调优: 把AI说的手动调整数值大小改为,不符合某种要求时。在一步步微调,微调的范围在一个循环中
这一核心机制由
SensitivityManager和ScanRange两个函数联手实现。以下是它是如何一步步完成“调优”的:' ================================================================= ' 核心调优逻辑实现 (SensitivityManager & ScanRange) ' ================================================================= Sub SensitivityManager() ' ... (初始化代码) ... ' [第一层] 确定调优目标 (控制台) ' 遍历定义的 targets 清单,决定下一步去修改哪一条流水线 For i = LBound(targets) To UBound(targets) ' ... (解析地址) ... Set wsTarget = Sheets(wsName) Call ScanRange(wsTarget, addr, wsLog) Next i End Sub Sub ScanRange(ws As Worksheet, addr As String, logWs As Worksheet) Dim rng As Range, cell As Range Set rng = ws.Range(addr) ' [第二层] 定位调优精度 (细分扫描) ' 在选定范围内逐个单元格扫描,确保没有遗漏任何一个变量点 For Each cell In rng If IsNumeric(cell.Value) And cell.Value <> 0 Then Dim org As Double: org = cell.Value ' [第三层] 核心调优动作 (梯度 Loop) ' 这是真正的“调优”环节,梯度变化与实验复位 For step = 1 To 5 Dim rate As Double: rate = step * 0.01 ' 1. 修改数值: 模拟“提高 1% 到 5%” cell.Value = org * (1 + rate) ' 2. 运行模拟: 把改变后的参数扔进模型跑一遍 Call RunSmartSimulation ' 3. 结果记录: 将变动后的结果存入日志 ' ... (记录逻辑) ... ' 4. 复位 (Reset): 最关键的一步 ' 确保模型恢复原始数据,保证“控制变量法”的纯粹性 cell.Value = org Next step End If Next cell End Sub最后那个控制变量: 因为你要改很多列的数值,调完这一列的参数你要去改下一列之前(表1的C列,D列/表2的B列/表3的C列里的参数)。必须把已经修改后的上一列的调回到修改之前
1.1循环调优要注意微调+回溯记录到日志文件:
改一个数值/代码 可能对其他数值都出错,整个系统相互关联(微调0.02/次与回溯调整的记录)

1.2日志集中化:
记录到可以回溯的日志记录表,要控制变量.本来想对表1,表2,表4分别回溯到3个日志表。但是一个表出问题你可能要来换换表来回改代码等可能情况。所以日志集中化统一把对不同变量修改的运行结果放到同一张表

2.复用性 (Reusability):
写一个总函数/类,程序先执行该函数,该函数内有其他函数调用/类调用。类似Java代码优先从main函数开始执行,main函数里写一堆函数调用

| 概念 | 描述 |
| 模块化 (Modularity) | 每个函数对应一个功能: 将复杂任务拆解为小的、可复用的独立子程序(Sub函数)。这让你能像搭积木一样管理代码。 |
| 关注点分离 (Separation of Concerns) | 每个函数只做一件事(例如:SensitivityManager 只管分析,CreateDashboard 只管界面)。 |
| 抽象 (Abstraction) |
|
| 入口点模式 (Entry Point Pattern) | 类似 Java 的 public static void main。在 VBA 中,虽然没有强制的入口,但通过一个专门的 Main 过程来调度,是保持工程整洁的行业最佳实践。 |
| 概念 | 核心关注点 | 你的角色 | 你的目标 |
| 结构化编程 | 流程顺序 | 逻辑的构建者 | 防止“面条代码”,保证可读性与复用性。 |
| 控制者模式 | 交互/输入 | 交通警察 | 将“请求”与“处理”解耦,处理用户指令。 |
| 编排模式 | 协作/流转 | 项目总管 | 协调多个独立模块/服务,管理任务的成功与失败。 |
3.设置在运行开始时期自动对所有页表的撤销工作表保护(可以有密码),运行结束(end+函数名())后自动对所有页表加上工作表保护

这下面标签在我写项目时怎么还给我加了运维?自动化和运维有必然联系?,我是写完才发现.
所以大家谁知道吗

更多推荐













所有评论(0)