Senhores,
acho que descobri o motivo pelo qual nossos exercícios de hoje não estavam funcionando.
Se for mesmo o que eu acho que é, esbarramos - vejam só que coisa - em um bug do Excel.
Depois de várias tentativas, observei que o problema estava na identificação do tipo As Integer na chamada da Sub de dentro da Function. Daí me lembrei que no ano passado nós havíamos encontrado um bug na definição dos tipos de variáveis internas, e tentei resolver da mesma maneira que fizemos no ano passado: separando linha por linha as definições das variáveis.
Ou seja, em vez de
Dim x, y As Integer
escrevi
Dim x As Integer
Dim y As Integer
Funcionou!
Por favor estudem e testem o programa abaixo:
Sub Troca(p1 As Integer, p2 As Integer, c As Integer)
Dim u As Integer
u = Cells(p1, c)
Cells(p1, c) = Cells(p2, c)
Cells(p2, c) = u
End Sub
Function PosicaoMenor(inicio As Integer, fim As Integer, c As Integer) As Integer
Dim i As Integer
Dim posMenor As Integer
Dim menor As Integer
menor = Cells(inicio, c)
posMenor = inicio
i = inicio + 1
Do While (i <= fim)
If (menor > Cells(i, c)) Then
menor = Cells(i, c)
posMenor = i
End If
i = i + 1
Loop
PosicaoMenor = posMenor
Call Troca(inicio, posMenor, c)
End Function
Observem, entretanto, que a nossa lista de exercícios de hoje ficou com muitas pendências! Por favor, se tiverem tempo, procurem fazer pelo menos alguns dos exercícios propostos, para não ficarmos muito atrasados com os exercícios.
Observem também o programa abaixo. Ele faz a mesma coisa que o de cima, mas de uma forma mais organizada. Por favor estudem esse programa, testem e procurem entender por que ele é melhor organizado. Na próxima aula esse será um de nossos assuntos.
Sub Troca(p1 As Integer, p2 As Integer, c As Integer)
Dim u As Integer
u = Cells(p1, c)
Cells(p1, c) = Cells(p2, c)
Cells(p2, c) = u
End Sub
Function PosicaoMenor(inicio As Integer, fim As Integer, c As Integer) As Integer
Dim i As Integer
Dim posMenor As Integer
Dim menor As Integer
menor = Cells(inicio, c)
posMenor = inicio
i = inicio + 1
Do While (i <= fim)
If (menor > Cells(i, c)) Then
menor = Cells(i, c)
posMenor = i
End If
i = i + 1
Loop
PosicaoMenor = posMenor
End Function
Sub MAESTRO()
Dim iniMaestro As Integer
Dim fimMaestro As Integer
Dim colMaestro As Integer
Dim posMaestro As Integer
iniMaestro = Cells(1, 1)
fimMaestro = Cells(2, 1)
colMaestro = Cells(3, 1)
posMaestro = PosicaoMenor(iniMaestro, fimMaestro, colMaestro)
Call Troca(iniMaestro, posMaestro, colMaestro)
End Sub