Tópicos relacionados a códigos VBA, gravação de macros, etc.
Por philippemilioni 15 Ago 2019 às 13:23
Membro 1 Estrela
Mensagens: 18
Reputação: 2
#46904
Bom dia senhores

Dias atrás eu solicitei umas informações aqui e agora estou tentando alterar, mas não obtive resultado.
Vamos ao problema
Qdo uma célula é alterada (planilha Dados IT-14, célula K5) tenho 3 opções que são :

CARGA DE INCÊNDIO ESPECÍFICA POR OCUPAÇÃO
MÉTODO PARA LEVANTAMENTO DA CARGA DE INCÊNDIO ESPECÍFICA
MÉTODO DE CÁLCULO DETERMINÍSTICO PARA LEVANTAMENTO DA CARGA DE INCÊNDIO ESPECÍFICA

Cada uma dessas opções, qdo selecionadas atraves da celula K5 irá gerar um cálculo ou um resultado.
Após isso, deverá ser copiado e colado automaticamente na planilha IT-14 a partir da celula C21.
Entretanto não está colando automaticamente e para alguns argumentos dá ERRO 400.
Segue o VBA que alterei.

Private Sub Worksheet_Change(ByVal Target As Range)

If Left(Target.Address, 51) <> "$K$5$" Then Exit Sub
Rows("14:66").Hidden = False

If Target.Address = "$K$5" Then Exit Sub

If Left(Target.Value, 1) = "N" Then
Rows("14:66").Hidden = True

ElseIf Left(Target.Value, 1) = "0" Then
Rows("31:66").Hidden = True

Else: Rows("14:30").Hidden = True

End If

Call Copiar

End Sub

Sub Copiar()
Dim rng As String

If Plan34.Range("K5").Value = Plan34.Range("AI5").Value Then
'Copiar 14:22
rng = "B14:X22"

ElseIf Plan34.Range("K5").Value = Plan34.Range("AI6").Value Then
'Copiar 14:22
rng = "B14:X22"

ElseIf Plan34.Range("K5").Value = Plan34.Range("AI7").Value Then
'Copiar 14:22
rng = "B14:X22"

ElseIf Plan34.Range("K5").Value = Plan34.Range("AI8").Value Then
'Copiar 14:22
rng = "B14:X22"

ElseIf Plan34.Range("K5").Value = Plan34.Range("AI9").Value Then
'Copiar 14:22
rng = "B14:X22"

ElseIf Plan34.Range("K5").Value = Plan34.Range("AI10").Value Then
'Copiar 14:22
rng = "B14:X22"

ElseIf Plan34.Range("K5").Value = Plan34.Range("AI11").Value Then
'Copiar 14:22
rng = "B14:X22"

ElseIf Plan34.Range("K5").Value = Plan34.Range("AI12").Value Then
'Copiar 14:22
rng = "B14:X22"

ElseIf Plan34.Range("K5").Value = Plan34.Range("AI13").Value Then
'Copiar 14:22
rng = "B14:X22"

ElseIf Plan34.Range("K5").Value = Plan34.Range("AI14").Value Then
'Copiar 23:30
rng = "B23:X30"

ElseIf Plan34.Range("K5").Value = Plan34.Range("AI15").Value Then
'Copiar 31:66
rng = "B31:X66"

ElseIf Plan34.Range("K5").Value = Plan34.Range("AI16").Value Then
'Copiar 31:66
rng = "B31:X66"

ElseIf Plan34.Range("K5").Value = Plan34.Range("AI17").Value Then
'Copiar 31:66
rng = "B31:X66"

Else

Exit Sub

End If

'Limpar antes
Plan30.Range("B21:Y56").Value = Empty

'Copiar dados
Sheets("Dados IT-14").Range(rng).Copy

'Cola os dados no destino
Sheets("IT-14").Range("C21").PasteSpecial xlPasteValues

Application.CutCopyMode = False

End Sub

A planilha esta anexo


Preciso de uma ajuda

Obrigado
Apenas usuários registrados podem ver ou baixar anexos.
Avatar do usuário
Por Jimmy 16 Ago 2019 às 10:31
Membro 5 Estrelas
Mensagens: 637
Reputação: 396
#46944
Bom dia Philippe,

Não entrei fundo no código porque não conheço o que se espera da planilha, e também porque pode ser que resolvendo o que vou apontar abaixo, passe a funcionar corretamente.

If Left(Target.Address[color=#FF0000], 51) <> "$K$5$" Then Exit Sub
Porque fazer um LEFT de 51 posições em um endereço que geralmente tem menos que 10 caracteres?
Mesmo que fosse um endereço longo (múltiplos intervalos), com mais de 51 caracteres, como esperar que comparado com "$K$5$", um string de 5 caracteres, possa resultar VERDADEIRO. Sempre será FALSO, logo, EXIT SUB sempre será executado, e a macro nunca seguirá adiante.

Outro motivo pra macro não seguir adiante é que "$K$5$" tem um "$" no final,e nenhum endereço de range termina com "$".

Creio, sem certeza por não conhecer as intenções por trás da macro, é que poderia funcionar se fosse
If Target.Address <> "$K$5" Then Exit Sub

Mesmo passando por essa linha, a macro irá parar em
If Target.Address = "$K$5" Then Exit Sub
porque a primeira linha para a macro se Target for diferente de K5, e a terceira se Target for igual a K5.

Outra coisa a comentar é que K5 tem fórmula, logo, não se espera que algo seja digitado lá. Dessa forma, o evento CHANGE nunca será acionado com Target = K5.

Resumindo, há algo a ser revisto nesse início de macro.

Quando à macro Copiar(), ela tem uma manada de IFs, que da forma que são, podem ter a quantidade de instruções reduzida significativamente usando, por exemplo, .FIND.

Podemos ver isso posteriormente; quando a macro estiver funcionando, a aprimoraremos.

Jimmy San Juan
Por philippemilioni 16 Ago 2019 às 12:19
Membro 1 Estrela
Mensagens: 18
Reputação: 2
#46952
Bom dia Jimmy

Realmente houve um erro de digitação e "$K$5" não tem um "$" no final.
Vou fazer algumas considerações pra ver se voce pode me auxiliar:
- Não sou expert em VBA, na verdade estou iniciando e apanhando muito...rs
- Esse código que estou utilizando foi um código que me passaram aqui no fórum e está funcionando na mesma planilha nas abas Cadastro IT-07 e IT-07, eu só copiei e fiz algumas alterações, que funcionam em partes

Dito isto, vamos ao que espero da planilha.

A idéia dessa planilha, qdo estiver finalizada, é para auxiliar na elaboração de projetos contra incêndio de acordo com o Decreto Estadual 63911 e suas 45 instruções técnicas (IT's).
Para que isso ocorra estou usando um "cadastro" inicial, onde vou inserir os dados da edificação, do proprietário, e as medidas de segurança dadas pelo decreto estadual. Para cada Instrução Técnica montei uma planilha com tabelas, uma planilha com os dados necessários para atender essa instrução técnica e fazer os cálculos da forma mais automática possível e uma planilha onde serão "montados" os dados e os cálculos finalizados e que será impresso (tipo um relatório). Por exemplo: Cadastro IT-07 - planilha que contém tabelas, e os dados para cálculo, e IT-07 onde será inserido os cálculos e esta "formatado" para impressão.

Não sei se esse é o caminho certo ou se tem outra maneira mais fácil e correta de se fazer isso.

Quanto ao código, fiz as alterações que achei que funcionaria para a planilha IT-14, Dados IT-14 e Tabelas IT-14, mas não estão funcionando como eu esperava.

Se tiver algumas dicas ou puder me ajudar, ficarei imensamente grato.
Abraços
Avatar do usuário
Por Jimmy 16 Ago 2019 às 13:43
Membro 5 Estrelas
Mensagens: 637
Reputação: 396
#46956
Olá,

Eu chutaria um palpite: retire a linha
If Target.Address = "$K$5" Then Exit Sub
e veja no que vai dar. Isso fará a macro rodar, o que não estava acontecendo antes.

O sistema todo tem complexidade, e fica difícil falar algo que não seja um chute, uma tentativa...

Quando ao ERRO 400, só dá pra analisar se nos disser o que deve ser digitado e aonde, para reproduzir esse erro.

Jimmy San Juan
Editado pela última vez por Jimmy em 16 Ago 2019 às 15:43, em um total de 1 vez.
Por philippemilioni 16 Ago 2019 às 15:06
Membro 1 Estrela
Mensagens: 18
Reputação: 2
#46962
Retirei a linha e a macro não rodou.
Na verdade não é preciso digitar nada. A célula K5 é inserida automáticamente através da planilha "cadastro" e consequentemente as células K6 e K7 tambem.

1) A célula K19 tem uma lista suspensa que qdo é selecionada ja preenche K20 e K21
2) Da mesma forma K27 e K28 são selecionadas por lista suspensa e K29 é preenchida de forma automatica
3) D42 a D51 tem lista suspensa e M42 a M51 são campos para entrar com valores, Q42 a Q51 são preenchidos automaticamente em função do selecionado em D42 a D51, e U42 a U51 são os resultados da multiplicação de M42 a M51 e Q42 a Q51.

lembrando que 1, 2 e 3 citados acima são selecionados a partir da celula k5
Avatar do usuário
Por Jimmy 16 Ago 2019 às 15:43
Membro 5 Estrelas
Mensagens: 637
Reputação: 396
#46964
Não rodou porque você deve digitar algo em K5. Se não puder digitar lá, porque o dado vem de outra parte, não pode usar o evento CHANGE. A macro do Change é acionada apenas quando alguma célula da planilha é alterada. Ai a macro analisa qual é essa célula, e decide se encerra ou se roda a macro. A Cadastro IT-07 usa o evento Chage porque a B52 dela é digitada.

Você deve seguir o fluxo da informação pra trás, e ver qual célula é a digitada que afeta a K5, e ver se é possível passar as macros para o CHANGE dessa célula raiz.

Eu não consigo analisar todo seu sistema de planilhas pra achar a solução, porque vai tempo, e atualmente tenho tido pouco. Consigo esclarecer alguma coisa mais pontua. Desculpe.

Jimmy San Juan