Notifications
Clear all

Arrays Com tamanho flexivel igual a listas

16 Posts
3 Usuários
0 Reactions
2,272 Visualizações
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Ola.

Existe algum modo de deixar o tamanho da Array flexível para adicionar valores sem ter que definir previamente o seu tamanho?

normalmente eu uso de matemática básica para definir o tamanho de uma array de destino

Tipo:

    ColunO = Range(Ti & Li, Fc & Lf).Value2
    tl = UBound(ColunO, 1)
    tc = UBound(ColunO, 2)

    TLd = Int(tl / A_cada_Linhas)
    TLd = ((QuantLinhas * TLd) - QuantLinhas) + tl + 1
    ReDim ColunD(TLd, tc)

No caso dessa é para adicionar XLinhas em branco a cada YLinhas da Range
nesse caso foi até facil.

Mas existe casos onde se tem mais variações pré determinantes para o tamanho final da Array que acaba complicando o calculo.

Att.

 
Postado : 12/08/2014 4:21 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Minha sugestão, crie uma matriz predeterminada com o tamanho de 3 vezes o tamanho máximo que ela vai atingir...

A cada preenchida, verifique se o item sendo preenchido irá ultrapassar o ubound... se ultrapassar, redimensione com redim preserve para mais o mesmo tanto...

no final, outro redim preserve para retornar a matriz ao tamanho que somente tem os dados...

Enfim, eu sugiro usar o redim preserve pq ele redimensiona a matriz (somente a segunda dimensão) sem perder os dados, mas por outro lado, é lento, então vale a pena não colocar em toda iteração de um loop...

Vale lembrar que em memória, o que o redim (com ou sem preserve) faz é redimensionar a segunda dimensão, ou seja, pode ser que essa dimensão seja a da coluna para vc, então precisa transpor a matriz antes de redimensionála...

Há o Application.Transpose, nào documentado e não aparece no intellisense, mas funciona! Porém, eu prefiro que vc use o Transpose do meu modelo. Pois o transpose do application é falho e pode dar pau qdo vc tiver mtos dados. O Transpose que eu escrevi é muito mais poderoso...

 
Postado : 12/08/2014 4:25 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

eita, complicou
mais fácil ficar na matemática mesmo e dimensionar a array para o tamanho necessário.

E tem mais um ponto em relação a essa estratégia,
Eu ajusto para a array caber dentro de uma range com limite de tamanho
onde vai ser ajustado para ser alinhado na parte de cima ou debaixo posteriormente.

pensei que tinha algo como listas mais flexíveis.
Mas se não tem, creio que a matemática é a solução mais pratica e rápida.

Pelo menos é um bom treino para o Raciocínio :D

.

 
Postado : 12/08/2014 4:35 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Não tenha medo Edcronos, de usar um recurso novo... eheheh

ReDim Preserve

Permite que vc redimensione a matriz conforme a preenche... Só precisa transpor antes e depois de redimensionar...

Vc força o uso da matemática à toa ! É bom treino? CLARO, mas é necessário ? sei lá... Cada um cada um!

Mas ok, continue como quiser :) (p.s.: meu modelo tem a rotina ResizeArray() que já faz isso tudo pra vc)

 
Postado : 12/08/2014 4:44 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

não é medo de usar recursos novos.
se bem que eu teria que reescrever suas rotinas para o meu modo de entendimento para consegui aplicar nas minha maluquices, mesmo pq não consegui entender para oq cada uma serve, "como falei não entendo ingles, apesar de poder usar um tradutor"

A cada preenchida, verifique se o item sendo preenchido irá ultrapassar o ubound... se ultrapassar, redimensione com redim preserve para mais o mesmo tanto...

fazer isso em loop não iria retardar a execução de um codigo?
No caso eu calculo antes de entrar no loop

crie uma matriz predeterminada com o tamanho de 3 vezes o tamanho máximo que ela vai atingir...

mas se sem usar matemática eu não sei o tamanho que vai ficar, como vou estimar algo próximo :roll: ?

infelizmente matemática não é fácil para mim, tenho que fazer alguns teste para consegui o resultado esperado.

Mas bem, redim preserve seria uma boa solução para o caso de se usar a mesma array, mas como vou passar de uma Array para outra, apenas realocando os dados,
Uma array já dimensionada, mesmo que a custa alguma dor de cabeça para calcular o tamanho final deixe a macro mais simples e fluida.
claro que se houvesse algo como lista que apenas pudesse se adicionar valores sem se preocupar com o tamanho,

bem, como não tem algo facil ...
até que apareça alguma situação onde seja imposta o uso,
Ou que precise de cálculos complexo para se ter o resultado, melhor continuar no (*/-+) :P

mas valeu pela dica Fernando,
vou estudar seus códigos para um possível uso posterior.

Att.

 
Postado : 12/08/2014 5:14 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Vc pode usar uma lista chamada dicionário...

Esta lista vc inclui itens e vai incluindo.... incluindo, pode remover do meio, contar qtos itens tem, salvar um valor para uma chave...

Mas não podem repetir valores, ou seja, o que é chave tem q ser único !

E mais, *voltando ao assunto das variáveis dentro de variáveis, estes são recursos de VBA que atendem a sua necessidade:

1) Type
2) Enum
3) Matrizes (claro, esta vc já conhece... )
4) Dicionários (estes são animais, verdadeiros ajudantes das matrizes, podendo fazer índices, buscas e muito mais)
5) Claro que classes tb resolve, mas é matar formiga com bazooka !

Existem muito mais coisas entre o céu e a terra... rsrsrs

 
Postado : 12/08/2014 5:21 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

realmente ainda tenho que aprender muito
não sei oq é Enum e Type não achei interessante.

matrizes seria uma alternativa, mas pela minha péssima memoria quero usar nomes próprios para cada variável em vez de apenas um índice.

dicionários eu entendi que valores não se repetem, mas fora usar em listas de exclusivos não consegui usar, nem entender isso de chaves.

Classes...Bem, seria divertido exterminar um formigueiro inteiro de uma só vez :P , isso se eu soubesse como operar uma bazuca ... :(

ps. como falei não sou bom em matematica, meu calculo no procedimento descrito no inicio dá, falha com alguns valores que geram restos :( "voltando para a calculadora"

 
Postado : 12/08/2014 5:50 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

ps. como falei não sou bom em matematica, meu calculo no procedimento descrito no inicio dá, falha com alguns valores que geram restos :( "voltando para a calculadora"

Exatamente por isso q não é boa ideia depender disso... Vc só usa pq quer e insiste. A matemática é ótima, mas em *longo prazo, vc se perde.
Não quer usar referências con índices pq se perde
Não quer usar Type pq não achou interessante (uau, queria entender... )
Se admira com classe mas não entende type...

É Ed, vamos ter muuuuuuito o que conversar por aqui !

Public Type Pessoa
     Nome as string
     Telefone as long
     Endereço as string
End Type

Sub Teste()
Dim Alguem as Pessoa

     Alguem.Nome = "Fernando"
     Alguem.Telefone = 99999
     Alguem.Endereço="Rua dos Bobos número 0"

'não seria isso a possibilidade de usar várias variáveis dentro de uma?
'e digo mais, com nomes que façam total sentido, e com facilidade de usar o intellisense do excel...

End Sub
 
Postado : 12/08/2014 6:56 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Enum...
Quando se tem uma monte de parametros confusos pq são numéricos e precisa de muito comentário explicando-os... vale a pena usar o enum, e com palavras intimamente ligadas, usar esses parametros numericamente...

Exemplo:

Public Enum Operador
    Soma = 1
    Subtração = 2
    Multiplicação = 3
    Divisão = 4
End Enum

São constantes..

Assim, vc poderá usar onde quiser a "variável" Operador.Soma ou Operador.Subtração, usando textos que poderão facilitar a leitura do código, e o entendimento.
Mas claro, vc precisaria mudar seu modo de ver variáveis, e usar nomes mais expressivos...

FF

 
Postado : 12/08/2014 7:04 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Pelas minhas macros vc já era para ter percebido que eu sou complicado

o meu intuído seria mais um transporte como o caso que mencionei com os objetos lá em cima

Alguem.Nome = "Fernando"
Alguem.Telefone = 99999
Alguem.Endereço="Rua dos Bobos número 0"

desse modo é mais pratico usar as variaveis normais,
E fora o uso em funções para que se retorne vários valores independentes um do outro, achei que complica mais.
"bem sou iniciante em vba e não sei as varias maneiras de se usar as varias ferramentas do excel"

Exatamente por isso q não é boa ideia depender disso...

assim como não é bom depender de ferramentas únicas, e quando não se domina a ferramenta sempre se corre o risco de se cair nos erros mais básicos

Se admira com classe mas não entende type...

apenas falei que seria bom exterminar um formigueiro com uma bazuca, mencionei clases pq foi a resposta que me deram no outro post que eu tinha criado, parece que em clases se pode atribuir uma variavel em outra, isso pq clases é voltado exclusivamente a objetos, foi oq entendi

bem, de qualquer forma usei tradutor e não entendi direito e acabei largando de lado até ter maior entendimento do VBA
oq eu quero é mais como...
Titulos="transporte"
VARt(1)=VAR(Titulos)
VARt(1)="Passagens"
o valor de Titulos passa a ser Passagens, ao ponto de não precisar mudar as instâncias nem os nomes para usa-las e facilitar o uso em loops

e digo mais, com nomes que façam total sentido

só posso dizer o seguinte... Cada um tem suas limitações e facilidades.
tipo: se eu sou ambidestro mas tenho mais facilidades sendo esquerda :P ,pq forçar em ser destro só para ser igual a todo mundo? "Ps. eu sou destro"

de qualquer forma são puramente ideias malucas de quem tem pouco conhecimento das ferramentas que tem disponíveis.

Mas claro, vc precisaria mudar seu modo de ver variáveis, e usar nomes mais expressivos...

vc iria xingar todos os palavrões que tem em cada idioma se visse o jogo de 21 que eu tinha feito em Basic para um TK90x quando tinha 12 anos...

att.

 
Postado : 12/08/2014 7:47 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

kkkk Edcronos, vc é o cara ! Adoro ver suas respostas !!

Temos muito o que conversar !

Abs

FF

 
Postado : 12/08/2014 11:14 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

o Type qdo bem utilizado, economiza tempo em desenvolvimento... parece não prático, eu sei, mas num dia com alguma cerveja, posso te explicar bem alguns usos que vc vai pirar nas ideias !
Qto ao resto, espero que falemos muito sobre todo o resto ! Vc tem vontade de aprender, mas quando ve que parece complicado, você foge e é teimoso.

Eu ainda vou mudar vc, garoto !! Já trouxe muita gente pro meu nivel, vc é candidato a ser o próximo !

um abraço e segue o jogo ! kkkk

 
Postado : 12/08/2014 11:16 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

o Type qdo bem utilizado, economiza tempo em desenvolvimento... parece não prático, eu sei, mas num dia com alguma cerveja, posso te explicar bem alguns usos que vc vai pirar nas ideias !

Hahaha, Fernando, quando der, também quero tomar cervej... digo, ver esses exemplos.

Apesar de ter lido um pouco sobre o type e sobre classes, não encontrei exemplos de aplicação que me dessem alguma razão para utilizá-los. (O mesmo vale para os dicionários).

Se tu tiver uns exemplos ai, vou agradecer muito.

Abraço, e vamos pro curso :)

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

gtsalikis eu tbm li algo sobre type e vi alguns exemplos quando estava tentando fazer umas macros para controle de cores RGB

Mas somente encontrei utilidade em Funções
Por que funções apenas retornam valores como se fossem variáveis, e se quer que a função retorne mais de um valor se usa o Type.

Clases faz quase a mesma coisa que Type só que mais inteligentemente e com mais funcionalidades
cada variavel de clases pode ser considerada como uma lista que dá para ir adicionando valores como uma array e sem se definir o tamanho, acho que algo como o listview
e tem como usar essas variaveis com os mesmo atributos que tem nos objetos de um userform.

bem se a matricula e a mensalidade não forem muito caras eu me inscrevo no curso tbm " vai que para participar do curso precise pagar por um caminhão de cerveja :? "

Fernando, me considere como um aluno de intercambio e minhas variáveis como palavras inteiras "iguais aos kanjis" :D , E se uma letra é uma palavra, 3 seria como uma frase completa :P

até

 
Postado : 13/08/2014 6:19 am
(@gtsalikis)
Posts: 2373
Noble Member
 

Clases faz quase a mesma coisa que Type só que mais inteligentemente e com mais funcionalidades

É, eu percebi isso também.

Mas encontrei poucos exemplos, e não estou fazendo uma distinção clara para ter uma boa ideia de quando usar o que.

Até tenho aqui um livro sobre programação avançada em VBA que estou lendo, mas são apenas umas 1000 páginas e eu não cheguei na 100.
Falta de tempo mesmo :(

 
Postado : 13/08/2014 10:25 am
Página 1 / 2