Escolha do MES:
EXCELer
Google



Arquivos:

-Pagina Actual-
2009-05-19

236: VBA – Nome do Tabulador baseado numa célula e vice-versa.

Se pretendermos que o tabulador de uma Worksheet obtenha o nome que colocarmos em determinada célula, podemos utilizar o seguinte código ( créditos para Juan Pablo Gonzalez ):

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Address = "$A$1" Then Sh.Name = Target
End Sub

E se pretendermos fazer exactamente o contrário, ou seja, obter numa determinada célula o nome do tabulador?

Então, aproveitando o código anterior, podemos alterá-lo para que o resultado seja o pretendido:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Range("$A$1") = Sh.Name
End Sub

2009-03-23

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”

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

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:

 

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:

2009-02-24

232: Excel - O estilo de referência R1C1 [ou L1C1]

Há dias, num grupo de discussão, foi colocada a seguinte questão:

“Nao sei porque o meu Excel 2003 apresenta as linhas e as colunas "numeradas"
com números. Quando deviam ser as colunas com letras. Como rectifico isso ?”

Logo de seguida, quem colocou a questão, deu, igualmente, a resposta:

“Ok, ja descobri.


1. Abra o Excel
2. Clique em ferramentas
3. Clique em opções
4. Na guia GERAL desmarque a opção "Estilo de referência R1C1"

 

A imagem do “problema”:

 

Era assim:

image

E passou a ficar assim:

image

Mas, depois de se ter acedido como acima foi descrito:

image

Tudo voltou ao normal…

Certo!!!

Mas, já agora, convinha dizer mais qualquer coisa acerca do chamado estilo de referência “R1C1” ou, á portuguesa, “L1C1”, em que R quer dizer “Row” ou L “Linha” e C quer dizer “Column” ou “Coluna”.

Então, o melhor é ler o que já muito se escreveu sobre este assunto.

Assim, deixo aqui uns links, para, quem tiver interesse, ter uma melhor compreensão.

2009-01-20

231: VBA - Application.Min e ActiveCell.Offset.

Há dias, fizeram-me a seguinte pergunta (adaptada):


"O que preciso quando clico no comandButton, é que me forneça o menor valor da coluna C, mas em vez de aparecer só o valor 12.2 , apareça igualmente HE 100 AA, ou seja, o conteúdo correspondente na coluna B, na mesma linha."


Exemplo:

 

image

 

Resultado pretendido:

image

 

O Código (exemplo):

Private Sub CommandButton1_Click()
    Dim oRg As Range, iMin As Variant

    Set oRg = Range("C10:C100")

    'Para encontrar o valor mínimo
    iMin = Application.Min(oRg)

    'Apresenta o valor correspondente ao valor mínimo,
    'e na célula à esquerda, o conteúdo correspondente

    With Selection

        MsgBox "Valor encontrado: " & ActiveCell.Value & vbCrLf & _
        "Valor correspondente: " & ActiveCell.Offset(0, -1).Value

    End With

End Sub

2008-12-28

230: VBA – Números de ID para controlar o CommandBar e Controlos.

Há dias, por e-mail, fizeram-me a seguinte pergunta (adaptada): "Gostaria que determinado workbook deixasse de imprimir se o valor da célula escolhida como contador, fosse igual a 3 e que a folha não pudesse ser visível com o chamado PrintPreview, nem impressa a partir do Menú Imprimir, mas apenas através do ícone de impressão".
 
O Código:
 
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Dim nVal As Integer

    If Sheets(1).Range("A22500").Value = 3 Then
        MsgBox "Não pode imprimir mais nenhuma vez!..."
        Cancel = True
        Exit Sub
    Else

        nVal = Sheets(1).Range("A22500").Value
        nVal = nVal + 1
        Sheets(1).Range("A22500").Value = nVal
        MsgBox "Só pode imprimir mais!..." & 3 - nVal
    End If
End Sub


Private Sub Workbook_Open()

    For Each Ctrl In Application.CommandBars.FindControls(ID:=109)    ' Faz o disable do ícone Print Preview
        Ctrl.Enabled = False
    Next Ctrl
    

For Each Ctrl In Application.CommandBars.FindControls(ID:=4)    ' Faz o disable no Menu Ficheiro| Imprimir.
       Ctrl.Visible = False
    Next Ctrl

End Sub


Private Sub Workbook_BeforeClose(Cancel As Boolean)

    For Each Ctrl In Application.CommandBars.FindControls(ID:=109)    ' Faz o enable do ícone Print Preview
        Ctrl.Enabled = True
    Next Ctrl
    
    For Each Ctrl In Application.CommandBars.FindControls(ID:=4)    ' Faz o enable no Menu Ficheiro| Imprimir.
        Ctrl.Enabled = True
    Next Ctrl

End Sub
 

Tópicos relacionados:

2008-12-22

Excel: Boas Festas!!!!!

Clique aqui em:

Boas festas!!! e faça o dowload do postal de boas festas!!!

 

Feliz Ano de 2009 para todos!!!

2008-11-14

229: Excel – Como modificar o número de níveis de anulações (“undo”).

Por defeito, o Excel aloca a RAM para 16 níveis de anulações ("undo"). O ajustamento do Registry pode mudar o valor por defeito, para o valor que seja especificado.


Para ver como fazer, clique: AQUI


Válido para o Excel 2000, 2002, 2003 e 2007.

2008-11-01

228: Excel - Excel 2007 Add-in: Get Started Tab for Excel 2007

Este add-in adiciona uma nova aba (Tab) na barra do Microsoft Office Excel 2007.
Os comandos nesta aba (Tab) dão-lhe acesso fácil ao conteúdo livre do Office Online que ajuda, muito rapidamente, a aprendizagem do Excel 2007.

Novo Add-In para o Excel 2007 - Clique aqui


Quem esteve aqui?