Ir ao conteúdo
  • Cadastre-se

TianK

Membro Pleno
  • Posts

    85
  • Cadastrado em

  • Última visita

Tudo que TianK postou

  1. Boa noite, Associe o código ao botão "Entrada": Sub cmdEntrada( oEvento ) Dim oForm as Object Dim otxtEntrada as Object oForm = oEvento.Source.Model.Parent otxtEntrada = oForm.getByName( "txtEntrada" ) oTxtEntrada.BoundField.Value = Time End Sub []s
  2. @Paulo Francisco T. Campos , Para apagar também fórmula é preciso usar oC.ClearContents( 21 ) 21 é a soma de 1 (valor) + 4 (texto) + 16 (fórmula)
  3. Olá, Tente colocando CONCATENAR() dentro de INDIRETO(): =PROCH(Plan2.B3;INDIRETO(CONCATENAR("Plan1.$B";B3;":$P";B3));0) INDIRETO() fará o Calc entender o texto concatenado como uma referência a intervalo. []s.
  4. Bem vindo! Olha, não consegui reproduzir seu problema. Quando pego um Campo formatado e defino o Código do formato para 00000-000 na propriedade Formatação, a inserção de algarismos acontece corretamente e o cep fica devidamente formatado. Deve haver alguma outra coisa atrapalhando seu formulário. É possível dar mais destalhes? Seu formulário está vinculado a um Banco de Dados? Qual é a versão do seu LibreOffice? []s. TianK
  5. Boa tarde, Isto não é bug. Teste a fórmula abaixo: =PROCV( B1;C1:D16;2;0 ) []s. TianK
  6. Bom dia, A porcentagem foi fácil de ajustar porque basta corrigir uma única linha na sub-rotina TransfValores. Ela estava recuperando a quantidade do lote ao invés do total de defeitos. De: vDefTotal = oPlan.getCellByPosition( 3+nC,nLin+1 ).Value 'Valor total dos defeitos Para: vDefTotal = oPlan.getCellByPosition( 2+nC,nLin+1 ).Value 'Valor total dos defeitos E com relação como nomear as variáveis, é uma convenção de "prefixos" muito disseminada na comunidade internacional do LibreOffice e do OpenOffice. Com o tempo me acostumei a ela e passei a adotar mais ou menos. Acho que "economiza" variáveis além de facilitar a leitura do código. Ex.: preciso armazenar o objeto célula, uso oCel, depois quero a string que está dentro da célula, uso sCel. A seguir, encontro no código uma variável iQualquerCoisa, já vou saber que se trata de um integer. Porque você não aproveita os dados da aba Filtrado. Copia eles para um outra planilha e, usando as fórmulas, extrai os 10 mais para o setor. Planilha corrigida: TianK(v4)-(corrig).zip
  7. Boa noite, Então, eu testei mais o filtro e corrigi uma falha que gerava resultados inconsistentes. O acumulado parece se comportar corretamente agora, somando os meses disponíveis para os critérios selecionados. Também incluí a chamada (call) da rotina para classificar as colunas do relatório Mês. Tomei a liberdade de renomeá-la a rotina para ClassificarRelatorioMes quanto transferi para o Módulo Painel. Agradeço pelos elogios... e principalmente pelo retorno. A cada ajuda a gente aprende mais com as necessidades de outros usuários do LibreOffice ou OpenOffice. Como da outra vez, renomeie a extensão zip para ods: TianK(v4).zip
  8. Boa tarde, Acabei me esquecendo de colocar uma linha com a chamada a sua macro ClassificarColunas2 no final da subrotina FazerRelatório. Uma linha que acho que resolve seu problema. Você quer o acumulado do(s) Critério(s) ou o acumulado Geral. Fiz o do(s) critério(s), ou seja, o critério ou critérios escolhidos no painel, mas sempre para todos os meses, também vinculado às colunas existentes do relatório do mês. Como estava sem tempo, usei a sua própria base para testes. O acumulado funcionou mas talvez tenha alguns comportamentos não desejados para um rol real de dados. Outra coisa, quantas linhas em média sua Base real poderá ter no final do ano? Isso pode ter impacto no desempenho. []s. TianK
  9. Boa tarde, Veja o que acha da minha solução. Na aba Relatório tem agora um Painel (controles de formulário) parar receber os critérios para filtragem/soma. Não sei qual o volume de dados que você irá lidar, mas com a quantidade do exemplo o funcionamento das rotinas foi bem ágil. Renomeie a extensão do arquivo de zip para ods: TianK(v3).zip
  10. Bom dia, Estava olhando seu arquivo e fiquei com algumas dúvidas. Os parâmetros da aba Informações sãos todos os critérios que você precisa? A coluna "Setor" da tabela parâmetro não é de setores, mas de critérios? Exemplo: os que possuem "Família" são, na verdade, um conjunto de setores e/ou itens (matérias-primas). []s.
  11. Bom dia, Seu tópico já tem um certo tempo. Mas se ainda estiver atrás de uma solução, por favor, poste uma planilha de exemplo, com dados fictícios, que representem os tipos de dados que você vai lidar. []s.
  12. Olá, o "modo compartilhado" está ativado? Porque por padrão o Calc não permite edições simultâneas. Se não me engando, a partir dar segunda pessoa o arquivo é aberto em "modo leitura". Você pode ir em Ferramentas - Compartilhar planilha... (ou "Compartilhar documento..." em versões anteriores) e desmarcar a caixa "Compartilhar esta planilha com outros usuários" para desativar este modo. []s. TianK
  13. @mdiego , Você já disse o que precisa fazer, ou seja, adaptar as macros que já tem. O que eu acho é que você deve importar os dados de todos os setores para uma única planilha. Ai depois, sobre os dados importados, fazer os processamentos e gerar os relatórios. []s. TianK
  14. @g.schiavinatto , boa tarde! Primeiramente um Feliz ano Novo! (atrasado) Bem, passaram as festas de final de ano, e eu esbocei alguma coisa. O usuário seleciona o intervalo e depois duas inputboxes pedem a ele que forneça a planilha (o índice) e a célula que receberá os dados únicos. Fiz alguns testes para verificar se o intervalo selecionado e a célula destino fornecidas são válidos. Claro, longe de esgotar todas as possibilidades de erro, mas imagino que as subrotinas ficaram "utilizáveis". Aguardo seu feedback sobre testes com a planilha anexa. Troque a extensão "zip" para "ods". []s. TianK extrariunicos.zip
  15. @g.schiavinatto , bom dia! Ainda não tive tempo para desenvolver outra solução. E eu pretendo fazer o mais breve possível. Porém, olhando (testando) seu código vi que a razão possível para o erro é a declaração das variáveis xi e yi como String. Veja, o retorno da função Split() é uma matriz, portanto, tem que ser do tipo Variant. Mude as linhas Dim xi as String Dim yi as String para Dim xi() as Variant Dim yi() as Variant E veja que seu código já vai funcionar para entradas nas InputBoxes como "Planilha1.A1:A8" e "Planilha2.A7". []s. TianK
  16. @g.schiavinatto , como você quer que o usuário forneça a área fonte (a extrair) e a célula destino (inicial da resposta)? Digitando as duas informações ou poderia, por exemplo, selecionar a área fonte e digitar o local de destino? []s. TianK
  17. @mdiego Boa tarde, Meu palpite é que, p. ex., "88597006" está numa coluna como número e na outra como string. Então para funcionar, é preciso alterar a linha na macro "ExtrairCompararProcSomar": If mPlano(J)(0) = mValoresUnicos(I)(0) Then por If CStr(mPlano(J)(0)) = CStr(mValoresUnicos(I)(0)) Then A função CStr() dos dois lados da igualdade "forçará" a comparação acontecer como string. Bem, para preencher as datas únicas veja este trecho: ' Extrair os valores únicos Call ExtrairUnicos( "BaseLogix.A2:A5000","Base.A2" ) Call ExtrairUnicos( "BaseLogix.H2:H5000","Base.L2" ) A segunda chamada (Call) da subrotina "ExtrairUnicos" aponta para a coluna H, onde estão as datas, e para L2, onde (a partir de) serão colocadas as datas únicas. Aqui tomei a liberdade de pegar a ideia de @g.schiavinatto para uma subrotina. O que é muito versátil e permite reutilizar o código com pouquíssimo trabalho. Espero ter esclarecido! []s. Tiank
  18. Bom dia, Abaixo está uma subrotina que preenche as colunas B:C e H:I com os resultados das suas fórmulas, chamando as funções internas do Calc, através do serviço FunctionAccess. Estas funções devem ser invocadas pelo seu nome em inglês: SUMIF (SOMASE), VLOOKUP (PROCV) e os argumentos, passados como uma matriz (função Array()). Sub ProcurarSomar() oPlanBaseHoras = ThisComponent.Sheets.getByName( "BASE HORAS" ) oPlanBaseLogix = ThisComponent.Sheets.getByName( "BaseLogix" ) oPlanBase = ThisComponent.Sheets.getByName( "Base" ) Lin1 = 0 Do Lin1 = Lin1+1 oCel = oPlanBase.getCellByPosition( 0,Lin1 ) Loop Until oCel.String = "" Lin2 = 0 Do Lin2 = Lin2+1 oCel = oPlanBase.getCellByPosition( 6,Lin2 ) Loop Until oCel.String = "" If Lin1 > Lin2 Then Lin = Lin1 Else Lin = Lin2 End If oFnA = createUnoService("com.sun.star.sheet.FunctionAccess") oIntervalo = oPlanBaseLogix.getCellRangeByName( "A2:A5001" ) oSomaIntervalo = oPlanBaseLogix.getCellRangeByName( "G2:G5001" ) oIntervaloHoras = oPlanBaseHoras.getCellRangeByName( "A1:B7" ) For I = 1 To (Lin-1) ' Colunas B e C sCriterio = oPlanBase.getCellByPosition( 0,I ).String vTotal = oFnA.callFunction( "SUMIF", Array(oIntervalo, sCriterio, oSomaIntervalo) ) oPlanBase.getCellByPosition( 1,I ).Value = vTotal vHoras = oFnA.callFunction( "VLOOKUP", Array(sCriterio,oIntervaloHoras,2,False) ) oPlanBase.getCellByPosition( 2,I ).Value = vHoras * vTotal ' Colunas H e I sCriterio2 = oPlanBase.getCellByPosition( 6,I ).String vTotal = oFnA.callFunction( "SUMIF", Array(oIntervalo, sCriterio2, oSomaIntervalo) ) oPlanBase.getCellByPosition( 7,I ).Value = vTotal vHoras = oFnA.callFunction( "VLOOKUP", Array(sCriterio2,oIntervaloHoras,2,False) ) oPlanBase.getCellByPosition( 8,I ).Value = vHoras * vTotal Next End Sub E quanto aos demais comentários no arquivo, estou juntando um .ods com o código adaptado para atender (ou pelo menos tentar) o pedido. []s. TianK mdiego1130.ods.zip
  19. @g.schiavinatto Bom dia! Dê uma olha neste link (em espanhol): Funciones personalizadas. []s.
  20. Muito bacana a sua ideia de uso. Gostei bastante! Minha sugestão, se permite, é fornecer "Planilha1.A1:A14" e "Planilha7.A1" (separados por ponto "."), exatamente da forma como são feitas as referências a planilha e intervalo, planilha e célula no Calc. A chamada ficaria: Sub MacroMaior ExtrairUnicos "Planilha1.A1:A14" , "Planilha7.A1 ' ou como gosto de usar: ' Call ExtrairUnicos( "Planilha.A1:A14","Planilha7.A1" ) End Sub E as linhas para "tratar" os parâmetros seriam: sub ExtrairUnicos (x as string, y as string) '==================================================================== Dim mCamposFiltro(0) As New com.sun.star.sheet.TableFilterField xi = Split( x,"." ) yi = Split( y,"." ) oPlan = ThisComponent.Sheets.getByName( xi(0) ) oIntervalo = oPlan.getCellRangeByName( xi(1) ) '=> esta parte permanece idêntica <= oPlan = ThisComponent.Sheets.getByName( yi(0) ) oDestino = oPlan.getCellRangeByName( yi(1) ).getCellAddress() '=> Restante permanece igual <= []s. TianK adicionado 12 minutos depois @mdiego Boa noite, Ainda não tive tempo para olhar sua planilha com calma. Mas estive pensando que talvez ajudasse, no seu caso, desativar a opção "Autocalcular". Ela faz com que o Calc processe todas as fórmulas todas as vezes que se altera uma célula na planilha. Então, desativada, os cálculos só acontecerão quando você abrir o arquivo ou pressionar F9 (recalcular) e Ctrl + F9 (recalcular todas as fórmulas). Na minha versão do LO Calc, ela fica em Dados -> Calcular -> Autocalcular. Em versões anteriores: Ferramentas -> Conteúdos da Célula -> Autocalcular. []s. TianK
  21. @mdiego , Obrigado mais uma vez pelos comentários generosos. Mas não trabalho com aulas, sou apenas um interessado em ajudar a comunidade com alguma coisa que aprendi de LibreOffice e LO Basic, enquanto aprimoro meus conhecimentos ainda mais. Olha, é possível sim, de duas formas imagino: "Emular" a função PROCV() e a SOMASE() no próprio código Basic, através de loops, testes lógicos (IF's), etc. Chamar estas funções no código através do serviço FunctionAccess e tratar os resultados. []s. TianK
  22. Boa noite, Veja se este código resolve seu caso: Sub ExtrairUnicosComparar Dim mCamposFiltro(0) As New com.sun.star.sheet.TableFilterField oPlan = ThisComponent.Sheets.getByName( "Planilha1" ) oIntervalo = oPlan.getCellRangeByName( "A2:A5000" ) 'Descritor do filtro oDescFiltro = oIntervalo.createFilterDescriptor( True ) 'Definir os campos mCamposFiltro(0).Field = 0 mCamposFiltro(0).Operator = 1 'Estabelecer o destino oDestino = oPlan.getCellRangeByName( "B2" ).getCellAddress() 'Propriedades do filtro padrão oDescFiltro.ContainsHeader = False oDescFiltro.SkipDuplicates = True oDescFiltro.CopyOutputData = True oDescFiltro.OutputPosition = oDestino oDescFiltro.FilterFields = mCamposFiltro oIntervalo.Filter( oDescFiltro ) Lin = 0 Do Lin = Lin+1 oCel = oPlan.getCellByPosition( 1,Lin ) Loop Until oCel.String = "" mValoresUnicos = oPlan.getCellRangeByName("B2:B"&Lin).getDataArray Lin = 0 Do Lin = Lin+1 oCel = oPlan.getCellByPosition( 2,Lin ) Loop Until oCel.String = "" mPlano = oPlan.getCellRangeByName("C2:C"&Lin).getDataArray L = 1 For I = 0 To Ubound(mValoresUnicos) bIgual = False For J = 0 To Ubound(mPlano) If mPlano(J)(0) = mValoresUnicos(I)(0) Then bIgual = True Exit For End If Next If Not bIgual Then oPlan.getCellByPosition( 3,L ).Value = mValoresUnicos(I)(0) L = L + 1 End If Next End Sub []s.
  23. Boa noite, Não conseguiu porque o LO Base com banco de dados HSQLDB embarcado não suporta acesso multiusuário. Na sua configuração básica, o LO Base é exclusivamente para uso monousuário e em aplicações com banco de dados pequenos. Em um cenário com rede, acesso simultâneo de dois ou mais usuários, a melhor opção é jogar as tabelas para um servidor de Banco de Dados mais parrudo, como MySQL, MariaDB, etc., e usar o LO Base como conector (Front-end). Assim, o controle de acesso, a segurança e a integridade dos dados ficará a cargo do servidor enquanto os formulários, consultas e relatórios ficará no próprio Base em um arquivo .odb. Não conheço tutoriais em português, mas neste link existem mais de 90 vídeos tutoriais (em inglês) sobre o LO Base. A partir do nº 80 ele ensina a instalar, configurar e usar o MySQL com o Base. []s.
  24. @joari carvalho Como você armazenou a macro em "Minhas Macros", penso que não existam meios de bloquear a execução da mesma apenas mantendo pressionada alguma tecla. Mas para resolver seu problema, você deverá "zerar" seu perfil de usuário do LIbreOffice. Com isso, além das configurações, as macros criadas deixarão de ser carregadas, e tudo voltará ao "padrão de fábrica". Para Zerar o seu perfil: Certifique-se que o LibreOffice esteja completamente fechado Vá a pasta C:\Users\Nome_do_seu_usuário\AppData\Roaming e altere o nome da pasta LibreOffice para BKPLibreOffice Execute o LibreOffice, que se encarregará de criar uma nova pasta LibreOffice com o "padrão de fábrica". Dica: teste as macros sempre armazenando-as no próprio arquivo e configure a segurança de macro para média (Ferramentas > Opções > LibreOffice > Segurança > Segurança de Macro...). []s. TianK
  25. Tente o atalho <Ctrl> + <Shift> + <Q> (interromper a macro). Veja a Ajuda! Onde você armazenou a macro? Em um arquivo específico ou em "Minhas Macros"? []s. TianK

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!