使用命令按钮在Excel中的不同工作表中使用相同的宏

时间:2018-01-27 22:31:58

标签: excel vba excel-vba

我正在尝试为不同的渠道创建预测模板,例如channel1,channel2&amp;通道3 现在我想为这3个频道保留相同的VBA代码(在excel的3个不同表格/标签中),这对于docker exec -ti freeenergy_php_1 /bin/bash < doctrine:migrations:status 工作正常但是它给sheet1&amp; sheet2。为三个不同的纸张编写了相同的宏(因为输入和输出将改变通道),这些宏连接到这3张纸上的命令按钮。 代码和图像: [在此输入图像说明] [1]

sheet3

所以基本上我正在尝试分配会产生最小误差的权重,权重之和为1.现在Sub Macro1() ' Example Solver VBA Macro SolverReset SolverOk SetCell:="$L$7", _ MaxMinVal:=2, _ ValueOf:="0", _ ByChange:="$G$4:$G$6" SolverAdd CellRef:="$G$7", Relation:=2, FormulaText:="1" SolverSolve userFinish:=True End Sub 工作正常,但适用于sheet1&amp; sheet 2,权重之和不是统一的(尽管代码相同)

2 个答案:

答案 0 :(得分:0)

我刚刚遇到相同的问题(或至少类似的问题),其中我的求解器代码在一个工作表中工作(通常在创建代码时处于打开/活动状态),但在其他工作表中却没有(通过复制创建)最初的一个)。就我而言,每个工作表中的按钮都调用相同的代码。 长话短说,求解器约束以某种怪异的方式与原始工作表相关联(假设为“ Sheet1”)。

我的解决方案分两个步骤:

  1. 求解器需要运行一次(打开后每次),然后由过程调用。为此,我记录了宏(在sheet1中)并将其插入到“ Workbook_Open”子目录中。 (我添加了一个消息框,告诉用户发生了什么事)。

  2. 我(在另一个名为“ Solversheet”的工作表中)创建了一些单元格,其中代码编写了求解器的参数。我必须这样做,因为我的求解器一次只能求解一行,并且约束必须相应地更改。 之后,无论您在哪个工作表中工作,SolverLoad都可以从该单独的工作表中加载参数。(如果在此过程之前代码没有运行一次,那么此时您可能会收到错误消息)

这是我的代码:

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

 j = InputBox("Please enter the row in which the table starts (Pkt = 1)", , 13)
 n = InputBox("Please enter the last row for which the solver should solve")

     For i = j To n

               'Sets the solver parameters for each solver
               Range("SOLVERSHEET!B2").Value = "=MIN($I$" & i & ")"
               Range("SOLVERSHEET!B3").Value = "=COUNT($I$" & i & ")"
               Range("SOLVERSHEET!B4").Value = "=$CD$" & i & "<=1"
               Range("SOLVERSHEET!B5").Value = "=$CE$" & i & "<=1"

           SolverLoad ("SOLVERSHEET!B2:B5")
       '    SolverOk SetCell:=Range("I" & i), MaxMinVal:=2, ValueOf:=0, ByChange:=Range("I" & i), Engine:=1, EngineDesc:="GRG Nonlinear"
           SolverSolve True

          Range("I" & i) = Application.WorksheetFunction.RoundUp(Range("I" & i), 0)

     Next i

Application.Calculation = xlAutomatic
Application.ScreenUpdating = True

请注意,“ SolverLoad”的范围将取决于约束的数量。

答案 1 :(得分:0)

您可以测试的可能解决方案,它解决了以上答案中提到的错误438。尝试消除表单按钮,然后将其替换为文本框。放置该框后,右键单击它,然后设置“分配宏”,类似于对窗体控件执行的操作。这似乎允许“按钮”(在本例中为文本框)链接到使用求解器功能的宏。但是,使用此文本框复制工作表不会破坏SolverLoad函数。