Possível resolução (Arquitectura VBA Exercícios por resolver) 1) Private Sub CommandButton1_Click() Dim valor_actual As Integer valor_actual = CommandButton1.Caption If valor_actual < 100 Then valor_actual = valor_actual + 1 CommandButton1.Caption = valor_actual 2) Private Sub CommandButton1_Click() ThisWorkbook.Save 3) Private Sub CommandButton1_Click() For a = 1 To 9 ThisWorkbook.Worksheets.Add Financiado pelo FSE Pág: 1
4) Sub testar_func() Dim valor As Integer valor = InputBox("Introduza um número inteiro compreendido entre 0 e 9999") 'Assumindo que o utilizador introduz valores válidos MsgBox num_extenso(valor) Function num_extenso(num As Integer) As String Dim milhares As Integer Dim centenas As Integer Dim dezenas As Integer Dim unidades As Integer 'Determinar milhares, centenas, dezenas e unidades milhares = num \ 1000 centenas = (num - milhares * 1000) \ 100 dezenas = (num - milhares * 1000 - centenas * 100) \ 10 unidades = (num - milhares * 1000 - centenas * 100 - dezenas * 10) 'Colocar milhares If milhares = 0 Then milhares_extenso = "" If milhares = 1 Then milhares_extenso = "mil" If milhares >= 2 Then milhares_extenso = conv1(milhares) & " mil" 'Colocar centenas If centenas = 0 Then centenas_extenso = "" If centenas >= 1 Then centenas_extenso = conv2(centenas) 'Colocar dezenas If dezenas = 0 Then dezenas_extenso = "" If dezenas >= 1 Then dezenas_extenso = conv3(dezenas) 'Colocar unidades If unidades = 0 Then unidades_extenso = "" If unidades >= 1 Then unidades_extenso = conv1(unidades) 'Excepção de 11 a 19 If dezenas = 1 And unidades > 0 Then dezenas_extenso = "" unidades_extenso = conv4(unidades) num_extenso = milhares_extenso & " " & centenas_extenso If dezenas_extenso <> "" And centenas_extenso <> "" Then num_extenso = num_extenso & " e " & dezenas_extenso Else num_extenso = num_extenso & dezenas_extenso If unidades_extenso <> "" And dezenas_extenso <> "" Then num_extenso = num_extenso & " e " & unidades_extenso Else num_extenso = num_extenso & unidades_extenso If num = 0 Then num_extenso = "zero" Function conv1(valor As Integer) As String 'Conversão número-texto If valor = 0 Then conv1 = "zero" If valor = 1 Then conv1 = "um" If valor = 2 Then conv1 = "dois" Financiado pelo FSE Pág: 2
If valor = 3 Then conv1 = "três" If valor = 4 Then conv1 = "quatro" If valor = 5 Then conv1 = "cinco" If valor = 6 Then conv1 = "seis" If valor = 7 Then conv1 = "sete" If valor = 8 Then conv1 = "oito" If valor = 9 Then conv1 = "nove" Function conv2(valor As Integer) As String 'Conversão número-texto If valor = 1 Then conv2 = "cento" If valor = 2 Then conv2 = "duzentos" If valor = 3 Then conv2 = "trezentos" If valor = 4 Then conv2 = "quatrocentos" If valor = 5 Then conv2 = "quinhentos" If valor = 6 Then conv2 = "siscentos" If valor = 7 Then conv2 = "setecentos" If valor = 8 Then conv2 = "oitocentos" If valor = 9 Then conv2 = "novecentos" Function conv3(valor As Integer) As String 'Conversão número-texto If valor = 1 Then conv3 = "dez" If valor = 2 Then conv3 = "vinte" If valor = 3 Then conv3 = "trinta" If valor = 4 Then conv3 = "quarenta" If valor = 5 Then conv3 = "cinquenta" If valor = 6 Then conv3 = "sessenta" If valor = 7 Then conv3 = "setenta" If valor = 8 Then conv3 = "oitenta" If valor = 9 Then conv3 = "noventa" Function conv4(valor As Integer) As String 'Conversão número-texto If valor = 1 Then conv4 = "onze" If valor = 2 Then conv4 = "doze" If valor = 3 Then conv4 = "treze" If valor = 4 Then conv4 = "catorze" If valor = 5 Then conv4 = "quinze" If valor = 6 Then conv4 = "dezasseis" If valor = 7 Then conv4 = "dezassete" If valor = 8 Then conv4 = "dezoito" If valor = 9 Then conv4 = "dezanove" EISnt Financiado pelo FSE Pág: 3
5) Sub alineas_a_b_c() 'Resolução da alínea a 'A verificação será feita a partir da linha 2, sempre pela coluna A Dim linha_inicial As Integer linha_inicial = 2 'Variável que indica se a célula para a linha actual está ou não preenchida Dim preenchida As Boolean 'A primeira linha está preenchida (títulos) preenchida = True 'Variável que irá conter a indicação de linha da última célula preenchida Dim linha_final As Integer 'Variável que contém o número de linha actualmente a ser verificada Dim linha_actual As Integer linha_actual = linha_inicial 'Ciclo para verificar qual a última célula preenchida Do While preenchida = True 'RANGE é utilizado para referir células e/ou intervalos If Range("A" & linha_actual) <> Empty Then preenchida = True linha_actual = linha_actual + 1 Else preenchida = False Loop 'Redução de uma unidade à última linha a ser verificada linha_final = linha_actual - 1 'Variável que contém o número de registos Dim num_registos As Integer 'Redução de uma unidade à última linha preenchida (a primeira contém o título) num_registos = linha_final - 1 'Escrever na célula A1 da folha de cálculo 2 Sheet2.Range("A1") = linha_final - 1 'Resolução da alínea 2 Financiado pelo FSE Pág: 4
'De novo um ciclo... linha_actual = 2 'Uma variável para cada contagem por distrito (poder-se-ía utilizar um array) Dim lisboa As Integer Dim coimbra As Integer Dim porto As Integer lisboa = 0 coimbra = 0 porto = 0 For linha_actual = linha_inicial To linha_final Select Case Range("B" & linha_actual) Case "Lisboa" lisboa = lisboa + 1 Case "Porto" porto = porto + 1 Case "Coimbra" coimbra = coimbra + 1 End Select Dim distrito_com_mais_elementos As String 'Verificar qual o distrito que contém o maior número de elementos If lisboa >= porto And lisboa >= coimbra Then distrito_com_mais_elementos = "Lisboa" If lisboa = porto Then distrito_com_mais_elementos = "Lisboa e Porto" If lisboa = coimbra Then distrito_com_mais_elementos = "Lisboa e Coimbra" ElseIf porto >= coimbra Then distrito_com_mais_elementos = "Porto" If porto = coimbra Then distrito_com_mais_elementos = "Porto e Coimbra" Else distrito_com_mais_elementos = "Coimbra" 'Escrever na célula A2 da folha de cálculo 2 Sheet2.Range("A2") = distrito_com_mais_elementos 'Resolução da alínea 3 Dim residem_fora_de_lisboa As Integer residem_fora_de_lisboa = num_registos - lisboa 'Escrever na célula A3 da folha de cálculo 2 Sheet2.Range("A3") = residem_fora_de_lisboa 6) 'Constantes Const coluna_nome As String = "A" Const coluna_idade As String = "B" Const titulo_coluna_nome As String = "Nome" Const titulo_coluna_idade As String = "Idade" Financiado pelo FSE Pág: 5
Const linha_inicial As Integer = 2 Const linha_final As Integer = 7 Const intervalo As String = "A1:B7" 'Variáveis Auxiliares Dim nome As String Dim idade As Integer Dim id_linha As Integer 'Array do tipo Variant Dim dados(2 To 7, 1 To 2) Sub ordenar_idade() 'Utilização de dois arrays (o original e o ordenado) For id_linha = linha_inicial To linha_final nome = Range(coluna_nome & id_linha) idade = Range(coluna_idade & id_linha) dados(id_linha, 1) = nome dados(id_linha, 2) = idade 'Títulos das colunas Sheet2.Range("A1") = titulo_coluna_nome Sheet2.Range("B1") = titulo_coluna_idade 'Declaração de uma matriz que irá conter os dados ordenados Dim dados_ordenados(2 To 7, 1 To 2) pos_actual_no_array_ordenado = 2 idade_maior = 0 pos_actual_no_array_ordenado = 2 'Quando o ciclo encontra o maior escreve-o no array ordenado e apaga-o do original For num_do_teste = 2 To 7 For pos_actual_no_array_original = 2 To 7 If dados(pos_actual_no_array_original, 2) > idade_maior Then pos_maior = pos_actual_no_array_original idade_maior = dados(pos_actual_no_array_original, 2) nome_maior = dados(pos_actual_no_array_original, 1) dados_ordenados(pos_actual_no_array_ordenado, 1) = nome_maior dados_ordenados(pos_actual_no_array_ordenado, 2) = idade_maior dados(pos_maior, 2) = 0 idade_maior = 0 nome_maior = "" pos_actual_no_array_ordenado = pos_actual_no_array_ordenado + 1 'Passagem para a folha de cálculo 2 For id_linha = linha_inicial To linha_final nome = dados_ordenados(id_linha, 1) idade = dados_ordenados(id_linha, 2) Sheet2.Range(coluna_nome & id_linha) = dados_ordenados(id_linha, 1) Sheet2.Range(coluna_idade & id_linha) = dados_ordenados(id_linha, 2) Financiado pelo FSE Pág: 6
Sub ordenar_nome() 'Utilização de dois arrays (o original e o ordenado) For id_linha = linha_inicial To linha_final nome = Range(coluna_nome & id_linha) idade = Range(coluna_idade & id_linha) dados(id_linha, 1) = nome dados(id_linha, 2) = idade 'Títulos das colunas Sheet3.Range("A1") = titulo_coluna_nome Sheet3.Range("B1") = titulo_coluna_idade 'Declaração de uma matriz que irá conter os dados ordenados Dim dados_ordenados(2 To 7, 1 To 2) pos_actual_no_array_ordenado = 2 Dim nome_maior As String nome_maior = "" pos_actual_no_array_ordenado = 2 'Quando o ciclo encontra o maior escreve-o no array ordenado e apaga-o do original For num_do_teste = 2 To 7 For pos_actual_no_array_original = 2 To 7 If dados(pos_actual_no_array_original, 1) > nome_maior Then pos_maior = pos_actual_no_array_original idade_maior = dados(pos_actual_no_array_original, 2) nome_maior = dados(pos_actual_no_array_original, 1) dados_ordenados(pos_actual_no_array_ordenado, 1) = nome_maior dados_ordenados(pos_actual_no_array_ordenado, 2) = idade_maior dados(pos_maior, 1) = "" idade_maior = 0 nome_maior = "" pos_actual_no_array_ordenado = pos_actual_no_array_ordenado + 1 'Passagem para a folha de cálculo 3 linha_do_excel = 2 For id_linha = linha_final To linha_inicial Step -1 nome = dados_ordenados(id_linha, 1) idade = dados_ordenados(id_linha, 2) Sheet3.Range(coluna_nome & linha_do_excel) = dados_ordenados(id_linha, 1) Sheet3.Range(coluna_idade & linha_do_excel) = dados_ordenados(id_linha, 2) linha_do_excel = linha_do_excel + 1 Sub inserir_comentarios() 'Feito na folha 1 Financiado pelo FSE Pág: 7
For id_linha = linha_inicial To linha_final idade = Range(coluna_idade & id_linha) If idade < 30 Then Range(coluna_idade & id_linha).addcomment "Inferior a 30" Financiado pelo FSE Pág: 8