About Me

A minha foto
JRod - PORTUGAL
Microsoft [MVP] - Excel (10º ano consecutivo)
Ver o meu perfil completo
Com tecnologia do Blogger.

Seguidores

Estatisticas

Free Blog Counter

eXTReMe Tracker
2009-03-23

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”

image

b) Uma folha, denominada “Clientes”

image

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:

 

image

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:

2009-03-14

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:

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:

 

image

Ora, o peso que mais se repete na Freguesia de BUSTOS, é o 11.

image

 

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:

image

 

Cria-se o Botão de Comando, a que, no caso do exemplo, daremos o nome de VALIDAR:

image

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.

image

 

Tópicos relacionados: