Notifications
Clear all

Erro trabalhando com Arrays

5 Posts
2 Usuários
0 Reactions
1,184 Visualizações
(@jokaman)
Posts: 44
Eminent Member
Topic starter
 

Boa noite

Será que me podem ajudar no erro que está a dar na planilha que anexo?

Run-time error '9': Subscript out of range

Obg

Jorge Cabral

 
Postado : 13/06/2017 3:07 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Olá, Jokaman

Quando vc atribui os valores de um range a uma matriz, esta última terá obrigatoriamente sempre duas dimensões, a primeira correspondendo às linhas e a segunda às colunas. Ambas começarão em 1 (base 1). Então no seu caso tanto Datai quanto Dataf serão matrizes com NLinhas por 1 coluna portanto terá que fazer o preenchimento no loop considerando esta dimensão ausente e também, antes, o ReDim, embora este seja desnecessário aqui, pois, por ser um Variant, a própria atribuição do intervalo a ele automaticamente já o redimensiona.
Além disso, faltou também redimensionar a matriz PosInicial.
Ficaria então:

Sub Overlapping_Dates()
...
...
        ReDim Datai(1 To NDim,1)
        ReDim Dataf(1 To NDim,1)
        ReDim PosInicial(1 To NDim)
...
...
        For i = 1 To NLinha - 14 + 1
            Datai(i, 1) = CDbl(Datai(i, 1))
            Dataf(i, 1) = CDbl(Dataf(i, 1))
            PosInicial(i) = (Datai(i, 1) - DataMenor) * 1
            Debug.Print PosInicial(i)
        Next
End Sub

 
Postado : 13/06/2017 7:59 pm
(@jokaman)
Posts: 44
Eminent Member
Topic starter
 

EdsonBR

Muito obrigado pelo esclarecimento, sou muito novato nestas coisas do VBA, e o seu esclarecimento foi simplesmente TOP!

Só mais um pequeno esclarecimento, porque razão Datai e Dataf não é necessário fazer o REDIM e para o PosInicial e PosFinal, que também são Variant já é preciso?

Muito obrigado mais uma vez.

Abr.
Jorge Cabral

 
Postado : 14/06/2017 4:32 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Jokaman, bom dia

...porque razão Datai e Dataf não é necessário fazer o REDIM e para o PosInicial e PosFinal, que também são Variant já é preciso?

Primeiramente, pelo menos no código presente na pasta que vc anexou, elas não estão declaradas como Variant e sim como Double, veja:

Dim PosInicial() As Double
Dim PosFinal() As Double

Mas mesmo que fossem Variants, como vc está preenchendo elemento por elemento via código (VBA), é necessário que o espaço para cada elemento já esteja alocado na memória antes. A operação instantânea de atribuição de um range a uma matriz Variant, essa "mágica" é uma particularidade exclusiva do Excel e executada/gerenciada internamente, não é uma característica do VBA (lembre-se que Excel e VBA são dois softwares completamente diferentes). Para isso o VBA possui a poderosa variável Variant, que é muito dinâmica e aceita literalmente qualquer coisa.

 
Postado : 14/06/2017 6:27 am
(@jokaman)
Posts: 44
Eminent Member
Topic starter
 

EdsonBR, boa tarde

Entendido!

Quanto ao PosInicial e PosFinal, estava a olhar para uma outra versão, peço desculpa, mas ficou o esclarecimento, muito obrigado, já estava a ficar "maluco" com o erro.

Obg e um abr.

Jorge Cabral

 
Postado : 14/06/2017 8:01 am