Blog Archive

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
2005-01-30
De acordo com os dois posts anteriores, torna-se evidente que, usando o evento Worksheet_BeforeDoubleClick, será também possível mostrar mais do que um Userform:

Se fizermos duplo clique numa das células do Range A1:A5, o resultado será:


Se fizermos duplo clique numa das células do Range B1:B5, o resultado será:


O Código:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim rng1 As Range, rng2 As Range

Set rng1 = Range("a1:a5")
Set rng2 = Range("b1:b5")

    
    If Not Intersect(Target, rng1) Is Nothing Then

        UserForm1.Show
    Else
        Cancel = True
    End If
    
    If Not Intersect(Target, rng2) Is Nothing Then

        UserForm2.Show
    Else
        Cancel = True
    End If

End Sub
2005-01-28
Se pretendermos que a visualização do UserForm seja limitado a um ou vários Ranges, então podemos inserir o seguinte Código:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim rng1 As Range, rng2 As Range

Set rng1 = Range("a1:a10")
Set rng2 = Range("b1:b10")

    
    If Not Intersect(Target, rng1) Is Nothing Then

        UserForm1.Show
    Else
        Cancel = True
    End If

    If Not Intersect(Target, rng2) Is Nothing Then

        UserForm1.Show
    Else
        Cancel = True
    End If

End Sub


Assim,ao fazer-se duplo clique em qualquer célula do(s) Range(s) indicados e só nessas células, é que o UserForm é apresentado.
2005-01-27
Se pretendermos ver um formulário (que criámos anteriormente) ao efectuarmos duplo clique numa célula de uma worksheet, acedemos ao código dessa worksheet (clicando no tabulador com a tecla direita do mouse):



e escrevemos o seguinte código:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    UserForm1.Show
    Cancel = True
End Sub


Ao fazer-se duplo clique em qualquer célula da worksheet1, o resultado será o seguinte:

2005-01-24


No exemplo, substituiu-se o algarismo 1 pelo 2
2005-01-23
Se pretendermos contar (somar) as ocorrências contidas num determinado Range ( no exemplo C1:C13) e que obedeçam a critérios estabelecidos entre duas células (no exemplo, as células A1=2 e B1=5, ou seja entre 2 e 5), já não utilizaremos a Função COUNTIF() mas a Função SUM(). Assim, podemos inserir, p. ex. em B6, a seguinte Fórmula, com a utilização de um Array (CTRL + SHIFT + ENTER):



O resultado será: 6 ocorrências entre 2 e 5 no Range C1:C13
2005-01-17
Há um novo Blog sobre Excel:
Excel Pragma
Se pretendermos contar as ocorrências contidas num determinado Range ( no exemplo C1:C13) e que obedeçam a critérios estabelecidos em certas células (no exemplo, as células A1 e B1), então podemos inserir, p. ex. em A3, a seguinte Fórmula, com a utilização de múltiplos COUNTIF() [ou CONTAR.SE()]:

=COUNTIF(C1:C13;A1)+COUNTIF(C1:C13;B1)

2005-01-15

van Gelder- Excel Resources, mostrou como se pode gerar uma superfície tridimensional, utilizando o Excel, através de funções e de um gráfico de superfície.




De cada vez que se pressiona a tecla de função F9, é gerado um novo gráfico.

O respectivo workbook pode ser baixado AQUI.
Em 14/12/2004, referi, como exemplos de cópias de conteúdos da primeira célula de um Range para a totalidade desse mesmo Range, as teclas de atalho CTRL + R (para linhas) e CTRL + D (para colunas).

Hoje, mostro uma nova tecla de atalho, que funciona para os dois casos - linhas e/ou colunas - CTRL + Enter:

1º marca-se o Range pretendido e digita-se a fórmula:



2º carrega-se nas teclas de atalho CTRL + Enter - o resultado é:

Muitas vezes, quando inserimos texto numa célula e a extensão do mesmo é maior que a largura da célula, o aspecto é o seguinte:



Uma maneira de moldar o texto, de modo a que caiba todo dentro da célula é clicar na tecla direita do rato, escolher Formatar Células, seleccionar o tabulador Alinhamento e marcar a Caixa de Verificação chamada "Moldar Texto":



O resultado é este:

2005-01-13

Quando criamos uma Caixa de Combinação dentro de um UserForm,



em vez de preencher o campo RowSource nas Propriedades da Caixa,



podemos optar pelo seu preenchimento



através de VBE.

O Código:

Private Sub UserForm_Initialize()

    ContarEntradas
    CarregarCaixa
    lblTitulo.SetFocus
End Sub

Sub CarregarCaixa()
    Dim genero(14) As String
    genero(0) = "Romance"
    genero(1) = "Policial"
    genero(2) = "Técnico"
    genero(3) = "Estudo"
    genero(4) = "Clássico"
    genero(5) = "Crónica"
    genero(6) = "História"
    genero(7) = "Informática"
    genero(8) = "Literatura"
    genero(9) = "Direito"
    genero(10) = "Economia.Gestão"
    genero(11) = "Esoterismo"
    genero(12) = "Dicionário.Enciclopédia"
    genero(13) = "Poesia"
    genero(14) = "Não Classificado"
    cboGenero.List = genero()
End Sub
2005-01-12
Se pretendermos provocar uma ocorrência sempre uma determinada célula é alterada, podemos socorre-nos do evento WorkSheet_Change().

Tomemos o seguinte exemplo:

Se se pretender que, sempre que se insira um novo valor em A1, apareça em B1 metade do valor inserido em A1, adicionado ao valor que antes estava em B1, ou seja:

1ª inserção em A1 = 36, logo, B1 deverá tomar o valor 18 (36/2)




2ª inserção em A1 = 24, logo, B1 deverá tomar o valor 30 (24/2=12 + 18)




então, o Código poderá ser o seguinte:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then
        Target.Offset(0, 1).Value = Target.Offset(0, 1).Value + Target.Value / 2
    End If
End Sub
2005-01-10

Andrew Engwirda (Andrew's Excel Tips) elaborou uma série de utilidades em add-in aberto
que pode ser baixado AQUI.





O Código:

Private Sub CommandButton1_Click() 'Botão Altera-OK

    Cells(nRow, "A") = TextBox1.Text ' As células tomam os novos dados
    Cells(nRow, "B") = TextBox2.Text
    Cells(nRow, "C") = TextBox3.Text

End Sub
2005-01-09
Em vez de utilizarmos Botões de Comando, podemos usar o SpinButton:


O resultado no Formulário é:



O Código:

Private Sub SpinButton1_SpinUp()
    nRow = nRow + 1    'Incrementa 1 linha

'mostra os dados
    TextBox1.Text = Cells(nRow, "A")
    TextBox2.Text = Cells(nRow, "B")
    TextBox3.Text = Cells(nRow, "C")
End Sub

Private Sub SpinButton1_SpinDown()
  If nRow = 2 Then    ' se a linha for a 2 (1ª linha de dados)
    Exit Sub            'já não decrementa
    Else
        nRow = nRow - 1    'Decrementa 1 linha
    End If

    'mostra os dados
    TextBox1.Text = Cells(nRow, "A")
    TextBox2.Text = Cells(nRow, "B")
    TextBox3.Text = Cells(nRow, "C")

End Sub






Código:

Public nRow As Long 'Declara a Variável como Pública,no início do Módulo
Private Sub UserForm_Initialize() ' Inicia o Form mostrando linha 2
                                  '(1ª linha de dados)

    If nRow < 2 Then
        nRow = 2
    End If

    'mostra os dados
    TextBox1.Text = Cells(nRow, "A")
    TextBox2.Text = Cells(nRow, "B")
    TextBox3.Text = Cells(nRow, "C")

End Sub


Private Sub CommandButton1_Click()    ' Botão Seguinte

    nRow = nRow + 1    'Incrementa 1 linha

'mostra os dados
    TextBox1.Text = Cells(nRow, "A")
    TextBox2.Text = Cells(nRow, "B")
    TextBox3.Text = Cells(nRow, "C")

End Sub

Private Sub CommandButton2_Click()    ' Botão Anterior
    If nRow = 2 Then    ' se a linha for a 2 (1ª linha de dados)
    Exit Sub            'já não decrementa
    Else
        nRow = nRow - 1    'Decrementa 1 linha
    End If

    'mostra os dados
    TextBox1.Text = Cells(nRow, "A")
    TextBox2.Text = Cells(nRow, "B")
    TextBox3.Text = Cells(nRow, "C")

End Sub
2005-01-08

Visto em:

VBA Visual Basic for Applications (Microsoft) Forum



O Código:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
    (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
    (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" _
    (ByVal hWnd As Long, ByVal crey As Byte, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

Private Const GWL_EXSTYLE = (-20)
Private Const WS_EX_LAYERED = &H80000
Private Const LWA_ALPHA = &H2&

Public hWnd As Long
Private Sub UserForm_Initialize()
    Dim bytOpacity As Byte
    bytOpacity = 180 ' variável que fornece o nível de opacidade. Pode ir de 0 a 255
    hWnd = FindWindow("ThunderDFrame", Me.Caption)
    Call SetWindowLong(Me.hWnd, GWL_EXSTYLE, _
    GetWindowLong(Me.hWnd, GWL_EXSTYLE) Or WS_EX_LAYERED)
    Call SetLayeredWindowAttributes(Me.hWnd, 0, bytOpacity, LWA_ALPHA)
End Sub
2005-01-07
Se criarmos uma tabela numa folha do Excel e pretendermos inseri-la num documento do Word de modo a que, sempre que haja alteração na grelha, a mesma se reflicta automaticamente no documento do Word,

1º- No Excel, marcam-se as células pretendidas e copiam-se para o clipboard [CTRL + C]

2º- No Word, no local pretendido, escolhe-se Editar>Colar Especial>Colar ligação>Como: Texto formatado (RTF) e OK:

3º- Guardam-se os dois trabalhos (folha e doc):



Agora, sempre que se altera na grelha, altera-se também no documento:

No entanto, pode usar-se mais do que oito cores, através das 56 cores da palette de escolhas de cor, utilizando o tipo [Color#],
em que # se refere a um número entre 1 e 56 da palette
(1= 1ª cor da lista - Preto; 2= 2ª cor da lista - Branco ... 56= última cor da lista - Cinzento Escuro) e utilizar-se igualmente símbolos, como seja o adicionar (+) e o subtrair (-)

Exemplo:

2005-01-06
Na formatação personalizada, podem seleccionar-se até quatro cores (das oito cores possíveis: Azul, Vermelho, Amarelo, Verde, Branco, Preto, Magenta e Turquesa).

No exemplo, seleccionaram-se as quatro primeiras(Azul para valores positivos, Vemelho para valores negativos, Amarelo para valores zero e Verde para texto):

2005-01-05
O formato nulo (;;;) oculta o conteúdo da célula A2:

Antes da formatação:



Depois da formatação:

2005-01-03
A título de exemplo, uma grelha de números e de estrelas, sendo que A1:E1 são os 5 números saídos e F1:G1, as 2 estrelas saídas:



A formatação condicional para a grelha de números, partindo do princípio que os campos a verde correspondem aos números escolhidos (no exemplo, E6 corresponderá ao nº 4, E8 ao 16, etc):




A formatação condicional para a grelha de estrelas, partindo do princípio que os campos a azul correspondem aos números escolhidos (no exemplo, C16 corresponderá ao nº 2 e E16 ao 7):

2005-01-02
Inserção de dados numa folha (no exemplo denominada "DADOS") através de um formulário:

Procedimento na folha:

Definir o nome "Dados" para a tabela (através de Insert>Name>Define), com a Referência

=OFFSET(Dados!$A$1;0;0;COUNTA(Dados!$A:$A);2)



Procedimentos para o formulário:



Procedimentos a usar:

Private Sub CommandButton1_Click() ' Refere-se ao Botão do Formulário "ADICIONA"
    Dim IntNext As Integer
'Conta as linhas preenchidas existentes na grelha e adiciona 1
    IntNext = Range("Dados").Rows.Count + 1

'Envio dos valores inseridos nos campos para a grelha
    Range("A" & IntNext) = Numero.Value
    Range("B" & IntNext) = Data.Value
    Range("C" & IntNext) = Nome.Value

'Para limpar os campos do Userform, por forma a receber novos dados
    Numero = ""
    Data = ""
    Nome = ""

' Volta a chamar o procedimento para contar o número de linhas
    Call NextNumero

'Coloca o foco no campo Data
    Data.SetFocus


End Sub


Private Sub UserForm_Initialize()
    Call NextNumero
End Sub

Private Sub NextNumero()
    Numero = Range("Dados").Rows.Count
End Sub


NOTA: As TextBox1, 2 e 3 têm que alterar o nome para: Numero,Data e Nome, respectivamente.