Notifications
Clear all

Tipos Incompatíveis

8 Posts
4 Usuários
0 Reactions
1,294 Visualizações
(@mantissa)
Posts: 0
New Member
Topic starter
 

Olá pessoal, estou nos meus primeiros dias de VBA e me deparei com um problema. O excel não executa meu código alegando "tipos incompatíveis" (erro 13).
Porém, a tabela que estou lendo possui apenas valores inteiros, e declarei todas as variáveis como inteiras.
Aqui está o código, alguém tem alguma dica ? Obrigado.

Sub MonteCarlo()
Dim Index, Hits, n As Integer

n = Worksheets("Plan1").Range("A1:A10")
Hits = 0
For Index = 1 To n
    If Rnd ^ 2 + Rnd ^ 2 < 1 Then Hits = Hits + 1
    Next Index
    Range("A5, A10") = 4 * Hits / n
End Sub
 
Postado : 27/10/2016 8:54 am
(@djunqueira)
Posts: 0
New Member
 

n = Worksheets("Plan1").Range("A1:A10").Value

 
Postado : 27/10/2016 9:26 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

A Variável n, não está recebendo o tipo Integer.
Eu não sei o que vc quer fazer, mas tente algo do tipo...

Worksheets("Plan1").Range("A1:A10").Cells.SpecialCells(xlCellTypeConstants).Count

Favor adaptar se necesário.

Att

 
Postado : 27/10/2016 9:44 am
(@edsonbr)
Posts: 0
New Member
 

Olá, Mantissa, bem vindo ao Planilhando.

A variável n é um Integer, então ela só aceita um único valor por vez e no entanto vc está tentando atribuir a ela o conteúdo de 10 células (Range("A1:A10")) ao mesmo tempo. Se fosse uma Variant, até aceitaria pois se tornaria uma matriz de uma dimensão e dez elementos. No entanto não faria muito sentido em seu código, já que é um simples contador, não é mesmo? Então, se o valor do número de iterações que vc intencionava buscar estiver digamos em A1, vc poderia usar simplesmente n = Worksheets("Plan1").Range("A1").Value. Embora não seja obrigatório, é um bom hábito sempre qualificar os objetos que vc vai usar, nesse caso do Range, usando a propriedade Value como indicado pelo Junqueira, pois vc está interessado no conteúdo da célula e não no objeto Range.

Obs.: como curiosidade, se vc quisesse usar a primeira célula do intervalo Range("A1:A10"), vc poderia também usar o próprio intervalo como uma "mini-planilha" e escolher então um sub-range dele. Poderia ser, por exemplo:
Range("A1:A10").Range("A1").Value 'Ou seja, o sub-range A1 do range A1:A10
Range("A1:A10")(1).Value 'Também funciona ;)
Range("A1:A10").Cells(1, 1).Value 'Ou seja, a primeira célula da primeira coluna do intervalo A1:A10

Só mais uma observação:

...declarei todas as variáveis como inteiras.

Na verdade só n foi declarado como Integer, as outras permanecem Variant. Para declarar todas como Integer, tem de ser de uma a uma.
Dim Index As Integer, Hits As Integer, n As Integer

 
Postado : 27/10/2016 9:58 am
(@djunqueira)
Posts: 0
New Member
 

n = Worksheets("Plan1").Range("A1:A10").Value

Eita, agora q eu notei, eram várias células...

 
Postado : 27/10/2016 10:08 am
(@mantissa)
Posts: 0
New Member
Topic starter
 

Range("A1:A10").Range("A1").Value 'Ou seja, o sub-range A1 do range A1:A10
Range("A1:A10")(1).Value 'Também funciona ;)
Range("A1:A10").Cells(1, 1).Value 'Ou seja, a primeira célula da primeira coluna do intervalo A1:A10

Só mais uma observação:

...declarei todas as variáveis como inteiras.

Na verdade só n foi declarado como Integer, as outras permanecem Variant. Para declarar todas como Integer, tem de ser de uma a uma.
Dim Index As Integer, Hits As Integer, n As Integer

Edson, obrigada pela explicação! :)
Não sabia que o VB não aceita várias declarações "inline"! É bem diferente mesmo.
Acabei de tentar de todas essas maneiras, com uma variável declarada por linha..mas o erro persiste.

Sub MonteCarlo()
Dim Index As Integer
Dim Hits As Integer
Dim n As Integer


n = Worksheets("Plan1").Range("A1:A10").Value 

Sim, eu quero contar quantas células existem, elevar dois números de 0 a 1 ao quadrado e se a soma deles for menor que 1, contar como "Hits".
É um algoritmo bem simples mas não para de dar erros. Isso é a base do chamado "método de monte carlo"

 
Postado : 28/10/2016 12:23 pm
(@edsonbr)
Posts: 0
New Member
 

Boa tarde, Mantissa.

Agora vc acertou na declaração das variáveis, mas repetiu o erro em relação à atribuição de valor à sua variável "n", usando intervalo múltiplo. Mas...

...eu quero contar quantas células existem...

Ah, então vc não quer pegar o valor que está dentro da célula (propriedade .Value) e sim a quantidade de células do intervalo, no seu caso A1:A10 (10 células), é isso?
Nesse caso a propriedade a usar não é .Value e sim:

n = Worksheets("Plan1").Range("A1:A10").Cells.Count 'Obviamente retorna n = 10

ou, para contar só as que tem algum texto ou valores que não sejam resultados de fórmulas use o método proposto pelo Alexandre.

 
Postado : 28/10/2016 1:21 pm
(@mantissa)
Posts: 0
New Member
Topic starter
 

Entendi!
Agora deu certo, eu tenho que ser bem explícita na leitura então.
Quando se tratar do valor que está nas células, uso .Value. Se for para contar Cells.Count

Obrigada

 
Postado : 28/10/2016 1:39 pm