Notifications
Clear all

array como coluna's auxiliar

18 Posts
4 Usuários
0 Reactions
3,973 Visualizações
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

inicialmente eu uso colunas auxiliares para troca de dados, mas de algum modo estava me incomodando apesar de funcionar bem.

pensei em usar array, apesar de que em outros tópicos em outros fóruns antes de conhecer o planilhando falaram que não era possível ou que tinha que fazer loop para leitura e escrita.

bem, eu consegui, mas...
fiz essa macro de teste de deslocamento lateral, mas achei o tamanho um tanto quanto exagerado e não vi melhora de desempenho em ralação a usar células auxiliares.

Alguém pode me dizer se tem como melhorar esse código?

Sub test_esquerda()
Dim Coluno() As Variant

n = 2
ci2 = Range(Ci & "1").Column
cf2 = Range(Cf & "1").Column

Coluno = Range(Ci & Li, Cells(Lf, ci2 + n - 1)).Value2

Range(Ci & Li, Cells(Lf, cf2 - n)).Value2 = Range(Cells(Li, ci2 + n), Cf & Lf).Value2

Range(Cells(Li, (cf2 - n + 1)), Cells(Lf, cf2)).Value2 = Coluno

End Sub

ATT.

 
Postado : 10/05/2014 5:47 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Confesso que não entendi o que vc quer fazer com o código. :(

 
Postado : 10/05/2014 6:02 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

ci =coluna inicial "letra"
cf=coluna final "Letra"
li=linha inicial
lf =linha final

a macro copia as 2 primeiras colunas numa array
desloca 2 colunas para a esquerda
e cola a array nas duas ultimas colunas

 
Postado : 10/05/2014 6:06 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

A macro trabalhando numa planilha
Desculpa a enrolada com as variáveis, é que eu só uso assim.

mas de qualquer forma minhas macro são bem fáceis de adaptar ("pelo menos as que não usam macros auxiliares"),
é só colocar essas linhas no inicio
ci = "A"
cf = "L"
Li = 2
Lf = 1000

 
Postado : 10/05/2014 6:41 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Hmm, fiz um exemplo aqui, ve se ajuda em algo:

Sub copycola_GT()

Application.ScreenUpdating = False

Dim coluna() As Variant

Dim CI      As Long
Dim CF      As Long
Dim LI      As Long
Dim LF      As Long

Dim D       As Long 'Desloc

CI = 2 'valor para testar
CF = 3 'valor para testar
LI = 2 'valor para testar
LF = 4 'valor para testar

D = 5 'valor para testar

ReDim coluna(LF - LI + 1, 2)

coluna = Range(Cells(LI, CI), Cells(LF, CF))

Range(Cells(LI, CI + 5), Cells(LF, CF + 5)).Value2 = coluna

Application.ScreenUpdating = True

End Sub
 
Postado : 10/05/2014 6:51 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

desculpe, mas não consegui aplicar

dentro desse exemplo
ci = "A"
cf = "L"
Li = 2
Lf = 1000
seria o mesmo que Range("A2:L1000")

a macro faz um deslocamento para a esquerda em Loop dessa Range.
N= valor do deslocamento "variável"

 
Postado : 10/05/2014 7:15 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Edcronos,

Eu tinha feito aquele exemplo antes de vc postar a planilha, só com o que eu tinha entendido.

Pelo que notei no teu modelo, não acho que consigo melhorar em termos de desempenho.

Coisas que poderiam ajudar:

- usar o application.screenupdating = false

- declarar a matriz com tamanho fixo (por isso eu usei o redim no código).

- se possível, evitar declarar a matriz como variant (acho que vc ja sabe isso, mas...)

Fora isso, eu posso estar enganado, mas, talvez, usar uma array nesse caso não signifique ganho de desempenho. Como a matriz é variant, ela vai analisar cada dado coletado quando estiver carregando a matriz, o que eu creio, não ocorreria ao copiar o conte'do de uma célula (ou coluna) para outra.

Mas eu não sei afirmar com certeza, talvez alguém possa confirmar se isso que falei procede ou não.

Abs

 
Postado : 10/05/2014 9:47 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

sobre:
application.screenupdating = false:
sempre uso, essa é uma macro que vai ser chamada por outras que já tem,
mas mesmo nessa do jeito que está não teve diferença de desempenho.

matriz como variant:
os dados da planilha podem ser textos ou números, então não tem como evitar

declarar a matriz com tamanho fixo:
pensei nisso, mas tbm não vi diferença de desempenho num teste de 3 colunas x 5000 linhas

em um conjunto grande de dados não creio que faça teste de conteúdo, os tempo foram similares apenas senti diferença no tempo acima de 10000 linhas
o mesmo com Value e Value2 parece que só tem efeito em células independentes, em um conjunto range não fez diferença em meus testes

vou tentar melhorar a macro adicionando teste de conteúdo antes do deslocamento

Mas não é bem somente desempenho, é praticidade tbm, minha planilha muda e muda ,seria menos áreas axilares

tenho macros que realocam os dados para se encaixarem nos novos setores,
então como tem movimentação de colunas, com a array não seria necessário re-lê as posições

e tbm estou querendo aprender melhor o funcionamento das arrays para montar um multidimensional para analises de dados de forma multi direcional."apenas mais uma ideia maluca"

Mas valeu.

 
Postado : 10/05/2014 10:24 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

mais alguns testes...
adicionei essas linhas
n = 3
Li = Range(Ci & Li).End(xlDown).Row
Lf = Range(Ci & Lf).End(xlUp).Row
K = Range(Ci & Li, Ci & Lf).Rows.Count
ReDim Coluno(K, n)
então somente vai atuar na parte que tem dados, faz grande diferença onde tem grande numero de linhas em branco em baixo e em cima, redim fez pouca diferença.

Mesmo somente com números e sem linhas em branco, aceitou somente Variant, com os outros deu tipos incompatíveis.
talvez pq a matriz não foi declarada com valores fixos

 
Postado : 10/05/2014 11:23 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

em um conjunto grande de dados não creio que faça teste de conteúdo, os tempo foram similares apenas senti diferença no tempo acima de 10000 linhas

Bem, o que aprendi é que, quando se declara uma variável como variant, ela sempre vai avaliar o tipo de informação. Porém, eu não sei dizer se uma matriz as variant faz isso com todos os dados, ou somente com o primeiro.

De qqr forma, creio que não poderei ajudar nesse caso. :(

 
Postado : 11/05/2014 11:58 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

obrigado mesmo assim,
tentei usar long para setores numéricos, mas deu tipo incompatível.

Bem, o que aprendi é que, quando se declara uma variável como variant, ela sempre vai avaliar o tipo de informação. Porém, eu não sei dizer se uma matriz as variant faz isso com todos os dados, ou somente com o primeiro.

Mensagempor benzadeus » 06 Mai 2014, 18:49
"As dicas são de 2003, será que todas elas ainda são validas nas atuais versões do VBA?" <<<--------eu perguntei
Infelizmente, a Microsoft não faz uma atualização significativa desde 1999, então sim, esse tipo de dica ainda vale hoje para o VBA.

como somente vi atualização de efeito visual no office "fora do de 2003 para o 2007...
e ao me ve o 2013 foi uma desatualização em termo de praticidade, velocidade e conforto para usar
sendo assim o grande diferencial entre planilha e VBA deve ser a velocidade do processador e a memoria.

o importante é que está funcionando, né.

 
Postado : 11/05/2014 2:50 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Numa ultima avaliação antes de fechar

Bem, o que aprendi é que, quando se declara uma variável como variant, ela sempre vai avaliar o tipo de informação. Porém, eu não sei dizer se uma matriz as variant faz isso com todos os dados, ou somente com o primeiro.

talvez essa pagina tenha a resposta:
http://fastexcel.wordpress.com/2011/11/ ... -avoid-it/

ao meu vê, quando é feita a leitura Célula a Célula tem sim uma verificação de conteúdo

mas quando é feito de uma maneira direta,
toda a Range de uma vez só,
não é feito a verificação, ainda mais com Value2,
tanto que ReDim não fez difereça na velocidade
tanto que sem ser Variant deu tipos incompatíveis.

Dim Coluna() As Variant
ReDim Coluna(K, n)
Coluna = Range(Ci & Li, Cells(Lf, ci2 + nc - 1)).Value2
Range(Cells(Li, (cf2 - nc + 1)), Cells(Lf, cf2)).Value2 = Coluna

att.

 
Postado : 12/05/2014 4:13 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Desculpa dar voltas no mesmo assunto,
mas estou com certa dificuldade de entender completamente os conceitos de matrizes,

achei isso, que pelo visto é oq estou usando

Variável Variant que contém uma matriz
Se você quiser transferir dados de um intervalo de células em uma planilha para uma matriz, você pode percorrer as células e preencher cada elemento na matriz com o valor da célula toda vez pelo loop, ou você pode atribuir diretamente o intervalo para a matriz. O último método é mais rápido. No entanto, a matriz que você está passando para o intervalo de células é realmente uma variável Variant que contém uma matriz.

http://www.escolaexcel.com.br/2013/06/d ... entos.html

MArray = Range("A1:F1").Value2

MArray() As Variant (funciona)

MArray(1 to 6) As Variant ,String,Long,... ( Erro )
MArray() As String,Long,... ( Erro )

quais são as maneira possíveis de se fazer atribuição de valores numa array sem ter que fazer Loop, MArray(i)=valor ?

estou com dificuldades principalmente sobre matriz multidimensional,
pesquisei, mas só fala superficialmente, e somente dão exemplos de matrizes de 2 dimensões.

as informações que eu acho são bastantes fragmentadas,
e como não entendo inglês uso o tradutor oq pode tonar confuso certos trechos.
teria alguma pagina sobre o assunto com conteúdo mais completo?

 
Postado : 13/05/2014 11:03 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Ed, na net encontramos varios links sobre o assunto, acredito que já deve ter visto a maioria deles, mas segue alguns que acredito ser interessante ao assunto:

Vetores - http://www.ambienteoffice.com.br/officevba/vetores/
Vetores podem ter até 60 dimensões, mas é raro usarmos mais de 3....

Arrays contendo Arrays - http://www.macoratti.net/arrays.htm
Você pode criar um array do tipo Variant que contenha outros arrays de diferentes tipos de dados.
Arrays Multidimensionais
- Array com duas dimensões
- Array com três dimensões - Dim Tres_Dimensoes(4,4,4) as integer
- Array com três dimensões - Dim Tres_Dimensoes(1 To 5,1 To 5,1 To 5) as integer
Arrays Dinâmicos

Veja na conclusão deste artigo o item:
Conclusão:
Ao redimensionar um array usando a palavra chave ReDim o conteúdo do array será perdido . Para evitar tal efeito devemos usar a palavra Preserve na declaração. Ex: RedDim Preserve Teste(1 To 15) As Integer

Parte III - Vetores e matrizes - http://bianchi.pro.br/vba/vba_p3.php

Criando e Administrando Array - http://www.bertolo.pro.br/FinEst/Tutori ... ando_Array

VBA – Ordenando Arrays Multi Dimensionais - http://www.tomasvasquez.com.br/blog/mic ... mensionais

VBA – Ordenando Arrays e Listas - http://www.tomasvasquez.com.br/blog/mic ... s-e-listas

Espero que ajudem.

[]s

 
Postado : 14/05/2014 6:18 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

bem, não sei se é valido,
mas com a representação por imagem Array(2,6,8)= (plan2,linha6,coluna8), valendo os demais conceitos de um bidimensional.
http://msdn.microsoft.com/pt-br/library ... 90%29.aspx
se for valido entendi como uma array multidimensional funciona e como fazer atribuições.

Sobre pegar e atribuir valores diretamente:

Dim Suo() As Variant
Suo = Array(Range("A" & 11, "B" & 11).Value2)
Suo = Range("A" & 11, "B" & 11).Value2

não dão erro, e Redim não faz diferença, e não dá para usar>>> " Suo(1) <--erro "

parece que apesar de serem definidas como array são simplesmente range,
não dando para definir seus valores individualmente.
Suo = Array("a","b") >>> " Suo(1) =b "

nenhum dos de cima dá para usar " Dim Suo() As" sem ser Variant ou definir valores fixos
pelo que entendi os de cima não são matrizes reais,

"Suo= Array()" define Suo como matriz e Array() transforma os valores internos () de maneira direta

minha conclusão até o momento é que só dá para pegar ou atribuir valores de matrizes por Loop,

http://www.macoratti.net/arrays.htm

'atribui os arrays definidos anteriormente como elementos deste novo array
arrX(1) = contadorA()
arrX(2) = contadorB()

Apenas entre matrizes reais e pelo visto é chamado de matriz irregular, nem entendi direito, mas...

vi em algum forum internacional como usar as funções do excel diretamente em uma matriz sem usar Loop para varrer "se perdeu no montante de sites que eu vi"

bem, vou encerrar o tópico, apesar de não ser uma array o que usei na macro, mas pelo menos está funcionando,
não teve melhora na velocidade "nem perda" mas pelo menos não tenho que me preocupar onde colocar os dados.

O jeito agora é testes e mais teste, para tentar fazer a nova macro

Obrigado ao gtsalikis e ao Mauro Coutinho pela ajuda.

 
Postado : 14/05/2014 2:20 pm
Página 1 / 2