Ajuda em Visual Basic Compile Error

willie22

I'm cool cuz I Fold
Ando no 11º ano de Informática e tenho que fazer um programa que gere uma chave do euromilhões de cinco números e duas estrelas...Sem números repetidos...
Fiz o seguinte código:

Private Sub btn_euromilhoes_gerar1_Click()
Dim vec1(5), vec2(2) As Integer
Dim i, j As Integer
For i = 0 To 4
vec1(i) = Int(49 * Rnd + 1)
numeros_euromilhoes1.Text = vec(i) + " "
Next
For j = O To 2
vec2(j) = Int(8 * Rnd + 1)
estrelas_euromilhoes.Text = vec(i) + " "
Next
End Sub

...Mas quando tento correr o programa dá-me este erro: Compile error: sub or function not defined...e a primeira linha de código( Private Sub btn_euromilhoes_gerar1_Click() ) aparece a amarelo...O botão já tem este nome desde o início do programa por isso não vejo o que possa ser.O código tem algum erro?Fico muito grato por qualquer ajuda que me possam dar...
 
Bem, nova tentativa mas julgo que mais acertada :P

Faz mesmo muito tempo que não programo em VB, os erros que julgo podem acontecer aí, baseando-me neste link, talvez tenhas de dizer qual a variável que estás a fazer Next, por exemplo, Next i.

Já agora, não sei se é propositado, mas no segundo for estás a usar o i num suposto array vec, no entanto não tens nenhum array vec definido..., e esse i nunca será alterado, terá sempre o valor 4.

Verifica isto.

abraços, HecKel
 
HecKel, podes fazer "For i... Next", sem ser "Next i". Pode é ficar confuso quando usas ciclos dentro de ciclos (há uma palavra que diz como isto se chama, mas não me lembro :x ). E quando há um "Next", o valor da variável é automaticamente incrementado, ao contrário de linguagens como o C onde tens de dizer explicitamente algo como "i++". No VB isso não é necessário ;)
No entanto, o problema encontra-se no que disseste a seguir :)

Nesse caso, que interessa não é o que está a Amarelo mas sim o que está seleccionado. As arrays vec1 e vec2 foram definidas, mas vec é o que está a ser chamado e não foi definido. E, de acordo com o que foi escrito ("vec(i)"), ele não considera "índice i da array vec", mas considera "função vec parâmetro i". Daí o erro ser "Sub of Function not defined". O compilador está a considerar vec como uma função, já que não sabe o que isso é.

Confirma o nome da variável. O problema há-de estar aí. Provavelmente o que queres é isto
Código:
Private Sub btn_euromilhoes_gerar1_Click()
    Dim vec1(5) [B]As Integer[/B], vec2(2) As Integer
    Dim i [B]As Integer[/B], j As Integer
 
    For i = 0 To 4
        vec1(i) = Int(49 * Rnd + 1)
        numeros_euromilhoes1.Text = [B][U]vec1[/U][/B](i) + " "
    Next [B]i[/B]
 
    For j = O To 2
        vec2(j) = Int(8 * Rnd + 1)
        estrelas_euromilhoes.Text = [B][U]vec2[/U][/B](i) + " "
    Next [B]j[/B]
 
End Sub

E já agora, tomei a liberdade de corrigir o seguinte:
- Dim x, y As Integer. Isto faz com que "x" seja Variant e "y" seja Integer. É um erro pensar-se que tanto x como y serão Integers. Corrigi para o equivalente a Dim x As Integer, y As Integer, que é como deve ser feito.
- Acrescentei algum indenting, para organizar melhor o código.
- Corrigi a variável que te dá problemas, presumindo que no primeiro ciclo referias-te a vec1 e no segundo, a vec2.
- Acrescentei o nome da variável ao Next. Apesar de funcionar apenas o "Next", é sempre bom teres bem explícito o ciclo a que o Next se refere.

Espero ter ajudado :P

Cumprimentos
angelofwisdom
 
Última edição:
Já fiz as correcções que me indicaram e este erro desapareceu, mas agora quando corro o programa aparece-me a seguinte mensagem: Runtime Error 13: Type Mismatch.
Penso que tenho as variáveis declaradas correctamente.
Alguem sabe o porquê deste erro?
Muito obrigado pela vossa ajuda! :)
 
No código acima corrigido, e mesmo no código original acho que existem alguns erros...

For i = 0 To 4
vec1(i) = Int(49 * Rnd + 1)
numeros_euromilhoes1.Text = vec1(i) + " "
Next i

For j = O To 2
vec2(j) = Int(8 * Rnd + 1)
estrelas_euromilhoes.Text = vec2(i) + " "
Next j

no For j=, está lá a letra "O" em vez do numero 0 (se foi copiado daqui, poderá ser esse o erro de type mismatch), depois, queres apenas duas estrelas não é? então o porquê de for j=0 to 2 ?? o ciclo será executado 3 vezes, logo gerará 3 numeros.

por final, não é normal, mas poderá acontecer o teu text label não estar a gostar de aceitar um vector, ou variavel de um vector, para isso podes converter o teu numero gerado em string antes de o enviares para o label. Podes usar o cstr() ou o format(), ficarias algo como
numeros_euromilhoes1.text = cstr(vec1(i)) + " " ou
numeros_euromilhoes1.text = format(vect1(i))
o mesmo se passaria para as estrelas.

Mas só mesmo corrigindo esse ciclo j=O para j=0 já deve funcionar correctamente.

De qualquer das maneiras o melhor seria fazeres um debug colocando uns breakpoints e uns watch às variaveis para detectares mais facilmente o teu erro.

hope it works!
 
Última edição:
Já descobri a razão do erro: Em vez de pôr + tinha k pôr & para adicionar o espaço entre os números. O único problema é que na textbox numeros_euromilhoes1.Text só aparece 1 número e deviam aparecer 5. Na textbox estrelas_euromilhoes1.Text também só aparece 1 número mas deviam aparecer 2. Estarei a fazer alguma coisa mal novamente? lol muito obrigado pela vossa ajuda mais uma vez :)
 
Última edição:
em x de numeros_euromilhoes1.text = vec1(i) & " " coloca

numeros_euromilhoes1.text = numeros_euromilhoes1.text & vec1(i) & " "

:)

abraço.
 
Com efeito, após rever o código todo e tudo o que o mswebdev disse, agora é que está certo.
O código que eu coloquei é o original, com algumas modificações que fiz à mão. Não pude abrir o VB na altura porque não tinha memória :x

O "For j = O to ..." não dá problemas se ele não usar o Option Explicit. Está errado, sim, mas "O" é considerado uma variável nova com o valor inicial 0. Apesar de estar incorrecto, não está a trazer problemas.
O erro era mesmo estares a somar vec1(), que é uma Integer, com " ", que é uma String. Isso é que provoca o Type Mismatch (os tipos das variáveis não coincidem. Basicamente, não se pode somar um número com uma letra). Ou o CStr(vec1()) ou o trocar o "+" por "&" corrigem este problema.

Quanto ao mostrar os números todos, a última resposta corrige isso :P

Código:
Private Sub btn_euromilhoes_gerar1_Click()
    Dim vec1(5) [B]As Integer[/B], vec2(2) As Integer
    Dim i [B]As Integer[/B], j As Integer
 
    For i = 0 To 4
        vec1(i) = Int(49 * Rnd + 1)
        numeros_euromilhoes1.Text = numeros_euromilhoes1.Text  & CStr([B][U]vec1[/U][/B](i)) & " "
    Next [B]i[/B]
 
    For j = 0 To 1
        vec2(j) = Int(8 * Rnd + 1)
        estrelas_euromilhoes.Text = estrelas_euromilhoes.Text  & CStr([B][U]vec2[/U][/B](i)) & " "
    Next [B]j[/B]
 
End Sub
Isto deve estar certo agora. Devido ao avançado da hora no meu post anterior, não estava com disposição para ver o código todo, por isso estes erros todos escaparam-me (limitei-me a corrigir o problema que mostravas, e mais algumas coisas que apanhei a olho).
 
Última edição:
Forneceram-me o seguinte código para a resoluçao do problema já com a verificação dos dados incutida:
Código:
Private Sub btn_euromilhoes_gerar1_Click()             Dim vec1(5), vec2(2) As Integer             Dim n, i, j As Integer             Dim ja_saiu As Boolean              Cls 'limpa o form             i = 0             Do While i < 5                ja_saiu = False                n = Int(49 * Rnd) + 1                For j = 0 To 4                    If n = vec1(j) And ja_saiu = False Then ja_saiu = True                Next                If ja_saiu = False Then                   vec1(i) = n                   i = i + 1                End If                Loop              i = 0             Do While i < 2                ja_saiu = False                n = Int(9 * Rnd) + 1                For j = 0 To 1                    If n = vec2(j) And ja_saiu = False Then ja_saiu = True                Next                If ja_saiu = False Then                   vec2(i) = n                   i = i + 1                End If             Loop             For i = 0 To 4                 numeros_euromilhoes1.Text = numeros_euromilhoes.Text + vec1(i) & " "             Next             Print             Print vec2(0) & " " & vec2(1) End Sub
Queria mostrar o resultado em textboxes em vez do print...Alguém sabe como poderei fazer isto?Desde já o meu muito obrigado.
 
Última edição:
Back
Topo