Jump to content
Jose Manuel Diniz

Copiar determinadas células para local simétrico dentro da mesma folha

Recommended Posts

Jose Manuel Diniz

Ola boa noite. Eu sou novo no VBA mas acho muito interessante e tenho feito algumas coisas, com base em informações que vou recolhendo aqui e ali, apenas em termos ludicos e para aprendizagem..

No caso presente, eu gostaria de copiar através de programação ou macros, dados de varias células, desde que estas contivessem valores, para determinadas posições dentro dessa mesma folha, sem ter que recorrer ao copy paste, portanto de uma forma automática..

Concretizando, suponhamos que tenho um "quadrado" de 9 células horizontais por 9 células verticais (portanto 81 células). Ao preencher uma determinada célula dentro desse "quadrado", com números de 1 a 9, obrigatoriamente ela iria copiar em outro "quadrado", esse mesmo valor, mas  na posição correspondente.

Suponhamos o jogo do sudoku. Ao preencher o valor 3 por exemplo na célula c21 ela replicaria esse valor automaticamente no outro quadrado, ou seja na posição c6,, ou por exemplo o valor no k21 copiaria para k6 e assim por diante, mas só copiaria, se no quadrado composto pelas células c21 ate k29 contivessem valor.

O "quadrado" origem seria composto pelas células c21 ate k29 e o "quadrado" destino seria c6 a k14, em que c21 corresponderia a d6;,d21.a d6; e21 a e6 ate k21 a k6, depois novamente c22 a c7, etc ate ao final k29 a k14.

Será que é possível, alguém pode me dar uma ajuda, é que eu tenho visto algumas formas de copiar, mas nao consigo por a funcionar correctamente.

Muito obrigado

Se calhar não fui muito explicito na minha exposição. Claro que eu posso fazer uma macro em que copio todo o tal "quadrado" e "colo" sobre o outro quadrado. Mas isso é muito simples. E o meu objectivo não é esse.

O meu objectivo é ao preencher determinada célula, dentro do 1.º "quadrado", automaticamente ser replicado o valor preenchido na célula correspondente dentro do outro quadrado, sendo que esta ultima célula encontrar-se-ia numa posição simétrica.

O exemplo que dei do jogo do Sudoku é perfeitamente elucidativo. Suponhamos que temos dois quadrados, compostos por 81 quadriculas do jogo do Sudoku. Ao preencher uma quadricula especifica no 1 quadrado, automaticamente seria preenchida a quadricula correspondente no outro quadrado, esta quadricula correspondente teria a ver com a posição da linha e da coluna.,

Edited by Jose Manuel Diniz

Share this post


Link to post
Share on other sites
Gnrtuga

Boas, eu pessoalmente prefiro usar forms em VBA, e não sei se é por isso que estou a ter dificuldade em entender o que queres. Sou daqueles que acha que um programador é preguiçoso, ou seja quantos menos linhas escrever e quanto menos trabalho tiver melhor, por isso, e compreendo que seja para treinares e aprenderes estou a ter dificuldade em tentar te ajudar, quando a solução mais prática seria =CelulaOrigem (c5 = a1).

Não sei se me fiz entender.

Na minha experiência pessoal, também como curioso que foi aprendendo, também com o VBA, é mais fácil (para mim foi) usar forms e ir vendo como as coisas se alteravam, com a vantagem de que com um form dás um ar mais "profissional" à coisa :)

Sugestão uma boa pesquisa no Google pode dar bons resultados, não receies experimentar uma abordagem diferente da que estás a utilizar, e neste fórum vais encontrar quase sempre ajuda, mas também pode acontecer estares muitos dias à espera de uma resposta uma vez que o pessoal tem outras obrigações e  podem não estar sempre disponíveis.

Boa sorte. 


Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!)

Nunca mais é verão outra vez.. :)

Share this post


Link to post
Share on other sites
manuel antonio

Boa noite.

Penso que o teu problema é muito simples de resolver, o que me leva a concluir que não pesquisaste muito.

Deduzi que pretendes um quadrado de 9x9, um sobre o outro.

Dois ciclos For...Next intercalados penso que resolvem o teu problema. Vamos lá a ver se percebi o que pretendes.

Colocar aqui imagens é uma barreira que eu não entendo por isso vou tentar por palavras fazer-me entender.

Desenha 1 quadrado de 9x9 abrangendo as celulas C1 até K9. Desenha um 2º quadrado englobando as células C10 a K18.

Abre o separador "Programador" e dá duplo click na folha1 que aparece no lado esquerdo. Isto se colocares os quadrados na folha 1, pois se colocares noutra folha é nessa outra que dás o click.

Depois de abrir o quadro para o código, cola as linhas de código a seguir.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim x As Integer, y As Integer

For x = 67 To 75
For y = 10 To 18

If Range(Chr(x) & y).Value = "" Then
 Range(Chr(x) & y).Value = Range(Chr(x) & y - 9).Value
End If

Next y
Next x
End Sub

Faz a introdução dos números com "ENTER" ou com setas direcionais e vê o resultado.

É isto que pretendes?

Em jeito de explicação "Chr" significa caracter e o nº 67 corresponde à letra "C" como o 68 corresponde à letra "D", e o 75 à letra "K".

O código só funciona se as células do 2º quadrado estiverem vazias. Se precisares de corrigir algum número, tens que retirar a condição "If" e o respetivo "End if".

Edited by manuel antonio

Share this post


Link to post
Share on other sites
Jose Manuel Diniz

Caro Sr Manuel Antonio. É isto mesmo que eu pretendo. Muito obrigado. Mas já agora, poderia me explicar como e que funciona essa tabela do chr. Pelo que eu vi se clicar na tecla "Alt" e em simultaneo clicar em "067" surge a letra "c". Ok. Percebi. Ea tabela ASCII. Mas em relação ao y se fizer o mesmo no 010 e no 018 ja nao da. Ah Ok. Tambem ja percebi. Neste ultimo caso estes numeros referem-se mesmo ao n.º de linhas. Muito obrigado pela sua explicação. Sabe é que eu sou apenas um curioso e nos tempos livres vou tentando aprender mais umas coisas e esta explicação foi muito imteressante e loquente. Mais uma vez obrigado. 

Share this post


Link to post
Share on other sites
manuel antonio

Bom dia.

Eu também sou apenas curioso.

A tabela Ascii pode ser visualizada numa pesquisa simples no google, visualizando assim todos os carateres da tabela.

O Excell só entende números e como tal tens que converter as letras das colunas para números. Foi uma coisa que aprendi aqui no P@P.

x e y são duas varáveis e estão declaradas como numéricas e na tabela Ascii, maiúsculas e minúsculas têm códigos diferentes.

Se colocares na folha um código simples como:

Dim z as integer
For z=0 to 255
Range("F" & z+1)= Chr(z)
next z

O código vai-te imprimir na coluna "F" todos os carateres entre 0 e 255. O z+1 tem que ser colocado porque o Excell não tem Linha 0.

Ainda bem que o problema está resolvido.

Ás vezes o mais difícil é escolher o evento para o código. Por exemplo, se escolheres o evento "Change", que ativa o código a qualquer alteração na folha o código bloqueia pois está constantemente a receber alterações.

 

 

Edited by manuel antonio

Share this post


Link to post
Share on other sites
Renato MDSP

Olá. Apenas para agregar mais informação ao fórum. Utilizei o método Change para não ficar igual a resposta do Manuel. Espero ter entendido corretamente a sua dúvida José. Fiz baseado no seu exemplo. Inserir dados na linha 21 para baixo.

A distância do intervalo que você exemplificou equivale a 15 células para cima. Então você poderia utilizar um Target.Offset(-15, 0). Se você inserir dados na linha 15,14,13, etc...ocorrerá um erro porque o Offset(-15, 0) não existira (altere o "-15" caso precise). A variável desliga_evento faz o que o nome propõe. Desliga o evento Change assim que o valor for igual a True.

Dim desliga_evento As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
    If IsArray(Target) Then Exit Sub
    If desliga_evento = True Then Exit Sub
    desliga_evento = True
    Target.Offset(-15, 0).Value = Target.Value
    desliga_evento = False
End Sub

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.