Blog Archive
-
▼
2004
(73)
-
▼
outubro
(12)
- Mover de uma célula para outra (s) com a tecla TAB...
- Apagar registos iguais numa coluna
- Limitar a visibilidade de uma ou várias folhas
- Variar a opção por defeito nas "message boxes"
- Chamar um form através de duplo clique numa célula
- Sequência de números
- Funções de Data
- Repetição de números
- Utilizar o símbolo do Euro no Excel97
- Copiar de Colunas para Linhas
- Demasiados formatos
- 1: Excel - O problema do aparecimento de: "#/DIV0!"
-
▼
outubro
(12)
About Me
Com tecnologia do Blogger.
Seguidores
Estatisticas
2004-10-31
Mover de uma célula para outra (s) com a tecla TAB ou ENTER
10:47 da tarde |
Publicada por
JRod - PORTUGAL |
Editar mensagem
Uma maneira simples de passar de uma célula para outra e depois para outra em diferentes colunas, carregando em ENTER ou TAB:
Carregar na tecla CTRL e clicar, por ex., em e4, e5, e6, f5, f7, i1, i2
Com estas células marcadas, ir a INSERIR/NOME/DEFINIR. Definir um Nome (ex. Teste). Depois aceder à Caixa de Nome e escolher TESTE. Depois carregar em ENTER ou TAB
Carregar na tecla CTRL e clicar, por ex., em e4, e5, e6, f5, f7, i1, i2
Com estas células marcadas, ir a INSERIR/NOME/DEFINIR. Definir um Nome (ex. Teste). Depois aceder à Caixa de Nome e escolher TESTE. Depois carregar em ENTER ou TAB
2004-10-30
Apagar registos iguais numa coluna
9:23 da tarde |
Publicada por
JRod - PORTUGAL |
Editar mensagem
Assumindo que os valores repetidos que queremos apagar na coluna A têm como referência o conteúdo da célula B1 (por ex. 100), pode criar-se uma macro ( atribuida a um botão de comando) que percorra o número de células da coluna A que pretendemos (por ex. da A1 à A100) e apague o conteúdo daquelas que possuam o valor 100:
Private Sub CommandButton1_Click()
Dim myRng As Range
Dim cell As Range
Dim inf As String
Set myRng = Range("A1:A100")
For Each cell in MyRng
If cell.Value = Range("B1") Then
cell.Value = ""
End If
Next
End Sub
Private Sub CommandButton1_Click()
Dim myRng As Range
Dim cell As Range
Dim inf As String
Set myRng = Range("A1:A100")
For Each cell in MyRng
If cell.Value = Range("B1") Then
cell.Value = ""
End If
Next
End Sub
Limitar a visibilidade de uma ou várias folhas
9:12 da tarde |
Publicada por
JRod - PORTUGAL |
Editar mensagem
Por vezes, pretendemos que só se consiga percorrer as células que se encontram visíveis ( por ex. da A1 até à Q35) nas várias folhas.
O método mais eficaz é criarmos um módulo, de maneira a que, logo que se abra o ficheiro, as folhas fiquem "congeladas" na área pretendida:
Sub Auto_Open()
Dim ws As WorkSheet
For Each ws in WorkSheets
ws.ScrollArea = "A1:Q35"
Next ws
End Sub
O método mais eficaz é criarmos um módulo, de maneira a que, logo que se abra o ficheiro, as folhas fiquem "congeladas" na área pretendida:
Sub Auto_Open()
Dim ws As WorkSheet
For Each ws in WorkSheets
ws.ScrollArea = "A1:Q35"
Next ws
End Sub
2004-10-29
Variar a opção por defeito nas "message boxes"
5:01 da tarde |
Publicada por
JRod - PORTUGAL |
Editar mensagem
Nas "message boxes", o foco encontra-se, por defeito, no botão "SIM". Ora, se pretendermos mudar o foco para "NÃO" ou para "CANCELAR", então temos que recorrer a um expediente do VBA.
Exemplo:
Sub TesteMsg()
MsgBox "Tem a certeza? (Foco no SIM)", vbDefaultButton1 + vbYesNoCancel, "Opção por Defeito"
MsgBox "Tem a certeza? (Foco no NÃO)", vbDefaultButton2 + vbYesNoCancel, "Opção por Defeito"
MsgBox "Tem a certeza? (Foco no CANCELAR)", vbDefaultButton3 + vbYesNoCancel, "Opção por Defeito"
End Sub
Exemplo:
Sub TesteMsg()
MsgBox "Tem a certeza? (Foco no SIM)", vbDefaultButton1 + vbYesNoCancel, "Opção por Defeito"
MsgBox "Tem a certeza? (Foco no NÃO)", vbDefaultButton2 + vbYesNoCancel, "Opção por Defeito"
MsgBox "Tem a certeza? (Foco no CANCELAR)", vbDefaultButton3 + vbYesNoCancel, "Opção por Defeito"
End Sub
2004-10-28
Chamar um form através de duplo clique numa célula
10:38 da tarde |
Publicada por
JRod - PORTUGAL |
Editar mensagem
Para aparecer um form, fazendo um duplo clique numa qualquer célula, abre-se o editor de VBA e cria-se a seguinte macro:
Private Sub WorkSheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
frmMyForm.Show //nome do formulário
Cancel = True
End Sub
Private Sub WorkSheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
frmMyForm.Show //nome do formulário
Cancel = True
End Sub
2004-10-24
Sequência de números
6:18 da tarde |
Publicada por
JRod - PORTUGAL |
Editar mensagem
Um pequeno procedimento que podemos adicionar a um botão de comando para criarmos uma sequência numérica, como, por exemplo, 1,2,3,4,5,6,7, etc.:
Sub Sequencia() Dim x, y, z, a, b x = InputBox(Prompt:="Digite a célula") y = InputBox(Prompt:="Digite a célula") a = InputBox(Prompt:="Digite o primeiro nº") b = "" & x & "" z = "" & x & ":" & y & "" Range(b).Select Range(b) = a Selection.AutoFill Destination:=Range(z), Type:=xlFillSeries Range(z).Select Selection.Font.Bold = True Range(b).Select End Sub |
Funções de Data
5:52 da tarde |
Publicada por
JRod - PORTUGAL |
Editar mensagem
Assumindo que em A1 temos a Função =TODAY(), aparece-nos na célula o dia de hoje, ou seja, 24-10-2004.
Ora, se quisermos que em A2 apareça 25-10-2004, então a fórmula será uma combinação de funções de data:
= DATE(YEAR(A1);MONTH(A1);DAY(A1)+1)
Se pretendermos que, por exemplo em B1 apareça o mês seguinte (24-11-2004):
= DATE(YEAR(A1);MONTH(A1)+1;DAY(A1))
Se, por último, que, por exemplo, em C1 apareça o ano seguinte (24-10-2005):
= DATE(YEAR($A$1)+1;MONTH($A$1);DAY($A$1))
Ora, se quisermos que em A2 apareça 25-10-2004, então a fórmula será uma combinação de funções de data:
= DATE(YEAR(A1);MONTH(A1);DAY(A1)+1)
Se pretendermos que, por exemplo em B1 apareça o mês seguinte (24-11-2004):
= DATE(YEAR(A1);MONTH(A1)+1;DAY(A1))
Se, por último, que, por exemplo, em C1 apareça o ano seguinte (24-10-2005):
= DATE(YEAR($A$1)+1;MONTH($A$1);DAY($A$1))
Repetição de números
3:35 da manhã |
Publicada por
JRod - PORTUGAL |
Editar mensagem
Por vezes, queremos saber qual o número que mais se repete numa dada coluna:
Por exemplo:
Col. A
5
2
4
5
1
7
5
Como vemos, o número que mais se repete nesta coluna é o 5! Então qual será a formula que nos indica que o número 5 é o mais repetido na coluna?
Assumindo que queremos a resposta na célula B1, inserimos nesta a seguinte fórmula:
=MODE(A1:A7)
Agora, queremos saber quantas vezes o número 5 se repete. Assumindo que queremos a resposta em C1 e utilizando o resultado obtido em B1, a fórmula será:
=COUNTIF(A1:A7;B1) -- A resposta será: 3
Por exemplo:
Col. A
5
2
4
5
1
7
5
Como vemos, o número que mais se repete nesta coluna é o 5! Então qual será a formula que nos indica que o número 5 é o mais repetido na coluna?
Assumindo que queremos a resposta na célula B1, inserimos nesta a seguinte fórmula:
=MODE(A1:A7)
Agora, queremos saber quantas vezes o número 5 se repete. Assumindo que queremos a resposta em C1 e utilizando o resultado obtido em B1, a fórmula será:
=COUNTIF(A1:A7;B1) -- A resposta será: 3
2004-10-23
Utilizar o símbolo do Euro no Excel97
8:52 da tarde |
Publicada por
JRod - PORTUGAL |
Editar mensagem
Pode-se utilizar o símbolo do Euro quando se formata uma célula para o tipo de moeda no Excel97. Para isso, basta alterar o estilo da formatação.
O número de código para o euro é 0128.
Cria-se apenas o estilo (Formatar/Célula/Categoria - Personalizada - No Tipo escolhe-se o "$".
Então, edita-se, suprime-se o $ e introduz ? (ponto de interrogação). Para introduzir o ?, mantém-se carregada a tecla ALT e incorpora-se 0128 no keypad (no numérico à direita do teclado -- não os números que estão acima das teclas da letra, claro).
Copiar de Colunas para Linhas
8:25 da tarde |
Publicada por
JRod - PORTUGAL |
Editar mensagem
Para copiar colunas de uma folha do Excel e colar numa outra como se fossem linhas:
Há, pelo menos, duas possibilidades:
1ª - Criar uma macro. Exemplo:
Sub ColToRow()
Sheets("Sheet1").Select
Range("A1:A11").Select
Selection.Copy
Sheets("Sheet2").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone,SkipBlanks:= _
False, Transpose:=True
End Sub
2ª- Na própria folha:
Na Sheet1, seleccionar a coluna que se quer copiar. No ToolBar ir a Edit/Copy
Ir para a Sheet2. Selecionar a linha (ex- linha 1). No ToolBar ir a Edit/Paste Special e clica-se em Transpose.
Et Voilá. Mas atenção que a coluna não pode ter mais do que 256 células.
Há, pelo menos, duas possibilidades:
1ª - Criar uma macro. Exemplo:
Sub ColToRow()
Sheets("Sheet1").Select
Range("A1:A11").Select
Selection.Copy
Sheets("Sheet2").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone,SkipBlanks:= _
False, Transpose:=True
End Sub
2ª- Na própria folha:
Na Sheet1, seleccionar a coluna que se quer copiar. No ToolBar ir a Edit/Copy
Ir para a Sheet2. Selecionar a linha (ex- linha 1). No ToolBar ir a Edit/Paste Special e clica-se em Transpose.
Et Voilá. Mas atenção que a coluna não pode ter mais do que 256 células.
Demasiados formatos
8:11 da tarde |
Publicada por
JRod - PORTUGAL |
Editar mensagem
Tanto quanto sei, o limite de formatos no Excel, pouco ultrapassará os 200.
E os formatos customizados (pessoais), mesmo que já não funcionem, têm a
tendência para se manterem.
Pode experimentar-se um procedimento de VBA, elaborado por Leo Heuser, que
limpa os formatos que não são utilizados:
Sub DeleteUnusedCustomNumberFormats()
Dim Buffer As Object
Dim Sh As Object
Dim SaveFormat As Variant
Dim fFormat As Variant
Dim nFormat() As Variant
Dim xFormat As Long
Dim incr As Long
Dim incr1 As Long
Dim incr2 As Long
Dim StartRow As Long
Dim EndRow As Long
Dim Dummy As Variant
Dim pPresent As Boolean
Dim NumberOfFormats As Long
Dim Answer
Dim c As Object
Dim DataStart As Long
Dim DataEnd As Long
Dim AnswerTxt As String
NumberOfFormats = 1000
ReDim nFormat(0 To NumberOfFormats)
AnswerTxt = "Do you want to delete unused formats from this book?"
AnswerTxt = AnswerTxt & Chr(10) & _
"To get a list of used and unused formats only, choose No."
Answer = MsgBox(AnswerTxt, 259)
If Answer = vbCancel Then GoTo Finito
On Error GoTo Finito
Worksheets.Add.Move after:=Worksheets(Worksheets.Count)
Worksheets(Worksheets.Count).Name = "CustomFormats"
Worksheets("CustomFormats").Activate
Set Buffer = Range("A2")
Buffer.Select
nFormat(0) = Buffer.NumberFormatLocal
incr = 1
Do
SaveFormat = Buffer.NumberFormatLocal
Dummy = Buffer.NumberFormatLocal
DoEvents
SendKeys "{tab 3}{down}{enter}"
Application.Dialogs(xlDialogFormatNumber).Show Dummy
nFormat(incr) = Buffer.NumberFormatLocal
incr = incr + 1
Loop Until nFormat(incr - 1) = SaveFormat
ReDim Preserve nFormat(0 To incr - 2)
Range("A1").Value = "Custom formats"
Range("B1").Value = "Formats used in workbook"
Range("C1").Value = "Formats not used"
Range("A1:C1").Font.Bold = True
StartRow = 3
EndRow = 16384
For incr = 0 To UBound(nFormat)
Cells(StartRow, 1).Offset(incr, 0).NumberFormatLocal = _
nFormat(incr)
Cells(StartRow, 1).Offset(incr, 0).Value = nFormat(incr)
Next incr
incr = 0
For Each Sh In ActiveWorkbook.Worksheets
If Sh.Name = "CustomFormats" Then Exit For
For Each c In Sh.UsedRange.Cells
fFormat = c.NumberFormatLocal
If Application.WorksheetFunction.CountIf( _
Range(Cells(StartRow, 2), Cells(EndRow, 2)), fFormat) = 0 Then
Cells(StartRow, 2).Offset(incr, 0).NumberFormatLocal = fFormat
Cells(StartRow, 2).Offset(incr, 0).Value = fFormat
incr = incr + 1
End If
Next c
Next Sh
xFormat = Range(Cells(StartRow, 2), Cells(EndRow, 2)). _
Find("").Row - 2
incr2 = 0
For incr = 0 To UBound(nFormat)
pPresent = False
For incr1 = 1 To xFormat
If nFormat(incr) = Cells(StartRow, 2).Offset( _
incr1, 0).NumberFormatLocal Then
pPresent = True
End If
Next incr1
If pPresent = False Then
Cells(StartRow, 3).Offset(incr2, 0). _
NumberFormatLocal = nFormat(incr)
Cells(StartRow, 3).Offset(incr2, 0).Value = nFormat(incr)
incr2 = incr2 + 1
End If
Next incr
With ActiveSheet.Columns("A:C")
.AutoFit
.HorizontalAlignment = xlLeft
End With
If Answer = vbYes Then
DataStart = Range(Cells(1, 3), Cells(EndRow, 3)).Find("").Row + 1
DataEnd = Cells(DataStart, 3).Resize(EndRow, 1).Find("").Row - 1
On Error Resume Next
For Each c In Range(Cells(DataStart, 3), Cells(DataEnd, 3)).Cells
ActiveWorkbook.DeleteNumberFormat (c.NumberFormat)
Next c
End If
Finito:
Set c = Nothing
Set Sh = Nothing
Set Buffer = Nothing
End Sub
E os formatos customizados (pessoais), mesmo que já não funcionem, têm a
tendência para se manterem.
Pode experimentar-se um procedimento de VBA, elaborado por Leo Heuser, que
limpa os formatos que não são utilizados:
Sub DeleteUnusedCustomNumberFormats()
Dim Buffer As Object
Dim Sh As Object
Dim SaveFormat As Variant
Dim fFormat As Variant
Dim nFormat() As Variant
Dim xFormat As Long
Dim incr As Long
Dim incr1 As Long
Dim incr2 As Long
Dim StartRow As Long
Dim EndRow As Long
Dim Dummy As Variant
Dim pPresent As Boolean
Dim NumberOfFormats As Long
Dim Answer
Dim c As Object
Dim DataStart As Long
Dim DataEnd As Long
Dim AnswerTxt As String
NumberOfFormats = 1000
ReDim nFormat(0 To NumberOfFormats)
AnswerTxt = "Do you want to delete unused formats from this book?"
AnswerTxt = AnswerTxt & Chr(10) & _
"To get a list of used and unused formats only, choose No."
Answer = MsgBox(AnswerTxt, 259)
If Answer = vbCancel Then GoTo Finito
On Error GoTo Finito
Worksheets.Add.Move after:=Worksheets(Worksheets.Count)
Worksheets(Worksheets.Count).Name = "CustomFormats"
Worksheets("CustomFormats").Activate
Set Buffer = Range("A2")
Buffer.Select
nFormat(0) = Buffer.NumberFormatLocal
incr = 1
Do
SaveFormat = Buffer.NumberFormatLocal
Dummy = Buffer.NumberFormatLocal
DoEvents
SendKeys "{tab 3}{down}{enter}"
Application.Dialogs(xlDialogFormatNumber).Show Dummy
nFormat(incr) = Buffer.NumberFormatLocal
incr = incr + 1
Loop Until nFormat(incr - 1) = SaveFormat
ReDim Preserve nFormat(0 To incr - 2)
Range("A1").Value = "Custom formats"
Range("B1").Value = "Formats used in workbook"
Range("C1").Value = "Formats not used"
Range("A1:C1").Font.Bold = True
StartRow = 3
EndRow = 16384
For incr = 0 To UBound(nFormat)
Cells(StartRow, 1).Offset(incr, 0).NumberFormatLocal = _
nFormat(incr)
Cells(StartRow, 1).Offset(incr, 0).Value = nFormat(incr)
Next incr
incr = 0
For Each Sh In ActiveWorkbook.Worksheets
If Sh.Name = "CustomFormats" Then Exit For
For Each c In Sh.UsedRange.Cells
fFormat = c.NumberFormatLocal
If Application.WorksheetFunction.CountIf( _
Range(Cells(StartRow, 2), Cells(EndRow, 2)), fFormat) = 0 Then
Cells(StartRow, 2).Offset(incr, 0).NumberFormatLocal = fFormat
Cells(StartRow, 2).Offset(incr, 0).Value = fFormat
incr = incr + 1
End If
Next c
Next Sh
xFormat = Range(Cells(StartRow, 2), Cells(EndRow, 2)). _
Find("").Row - 2
incr2 = 0
For incr = 0 To UBound(nFormat)
pPresent = False
For incr1 = 1 To xFormat
If nFormat(incr) = Cells(StartRow, 2).Offset( _
incr1, 0).NumberFormatLocal Then
pPresent = True
End If
Next incr1
If pPresent = False Then
Cells(StartRow, 3).Offset(incr2, 0). _
NumberFormatLocal = nFormat(incr)
Cells(StartRow, 3).Offset(incr2, 0).Value = nFormat(incr)
incr2 = incr2 + 1
End If
Next incr
With ActiveSheet.Columns("A:C")
.AutoFit
.HorizontalAlignment = xlLeft
End With
If Answer = vbYes Then
DataStart = Range(Cells(1, 3), Cells(EndRow, 3)).Find("").Row + 1
DataEnd = Cells(DataStart, 3).Resize(EndRow, 1).Find("").Row - 1
On Error Resume Next
For Each c In Range(Cells(DataStart, 3), Cells(DataEnd, 3)).Cells
ActiveWorkbook.DeleteNumberFormat (c.NumberFormat)
Next c
End If
Finito:
Set c = Nothing
Set Sh = Nothing
Set Buffer = Nothing
End Sub
1: Excel - O problema do aparecimento de: "#/DIV0!"
8:08 da tarde |
Publicada por
JRod - PORTUGAL |
Editar mensagem
Às vezes, no EXCEL, quando se pretende efectuar uma divisão, o dividendo é menor que o divisor, ou a célula que funciona como dividendo, porque fazendo parte de uma fórmula, encontra-se vazio. Neste caso, aparecerá na célula do resultado aquela mensagem abominável que todos nós conhecemos:"#/DIV0!".
Bom, há, pelo menos, duas maneiras de resolver o problema:
1- Utilizando uma fórmula na célula do resultado:
Ex - assumindo que a célula do resultado é C1, que a célula do dividendo é A1 e que a célula do divisor é B1, teremos:
=IF(ISERR(A1/B1);"";A1/B1)
ou em português:
=SE(É.ERRO(A1/B1);"";A1/B1)
2- Utilizando o VBA:
Ex:
Assumindo que a coluna de resultados é a coluna C (no exemplo o range
será C1:C40, mas pode ser o que se quiser), teremos:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Newrange As Range
Set Newrange = Range("C1:C40")
For Each Cell In Newrange
If IsError(Cell.Value) Then
Cell.Value = ""
End If
Next Cell
End Sub
Bom, há, pelo menos, duas maneiras de resolver o problema:
1- Utilizando uma fórmula na célula do resultado:
Ex - assumindo que a célula do resultado é C1, que a célula do dividendo é A1 e que a célula do divisor é B1, teremos:
=IF(ISERR(A1/B1);"";A1/B1)
ou em português:
=SE(É.ERRO(A1/B1);"";A1/B1)
2- Utilizando o VBA:
Ex:
Assumindo que a coluna de resultados é a coluna C (no exemplo o range
será C1:C40, mas pode ser o que se quiser), teremos:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Newrange As Range
Set Newrange = Range("C1:C40")
For Each Cell In Newrange
If IsError(Cell.Value) Then
Cell.Value = ""
End If
Next Cell
End Sub
Subscrever:
Mensagens (Atom)