-
Posts
844 -
Cadastrado em
-
Última visita
Tópicos solucionados
-
O post de Edson Luiz Branco em Condição para liberação de celula foi marcado como solução
Bem vinda ao fórum, @Gesiane Diniz !
Se entendi direito, A1 tem que ter número e além disso tem que ser maior que zero para que você possa alimentar alguma coisa em C1, correto? Isso vale também para C2 em relação a A2, etc. Se for isso, use uma regra de Validação de Dados:
Em sua planilha, selecione a célula C2 Guia Dados > grupo Ferramentas de Dados > Validação de Dados Na caixa de diálogo que abre, na guia Configurações, sob Permitir escolha Personalizado Sob Fórmula, digite: =E(ÉNÚM($A2);$A2>0) Na mesma janela, agora na aba Alerta de erro, preencha se quiser informar ao usuário quando entrar com dado inválido: Marque a opção Mostrar alerta de erro após a inserção de dados inválidos Sob Estilo, escolha Parar Em Título, dê um título para a popup que abrirá na tela ao errar. Digamos "Entrada Inválida" Sob Mensagem de erro, digite algo que informe o porquê do erro. Digamos "O Valor da Coluna A deve ser um número maior que zero". Dê OK Agora copie a célula C2 para a área de transferência e cole somente a validação para as demais células: Selecione o intervalo C3 até C5 Clique com o botão direito sobre a seleção e escolha Colar Especial e escolha a opção Validação.
-
O post de Edson Luiz Branco em Condição para liberação de celula foi marcado como solução
Bem vinda ao fórum, @Gesiane Diniz !
Se entendi direito, A1 tem que ter número e além disso tem que ser maior que zero para que você possa alimentar alguma coisa em C1, correto? Isso vale também para C2 em relação a A2, etc. Se for isso, use uma regra de Validação de Dados:
Em sua planilha, selecione a célula C2 Guia Dados > grupo Ferramentas de Dados > Validação de Dados Na caixa de diálogo que abre, na guia Configurações, sob Permitir escolha Personalizado Sob Fórmula, digite: =E(ÉNÚM($A2);$A2>0) Na mesma janela, agora na aba Alerta de erro, preencha se quiser informar ao usuário quando entrar com dado inválido: Marque a opção Mostrar alerta de erro após a inserção de dados inválidos Sob Estilo, escolha Parar Em Título, dê um título para a popup que abrirá na tela ao errar. Digamos "Entrada Inválida" Sob Mensagem de erro, digite algo que informe o porquê do erro. Digamos "O Valor da Coluna A deve ser um número maior que zero". Dê OK Agora copie a célula C2 para a área de transferência e cole somente a validação para as demais células: Selecione o intervalo C3 até C5 Clique com o botão direito sobre a seleção e escolha Colar Especial e escolha a opção Validação.
-
O post de Edson Luiz Branco em Impedir duplicidade no cadastro excel vba foi marcado como solução
A função Val que você está usando é muito limitada e não consegue transformar, por exemplo, a string "111.111.111-11" da TextBox no número puro 11111111111 conforme conteúdo real da célula (Range.Value) da sua planilha. Você teria que antes eliminar o ponto e o hífen do texto com Replace.
Entretanto, a meu ver, o mais simples nesse caso seria comparar a TextBox com o conteúdo da célula como está formatado usando a propriedade Range.Text ao invés de Range.Value, eliminando também a função Val. Ficaria assim:
If Cells(lin, 5).Text = TextBoxCPF.Value Then 'verificar duplicidade cpf
_________________
Uma dica: você poderia reduzir significativamente seu código se ao invés de usar referência de intervalos aproveitar - já que seus dados estão em uma tabela - as referências de tabela. Por exemplo, o trecho de nomes duplicados poderia ficar simplesmente assim:
... If Application.CountIf([Tabela_CADASTRO[NOME]], Me.TextBoxNOME.Value) > 0 Then MsgBox "Este nome já está cadastrado", vbInformation, "Cadastro já existente!" Exit Sub End If
-
O post de Edson Luiz Branco em Impedir duplicidade no cadastro excel vba foi marcado como solução
A função Val que você está usando é muito limitada e não consegue transformar, por exemplo, a string "111.111.111-11" da TextBox no número puro 11111111111 conforme conteúdo real da célula (Range.Value) da sua planilha. Você teria que antes eliminar o ponto e o hífen do texto com Replace.
Entretanto, a meu ver, o mais simples nesse caso seria comparar a TextBox com o conteúdo da célula como está formatado usando a propriedade Range.Text ao invés de Range.Value, eliminando também a função Val. Ficaria assim:
If Cells(lin, 5).Text = TextBoxCPF.Value Then 'verificar duplicidade cpf
_________________
Uma dica: você poderia reduzir significativamente seu código se ao invés de usar referência de intervalos aproveitar - já que seus dados estão em uma tabela - as referências de tabela. Por exemplo, o trecho de nomes duplicados poderia ficar simplesmente assim:
... If Application.CountIf([Tabela_CADASTRO[NOME]], Me.TextBoxNOME.Value) > 0 Then MsgBox "Este nome já está cadastrado", vbInformation, "Cadastro já existente!" Exit Sub End If
-
O post de Edson Luiz Branco em Impedir duplicidade no cadastro excel vba foi marcado como solução
A função Val que você está usando é muito limitada e não consegue transformar, por exemplo, a string "111.111.111-11" da TextBox no número puro 11111111111 conforme conteúdo real da célula (Range.Value) da sua planilha. Você teria que antes eliminar o ponto e o hífen do texto com Replace.
Entretanto, a meu ver, o mais simples nesse caso seria comparar a TextBox com o conteúdo da célula como está formatado usando a propriedade Range.Text ao invés de Range.Value, eliminando também a função Val. Ficaria assim:
If Cells(lin, 5).Text = TextBoxCPF.Value Then 'verificar duplicidade cpf
_________________
Uma dica: você poderia reduzir significativamente seu código se ao invés de usar referência de intervalos aproveitar - já que seus dados estão em uma tabela - as referências de tabela. Por exemplo, o trecho de nomes duplicados poderia ficar simplesmente assim:
... If Application.CountIf([Tabela_CADASTRO[NOME]], Me.TextBoxNOME.Value) > 0 Then MsgBox "Este nome já está cadastrado", vbInformation, "Cadastro já existente!" Exit Sub End If
-
O post de Edson Luiz Branco em Escrever xlDown -1 VBA foi marcado como solução
Bom dia, @Jefferson TS
Quando você usa a expressão "tabela", você está se referindo a um objeto tabela mesmo (no VBA = ListObject) ou a um simples intervalo de células? Caso seja uma tabela, poderia usar:
Sub EliminaÚltimaLinhaDados() With ActiveSheet.ListObjects(1) If Not .DataBodyRange Is Nothing Then .ListRows(.ListRows.Count).Range.Delete xlShiftUp End With End Sub
Se for baseado em intervalo, como pelo jeito você já encontrou a última linha que é a dos totais (usou .End(xlDown)), pode usar o Offset com o valor negativo (.End(xlDown).Offset(-1,0)) para se referir à linha imediatamente anterior à dos totais.
-
O post de Edson Luiz Branco em Cálculo de horas no excel utilizando horas úteis foi marcado como solução
Bom dia, @luizaclopes
Considerando por enquanto somente o problema da coluna F (first things first) :
O problema parece estar acontecendo quando a data inicial (col B) cai num final de semana ou feriado e entre essa data e a final (col D) o número de dias cheios trabalhados é zero, o que retornaria na avaliação final da fórmula um valor negativo para a quantidade de minutos, por isso o erro ocorre. Não entendi o porquê dos registros com ID 92, 93 e 181, 182, 183 e 184 pela sua fórmula terem retornado estes valores:
Pelo meu entendimento do problema deveriam retornar:
Ou então não compreendi a mecânica do problema.
Se meu entendimento está ok, veja no anexo as alterações que propus para suas fórmulas e teste nas situações reais se resolve o problema.
Cálculo de horas.xls
-
O post de Edson Luiz Branco em Cálculo de horas no excel utilizando horas úteis foi marcado como solução
Bom dia, @luizaclopes
Considerando por enquanto somente o problema da coluna F (first things first) :
O problema parece estar acontecendo quando a data inicial (col B) cai num final de semana ou feriado e entre essa data e a final (col D) o número de dias cheios trabalhados é zero, o que retornaria na avaliação final da fórmula um valor negativo para a quantidade de minutos, por isso o erro ocorre. Não entendi o porquê dos registros com ID 92, 93 e 181, 182, 183 e 184 pela sua fórmula terem retornado estes valores:
Pelo meu entendimento do problema deveriam retornar:
Ou então não compreendi a mecânica do problema.
Se meu entendimento está ok, veja no anexo as alterações que propus para suas fórmulas e teste nas situações reais se resolve o problema.
Cálculo de horas.xls
-
O post de Edson Luiz Branco em Cálculo de horas no excel utilizando horas úteis foi marcado como solução
Bom dia, @luizaclopes
Considerando por enquanto somente o problema da coluna F (first things first) :
O problema parece estar acontecendo quando a data inicial (col B) cai num final de semana ou feriado e entre essa data e a final (col D) o número de dias cheios trabalhados é zero, o que retornaria na avaliação final da fórmula um valor negativo para a quantidade de minutos, por isso o erro ocorre. Não entendi o porquê dos registros com ID 92, 93 e 181, 182, 183 e 184 pela sua fórmula terem retornado estes valores:
Pelo meu entendimento do problema deveriam retornar:
Ou então não compreendi a mecânica do problema.
Se meu entendimento está ok, veja no anexo as alterações que propus para suas fórmulas e teste nas situações reais se resolve o problema.
Cálculo de horas.xls
-
O post de Edson Luiz Branco em Erro de tempo de execução '91' ao verificar se Textbox está preenchida foi marcado como solução
@BiaMidori, pra analisar erro fica complicado quando o código é passado incompleto. Mas pelo fragmento que você postou, provavelmente deve ter acontecido de o método Find não ter encontrado o texto procurado. Então ao invés de um Range retorna Nothing, e Nothing não tem propriedade Row.
Nesse caso sempre teste se o objeto não está vazio antes de prosseguir:
Set tblFornecedor3 = Planilha2.Range("FORNECEDOR").Find(what:=e, lookat:=xlPart)
If Not tblFornecedor3 Is Nothing Then
If e = Planilha2.Cells(tblFornecedor3.Row, 4).Value Then
...
...
End If
End If
Outra hipótese numa passada rápida de olhos sobre seu código é que você pode não ter fechado o primeiro If Then/Else com o End If correspondente ou o With com o End With... Enfim....
-
O post de Edson Luiz Branco em Erro em tempo de execução '91' foi marcado como solução
Isso ocorre porque quando a ActiveCell não está numa tabela ActiveCell.ListObject retornará não uma tabela mas sim o valor Nothing.
E Nothing logicamente não possui a propriedade ListColumns(1) e derivados, por isso o erro ocorre.
Certifique-se antes de que ActiveCell está mesmo numa das tabelas e somente então se, além disso, também está na coluna 1 de uma delas.
Há várias formas de se fazer isso: você pode primeiro testar se ActiveCell.ListObject retorna de fato uma tabela e não Nothing ou alternativamente se a tabela é o objeto ativo. Nesse caso ficaria:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) With ActiveSheet.DTPicker1 .Height = 20 .Width = 70 .Visible = False If Not ActiveCell.ListObject Is Nothing Then 'Alternativamente: If ListObjects(1).Active Or ListObjects(2).Active Or ListObjects(3).Active Then If Not Intersect(Target, ActiveCell.ListObject.ListColumns(1).DataBodyRange) Is Nothing Then .Top = Target.Top .Left = Target.Offset(0, 1).Left .LinkedCell = Target.Address .Visible = True End If End If End With End Sub
Outra maneira seria definir um range como sendo a união de todos as colunas de data das 3 tabelas e checar a intersecção de Target com esse intervalo:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim rgColsDatas As Range Set rgColsDatas = Union(Me.ListObjects(1).ListColumns(1).DataBodyRange, _ Me.ListObjects(2).ListColumns(1).DataBodyRange, _ Me.ListObjects(3).ListColumns(1).DataBodyRange) With ActiveSheet.DTPicker1 .Height = 20 .Width = 70 .Visible = False If Not Intersect(Target, rgColsDatas) Is Nothing Then .Top = Target.Top .Left = Target.Offset(0, 1).Left .LinkedCell = Target.Address .Visible = True End If End With End Sub
-
O post de Edson Luiz Branco em Fórmula para previsão de perdas foi marcado como solução
Acho que você tava com pressa (ou com fome) quando digitou a fórmula, hehehe. Veja que você comeu vários elementos: depois de SOMARPRODUTO tem um SE( antes de CONT.NÚM e antes da constante matricial tem um ponto-e-vírgula (entre o número 100 e o "{" ).
Melhor seria ter copiado e colado a fórmula na barra de fórmulas.
Segue o anexo original com a fórmula na coluna K.
Projeto de Provisionamento de Perdas (alterado=EdsonBR).xlsx
-
O post de Edson Luiz Branco em Lista Suspensa em tabela do Word foi marcado como solução
Boa tarde, @Smeagle_17
Estando em uma Tabela, você pode usar o Controle de Conteúdo Seção de Repetição para essa finalidade:
Crie a primeira linha da tabela e insira o Controle de Conteúdo Caixa de Combinação com as opções desejadas Selecione a linha inteira da tabela e defina-a como uma Seção de Repetição e está pronto. Para usar, ainda sem ter preenchido as outras células da linha, clique com o cursor em qualquer lugar em uma das células e escolha o sinal de adição azul ao final da linha, parte inferior que uma nova linha repetirá o controle.
Exemplo anexo.
EdsonBR - Lista Suspensa CC Combo com Seção de Repetição.docx
-
O post de Edson Luiz Branco em Adaptar código VBA de planilha com relatório de fotos foi marcado como solução
Bem vindo ao fórum, @Diego1559
Provavelmente seu tópico ficou sem respostas até o momento por ter faltado anexar um modelo em Excel junto com sua dúvida.
Alterei seu código eliminando algumas partes e acrescentando outras. Teste em seu modelo e nos dê retorno, ok?:
Sub Carregar_Pares_Imagens() Dim Pict As Variant, ImgFileFormat As String, rgMescladas As Range, i As Long ImgFileFormat = "Image Files JPEG (*.jpeg),*.jpeg,Image Files JPG (*.jpg),*.jpg, Image Files PNG (*.png),*.jpg, Image Files GIF (*.gif),*.gif, Image Files BMP (*.bmp),*.bmp" Pict = Application.GetOpenFilename(ImgFileFormat, False, False, False, True) If IsArray(Pict) Then If UBound(Pict) > 6 Then MsgBox "Selecionar apenas 6 imagens" Exit Sub End If For i = 1 To UBound(Pict) Set rgMescladas = ActiveSheet.Cells(RowIndex:=Array(8, 29, 49)((i - 1) \ 2), _ ColumnIndex:=Array("A", "E")((i - 1) Mod 2)) If rgMescladas.MergeCells Then Set rgMescladas = rgMescladas.MergeArea rgMescladas.Worksheet.Shapes.AddPicture Filename:=Pict(i), _ LinkToFile:=msoFalse, _ SaveWithDocument:=msoTrue, _ Left:=rgMescladas.Left, _ Top:=rgMescladas.Top, _ Width:=rgMescladas.Width, _ Height:=rgMescladas.Height Next i End If End Sub
-
O post de Edson Luiz Branco em Unir dois comandos no VBA foi marcado como solução
Boa tarde!
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If (Target.Address = "$B$44" Or Target.Address = "$B$49") And Target.Value = 0 Then Target.EntireRow.Resize(4).Offset(1).Hidden = True End If End Sub
-
O post de Edson Luiz Branco em Índice e Corresp avançado foi marcado como solução
Olá, @Max Sacramento
A coluna "MISTER" não seria necessária pra essa finalidade. você pode basear a busca passando diretamente para a função CORRESP a concatenação da coluna "MASTER" com a do nome das empresas "MASTRE". Na célula C1 insira a fórmula matricial (CTRL SHIFT ENTER) abaixo depois arraste:
=ÍNDICE('2'!$A$4:$D$27;CORRESP(A4&D4;'2'!$A$4:$A$27&'2'!$D$4:$D$27;0);3)
-
O post de Edson Luiz Branco em Substituir o conteúdo das células nos dias de terças, quintas e sábados. foi marcado como solução
Sem problemas, @GENECIOFICIAL
Para efeito apenas de teste, você também pode fazê-lo um ou mais dias antes ou depois da data atual, acrescentando ou subtraindo um número de dias (inteiro) ao argumento da função Weekday.
Por exemplo, para anteontem: Weekday(Date - 2)
Para amanhã: Weekday(Date + 1)
-
O post de Edson Luiz Branco em fórmula com lógica para compra foi marcado como solução
fórmula em d2 depois arraste:
=se(cont.se(a$2:a2;a2)>1;"recorrente";"novo")
-
O post de Edson Luiz Branco em célula sempre maiúscula no Excel foi marcado como solução
Boa tarde, @Francisco Moala
Da forma como você deseja só é possível através do VBA. Supondo que a célula em questão seja a A1, clique com o botão direito na guia da planilha, escolha Exibir Código e cole o seguinte código:
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Me.[A1], Target) Is Nothing Then Application.EnableEvents = False Me.[A1].Value = UCase(Me.[A1].Value) Application.EnableEvents = True End If End Sub
-
O post de Edson Luiz Branco em Macro não permite que utilize o filtro foi marcado como solução
Bem vindo ao fórum Office do Clube do Hardware, @Eduardo Fernandes Brandão
Defina a permissão para usar filtro com True para a planilha ao protegê-la novamente:
ActiveSheet.Protect "123abc", AllowFiltering:=True
_____________________________________________________
Se me permite, uma sugestão: como seus dados estão num objeto tabela (ListObject para o VBA), utilize fórmulas com Referência Estruturada ao invés de Referências Relativas/Absolutas.
Então, ao invés de:
=SE(K5="";"";SE(SE(L5="";K5;M5)=HOJE();"VENCE HOJE"; SE(SE(L5="";K5;M5)<HOJE();"ATRASADO"; SE(L5="";K5;M5)-HOJE()&" DIA(S) PARA VENCER")))
Transforme para linguagem de tabela:
=SE([@FINAL]="";""; SE(SE([@INICIAL2]="";[@FINAL];[@FINAL3])=HOJE();"VENCE HOJE"; SE(SE([@INICIAL2]="";[@FINAL];[@FINAL3])<HOJE();"ATRASADO"; SE([@INICIAL2]="";[@FINAL];[@FINAL3])-HOJE()&" DIA(S) PARA VENCER")))
Além de ser a forma mais correta de usar fórmulas quando se trata de tabelas, a inserção de novas linhas pelo VBA fica facilitada pois dispõe de um método específico que já aplica corretamente a fórmula às colunas onde for pertinente, inclusive com a formatação zebrada. A linha oculta onde você mantém a fórmula pra ser copiada/colada pode ser então eliminada, pois não é mais necessária.
Seu código para o botão "Adicionar Linha" ficaria então assim:
Sub Copiar2() ActiveSheet.Unprotect "123abc" ActiveSheet.ListObjects("Tabela1").ListRows.Add ActiveSheet.Protect Password:="123abc", AllowFiltering:=True End Sub
-
O post de Edson Luiz Branco em VBA_Cadastrar Diretório Salvamento Arquivos foi marcado como solução
Boa noite, @guicrissantos
Nesse caso, você pode retornar diretamente o caminho em que sua pasta de trabalho Excel está através da propriedade ThisWorkbook.Path e usá-la, sem precisar ficar informando ao iniciar. Ex.:
Sub ExportarHorasNormais() ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _ Filename:=ThisWorkbook.Path & "\" & Range("B31") & "_" & Format(Now, "yyyymmdd_hhmmss"), _ Quality:=xlQualityStandard, _ IncludeDocProperties:=True, _ IgnorePrintAreas:=False, _ OpenAfterPublish:=False MsgBox "Relatório de APONTAMENTO DE HORAS salvo com sucesso!", vbOKOnly End Sub
-
O post de Edson Luiz Branco em Segmentação de dados bugada - tabela dinamica foi marcado como solução
Além dos passos que descrevi anteriormente para a TD, em cada Slicer altere o seguinte: botão direito sobre cada um deles; escolha "Configurações da Segmentação de Dados..." e no lado direito em baixo escolha "Ocultar itens sem dados". Atualize a TD/Segmentação de Dados.
Planilha_segmentação_dados_erro.xlsx
-
O post de Edson Luiz Branco em Excel-Comparar conteúdo célula anterior e copiar foi marcado como solução
Boa noite e bem vindo ao fórum do Clube do Hardware, @Lito8581
Manualmente:
Selecione o intervalo todo B2:B24...; Tecle F5 > botão Especial ...(Ir Para Especial) ou vá na guia Página Inicial > grupo Edição, clique no botão Localizar e Selecionar e escolha Ir Para Especial... > e escolha a opção "Em branco"; Na célula que ficou ativa (B4), digite a fórmula = B3 (que é a célula acima); Não finalize com ENTER, mas com CTRL ENTER e está feito. Para eliminar as fórmulas que agora não serão mais necessárias, copie todo o intervalo para a Área de Transferência e cole em cima dele mesmo com a opção Colar Especial... > Colar Valores; Opcionalmente você poderia usar uma coluna ao lado, por exemplo "C" e em C3 poderia usar a fórmula =SE(B3="";B2;B3) e arrastar p/ baixo.
Depois é só copiar e colar valores sobrepondo-os à coluna B. Feito isso é só eliminar a coluna "C" pois já não é mais necessária.
-
O post de Edson Luiz Branco em Data de pagamento definida pela data de recebimento foi marcado como solução
em e4 depois arraste:
=se(e(d4>=data(ano(d4);mês(d4);21);d4<=(fimmês(d4;0)+20));fimmês(d4;1)+5;fimmês(d4;0)+5)
teste, depois dê retorno, ok?
Obs.: o robô do Clube do Hardware arbitrariamente tem convertido o que escrevemos em maiúsculas, como as fórmulas do Excel, tudo pra minúsculas. Uma pena. Vai desculpando aí.
-
O post de Edson Luiz Branco em alterar código vba de busca foi marcado como solução
Boa noite, @deejaywesley
Naquele trecho, substitua por:
... If Not Intervalo Is Nothing Then Application.Goto .Worksheet.Cells(Intervalo.Row, "J"), True End If ...
Ou:
... If Not Intervalo Is Nothing Then .Worksheet.Cells(Intervalo.Row, "J").Select End If ...
Sobre o Clube do Hardware
No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais
Direitos autorais
Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais