Notifications
Clear all

Atingir Meta em Macro

6 Posts
3 Usuários
0 Reactions
4,878 Visualizações
(@helton14)
Posts: 2
New Member
Topic starter
 
Pessoal alguém pode me ajudar com essa dúvida.
Estou fazendo uma macro de atingir meta, porem aonde eu vou buscar o valor é em outra ABA e está dando erro, segue o código.
Range("AB9").GoalSeek Goal:=Sheets("Simulador").Select_Range("E26").Value, ChangingCell:=Range("X9")
 
Postado : 10/09/2020 9:29 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Olá, @helton14

Qual erro está dando? Referência inválida ou outro?

  • Primeiro erro e o mais evidente é o "Select_Range". Isso non ecziste! hehehe. Deixe só "Range"
  • De qual planilha é o range AB9? E o X9? Vários problemas podem acontecer quando vc não qualifica todos os ranges utilizados no código. Por exemplo, se vc rodar seu código quando a planilha ativa não for a dessas duas células, vai dar B.O. Qualifique todos, como vc fez com o da planilha Simulador. Digamos que elas estejam na Planilha Plan1, ficaria assim:
  Sheets("Plan1").Range("AB9").GoalSeek Goal:=Sheets("Simulador").Range("E26").Value, _
                                        ChangingCell:=Sheets("Plan1").Range("X9") 
  •  Se o erro persistir, talvez a montagem de sua situação-problema esteja errada. Lembre-se que o Atingir meta é um método que, apesar de bem simples, exige alguma atenção:
    • O range que vai sofrer GoalSeek (AB9) obrigatoriamente tem que ter uma fórmula (senão dá erro 1004 - Referência inválida).
    • Além disso, essa fórmula obrigatoriamente tem que estar relacionada, direta ou indiretamente, à célula que vai sofrer mudanças (ChangingCell = X9).
    • ChangingCell não pode conter fórmula. Só é aceita se tiver valor ou se estiver vazia (senão também dá erro 1004 - Referência inválida).

 
Postado : 11/09/2020 12:55 am
(@anderson)
Posts: 203
Reputable Member
 

Nunca escreva apenas Range, sempre escreva Planilha.Range

Em 90% dos casos em que não se anexa o arquivo, ocorrem mal-entendidos, gerando perda de tempo de ambos os lados.

 
Postado : 11/09/2020 7:53 am
(@helton14)
Posts: 2
New Member
Topic starter
 

@edsonbr 

stou com duvida eu preciso fazer atingir metas em varias linhas. mas está com erro.

Eu estou fazendo essa macro, aonde eu estou errando?

Segue o anexo

’ Preços Macro

Application.ScreenUpdating = False

Dim MargemDesejada As Double

MargemDesejada = Range(“E26”).Value

Range(“AB5”).Select

While ActiveCell.Value <> “”

'On Error Resume Next Sheets("Cálculo Varejista").Range("AB" & activecell.Row)activecell.GoalSeek Goal:=Sheets("Simulador").MargemDesejada _ , ChangingCell:=Sheets("Cálculo Varejista").Range("X" & activecell.Row) ActiveCell.Offset(1, 0).Select Wend

End Sub

 

 
Postado : 11/09/2020 1:25 pm
(@anderson)
Posts: 203
Reputable Member
 

Este vídeo explica:

 

https://youtu.be/brBCZXkYU3M

 

Mais explicação neste tópico:

 

https://planilhando.com.br/vba-macros/duvidas-macro-atingir-meta/

 

Código de exemplo:

 

Sub AtingirMeta()

Dim MargemDesejavel As Double

Dim linha As Long

'Range("AH3").Select

linha = 3

While Range("BA" & linha).Value <> ""

' AtingirMeta Macro

'

'

MargemDesejavel = Range("BA" & linha).Value

Range("AH" & linha).GoalSeek Goal:=MargemDesejavel, ChangingCell:=Range("Z" & linha)
linha = linha + 1
'ActiveCell.Offset(1, 0).Select

Wend

End Sub
Este post foi modificado 4 anos atrás 3 vezes por Anderson

Em 90% dos casos em que não se anexa o arquivo, ocorrem mal-entendidos, gerando perda de tempo de ambos os lados.

 
Postado : 11/09/2020 3:00 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 
Postado por: @helton14

...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:
    • Goal:= MargemDesejada
  • 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:

  1. ele pararia já na linha 11 já que AB11 está vazia, portanto não passaria para a segunda tabela;
  2. Se passasse, daria erro na AB12 pois ela não está vazia mas contém texto, portanto não é calculável;
  3. 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