About Me
Seguidores
Estatisticas
235: VBA – Copy.Before, WorkSheets.Count, Application.DisplayAlerts & For… Next
Há dias, num grupo de discussão de Excel, foi colocada a seguinte questão (adaptada):
“
Pressupostos:
- Tenho uma folha de cálculo "Clientes" com uma lista de clientes;
- Tenho uma folha de cálculo "Modelo" que é um modelo;
Problema:
- preciso criar folhas de cálculo iguais à folha "Modelo", mas com os nomes constantes da lista de clientes da folha "Clientes".
Alguém me pode ajudar?”
Tomemos o seguinte exemplo ilustrativo:
O que temos:
a) Uma folha, denominada “Modelo”
b) Uma folha, denominada “Clientes”
O que pretendemos, será ter tantas folhas, quantos os nomes que se encontram na folha Clientes, com o nome de cada um deles no tabulador, mas com o conteúdo da folha “mestra” - “Modelo”.
Para uma melhor ilustração, suponhamos que dos 18 nomes, apenas pretendemos obter 6 folhas (de A1:A6), ou seja, de “Manuel a Jorge”. Então, o resultado seria:
Ou seja, todas as 6 folhas, criadas e já renomedas com os nomes pretendidos, teriam como conteúdo, o conteúdo da folha “Modelo”.
O Código, que executaremos em primeiro lugar e que dará para criar o número de folhas pretendido:
Private Sub Copia_Modelo()
Dim sNum As Integer
On Error Resume Next
sNum = InputBox("Quantos Clientes?")
For i = sNum To 1 Step -1
Sheets("Modelo").Select
Sheets("Modelo").Copy Before:=Sheets(1)
Next
Sheets("Clientes").Select
End Sub
Agora o código que executaremos em 2º lugar e que renomeará as folhas criadas anteriormente, com os nomes correspondentes ao número de clientes que estabelecemos com o Código anterior:
Private Sub Renomear_Folhas()
On Error Resume Next
For i = 1 To Worksheets.Count - 2
Sheets(i).Name = Worksheets("Clientes").Cells(i, 1).Value
Next i
End Sub
Por último, o Código que, por uma questão de comodidade, dá para apagar todas as folhas anteriormente criadas e renomeadas, ficando sempre e só, as folhas “Modelo” e “Clientes”:
Sub Delete_Sheets()
Dim sNum As Integer
On Error Resume Next
Application.DisplayAlerts = False
sNum = Worksheets.Count - 2
For i = sNum To 1 Step -1
Sheets(1).Select
Sheets(1).Delete
Next
Application.DisplayAlerts = True
Sheets("Modelo").Select
End Sub
Nota final: As folhas “Modelo” e “Clientes”, deverão ficar sempre na sequência em que se encontram no exemplo, ou seja, as duas últimas, à direita.
Tópicos relacionados:
234: Ainda sobre o título anterior (216). Função É.ERRO()
A pergunta original, continha algo diferente, ou seja, dependia o resultado com base na junção de 2 critérios: freguesia e sexo:
“Gostaria de saber qual a fórmula para calcular o valor do peso do sexo masculino da freguesia de Bustos que mais se repete”.
Neste caso e para o resultado desejado, então o Código, poderia ser assim, tomando como células de controlo as células G2 (sexo) e H2 (Freguesia), como no exemplo do post anterior:
'----------------------------------------------------------
' Procedure : Validar_Click
' DateTime : 14-03-2009 18:51
' Author : Jorge Rodrigues
' Purpose : Atribuir valores no Range L1:L20 retirados
' : do Range D8:D17, a que correspondam,
' : no Range C8:C17, o nome da Freguesia em H2
' : e Sexo (M/F) em G2
'----------------------------------------------------------
'
Private Sub Validar_Click()
Dim spRange As Range
Dim cell As Range
Dim nome As Variant
Dim nome1 As Variant
Dim nome2 As Variant
Dim number As Integer
number = 0
nome = Range("H2").Value
nome1 = Range("G2").Value
nome2 = nome & nome1
Range("L1:L20").ClearContents
Set spRange = Range("C8:C17")
For Each cell In spRange
number = number + 1
If cell & cell.Offset(0, -1) = nome2 Then
Range("L" & number).Value = cell.Offset(0, 1)
End If
Next cell
End Sub
Já agora e para não aparecer, porventura, aquela sigla indesejável (#N/D), em I2, caso não exista qualquer repetição de valor, de acordo com os dois critérios, então a fórmula naquela célula, poderia ser assim:
=SE(É.ERRO(MODA(L1:L20));"";MODA(L1:L20))
Tópicos relacionados:
233: Excel & VBA: MODA() e OFFSET()
Há dias, colocaram-me, por e-mail, a seguinte questão (adaptada), que, igualmente foi posta num grupo de discussão:
“Gostaria de saber qual a fórmula para mostrar o valor do peso da freguesia de Bustos que mais se repete (função estatistica Moda() [ing. Mode()])?
Exemplo:
Nome Sexo Freguesia Peso
A F OIÃ 12
B M BUSTOS 11
C F OIÃ 12
D M BUSTOS 11
E F OIÃ 13
F M BUSTOS 14
G F OIÃ 15
H M BUSTOS 16
I F OIÃ 17
J M BUSTOS 18”
Teríamos, então, como resposta para BUSTOS, o valor 11.
Ilustrando o exemplo:
Ora, o peso que mais se repete na Freguesia de BUSTOS, é o 11.
O que se pretende, assim, é coligir, em primeiro lugar, todos os valores de peso a que corresponda a Freguesia BUSTOS, ou seja:
11, 11, 14, 16, 18.
Podemos, então, escolher como fonte, onde serão colocados tais valores, o Range L1:L20.
Assim, em I2, colocaremos a seguinte fórmula, utilizando a função MODA():
=MODA(L1:L20)
Resta-nos, agora, criar o código, para colocar, dentro desse Range – L1:L20, os valores que tenham correspondência com a Freguesia pretendida, no caso do exemplo, BUSTOS, o que daria os seguintes dados:
Cria-se o Botão de Comando, a que, no caso do exemplo, daremos o nome de VALIDAR:
E, se seguida, atribuiremos a esse Botão de Comando - VALIDAR, o seguinte Código:
'----------------------------------------------------------
' Procedure : Validar_Click
' DateTime : 14-03-2009 18:51
' Author : Jorge Rodrigues
' Purpose : Atribuir valores no Range L1:L20 retirados
' : do Range D8:D17, a que correspondam,
' : no Range C8:C17, ao nome da Freguesia BUSTOS
'----------------------------------------------------------
'
Private Sub Validar_Click()
Dim spRange As Range
Dim cell As Range
Dim nome As Variant
Dim number As Integer
number = 1
nome = Range("H2").Value
Range("L1:L20").ClearContents
Set spRange = Range("C8:C17")
For Each cell In spRange
number = number + 1
If cell = nome Then
Range("L" & number).Value = cell.Offset(0, 1)
End If
Next cell
End Sub
De notar que, como atribuímos para identificar o nome da Freguesia, a célula H2, então, com a simples modificação do conteúdo desta célula, para, por exemplo, OIÃ, que se encontra na tabela acima ficaríamos a saber, igualmente, o valor de peso que mais se repete nesta Freguesia, que seria o valor 12.
Tópicos relacionados: