...aonde eu estou errando?
Tem vários erros nesse código, Helton, e como vc pediu pra mostrar onde estavam...:
MargemDesejada = Range("E26").Value
- Aquilo que falamos antes sobre usar o nome da planilha pro Excel saber de qual célula E26 (de qual planilha) vc está se referindo. Melhor seria:
MargemDesejada = Worksheets("Simulador").Range("E26").Value
- Se vc quiser insistir em usar Select e ActiveCell, certifique-se antes que vc está na planilha certa (Cálculo Varejista) ou force o Excel a ir para ela:
Worksheets("Cálculo Varejista").Activate
. Aí sim pode usar o Select e o ActiveCell à vontade que não terá problema de os cálculos serem aplicados em outra planilha. Se fizer isso, aí sim nem precisaria usar o nome de planilha (qualificar) aos outros Ranges
Range("AB" & activecell.Row)activecell
- Essa construção não faz sentido. O segundo activecell está sobrando ali.
Goal:=Sheets("Simulador").MargemDesejada
- MargemDesejada já é um valor numérico e não um Range. O fato dela ter vindo antes da planilha "Simulador" não significa que pertença ou que esteja vinculada a ela. Use somente:
- Em resumo, a linha principal de seu código poderia ficar assim:
Range("AB" & ActiveCell.Row).GoalSeek Goal:= MargemDesejada, ChangingCell:= Range("X" & ActiveCell.Row)
Um outro problema é que vc usou como critério para rodar a macro o fato de a célula não estar vazia (While ActiveCell.Value <> “”
). As consequências ruins disso são que:
- ele pararia já na linha 11 já que AB11 está vazia, portanto não passaria para a segunda tabela;
- Se passasse, daria erro na AB12 pois ela não está vazia mas contém texto, portanto não é calculável;
- Ao chegar ao final, teria problema na linha de totais da tabela (linha 32), pois na coluna X tem uma fórmula.
Diante disso, já que vc tem seus dados na "Cálculo Varejista" em tabelas (3 no caso) sugiro aproveitar esse fato e usar as ferramentas próprias para isso que o VBA do Excel disponibiliza.
Sugestão de código:
Sub OtimizaPreçoVenda()
Dim tbl As ListObject, rgMargem As Range, i As Long, rgPrVenda As Range
Dim MargemDesejada As Double
MargemDesejada = Worksheets("Simulador").Range("E26").Value
Application.ScreenUpdating = False
For Each tbl In Worksheets("Cálculo Varejista").ListObjects
For i = 1 To tbl.ListRows.Count
Set rgMargem = tbl.ListColumns("Margem").DataBodyRange.Item(i)
Set rgPrVenda = tbl.ListColumns("Preço de Venda").DataBodyRange.Item(i)
rgMargem.GoalSeek Goal:=MargemDesejada, Changingcell:=rgPrVenda
Next i
Next tbl
Application.ScreenUpdating = True
End Sub
Postado : 12/09/2020 12:34 am