Ir ao conteúdo
  • Cadastre-se

Edson Luiz Branco

Membro Pleno
  • Posts

    844
  • Cadastrado em

  • Última visita

Tópicos solucionados

  1. 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.  
     
  2. 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.  
     
  3. 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  
  4. 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  
  5. 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  
  6. 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.
  7. 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
  8. 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
  9. 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
  10. 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....
  11. 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  
  12. 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
  13. 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
  14. 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  
  15. 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  
  16. 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)  
  17. 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)
  18. 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")  
  19. 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  
  20. 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  
  21. 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
     
  22. 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
  23. 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.
  24. 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í.
  25. 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!