Ir ao conteúdo
  • Cadastre-se

TianK

Membro Pleno
  • Posts

    85
  • Cadastrado em

  • Última visita

Tudo que TianK postou

  1. Olá, Desconheço como se faz no Word, mas no LibreOffice você tem as opções: Inserir as tabelas menores dentro de uma tabela grande. Você cria uma tabela com 3 colunas e 4 linhas e, então, vai em cada célula e insere uma tabela menor. Inserir um quadro (moldura) indo em "Inserir > Quadro > Quadro..." (Libreoffice 5.1.5.2). Esse quadro aceita que você insira uma tabela dentro e confere a elas a capacidade de flutuar no texto. Então, você pode desenhar quantos quadros quiser e colocar as tabelas que precisar dentro, e então rearranjar na página. []s. TianK
  2. Qual critério/fórmula você utilizou e que acabou gerando este resultado? Você poderia postar sua planilha aqui no tópico? Seria bem mais fácil conseguir ajuda. []s. TianK
  3. Boa noite, Desculpe, não ficou muito claro que você quer. Há nomes no intervalo D3:D43 e você quer impedir que sejam inseridos nomes repetidos no mesmo intervalo ou em outro? Msgbox? você quer uma macro? []s. TianK
  4. @mdiego , bom dia! Observei que as células mescladas deslocam os dados para colunas alternadas: uma com dado, outra sem. Por isso, as linhas abaixo precisam ser alteradas: As linhas que obtém a matriz de dados através do método getDataArray: mTurno1 = oArqPlan.getCellRangeByName( "D19:J26" ).getDataArray() mTurno2 = oArqPlan.getCellRangeByName( "D38:J45" ).getDataArray() As linhas que inserem os dados da matiz mTurno1 na planilha oPlan1.getCellByPosition( 0,ULin).Value = vData oPlan1.getCellByPosition( 1,ULin).Value = mTurno1(A)(0) oPlan1.getCellByPosition( 2,ULin).Value = mTurno1(A)(2) oPlan1.getCellByPosition( 3,ULin).Value = mTurno1(A)(4) oPlan1.getCellByPosition( 4,ULin).String = mTurno1(A)(6) As linhas que inserem os dados da matriz mTurno2 na planilha: oPlan1.getCellByPosition( 0,ULin).Value = vData oPlan1.getCellByPosition( 1,ULin).Value = mTurno2(A)(0) oPlan1.getCellByPosition( 2,ULin).Value = mTurno2(A)(2) oPlan1.getCellByPosition( 3,ULin).Value = mTurno2(A)(4) oPlan1.getCellByPosition( 4,ULin).String = mTurno2(A)(6) ... Estudo e empirismo. A API UNO é bem confusa de entender sem ler sobre ela. Até indiquei neste poste um livro em português que ajuda muito neste ponto. Mas, o grosso de informação eu extraio dos fóruns em inglês e do livro de Andrew Pitonyak (www.pitonyak.org). []s. TianK
  5. @mdiego , boa noite! Primeiramente desculpe a demora para responder, mas semana passada realmente o serviço apertou. Pelo que entendi da estrutura dos seus relatórios e da planilha de "consolidação", cheguei a esta macro (anexo abaixo). Por favor, veja se lhe atende e dê um retorno. Código que faz a importação dos relatórios: Sub ImportarRelatorios ' Informe o número do mês e ' o caminho completo para os relatórios sMes = "06" ' <<< Nº do Mês sCaminho = "C:\Users\diego\Desktop\Maquina\CLP" '<<< Caminho completo ' Carregar a Planilha1 oDoc = ThisComponent oPlan1 = oDoc.Sheets.getByName( "Planilha1" ) ' Definir as propriedades para abrir o relatório Dim PropArq(0) As New com.sun.star.beans.PropertyValue PropArq(0).Name = "Hidden" PropArq(0).Value = True ' Iniciar a barra de status BarraStatus = oDoc.CurrentController.StatusIndicator BarraStatus.reset ' Loop pelos relatórios do mês For J = 1 To 31 sNomeRel = Right("0"&J,2) & " " & Right("0"&sMes,2) & " 2016.ods" sUrlRelatorio = convertToURL( sCaminho & "\" & sNomeRel ) ' Verificar se o relatório existe If FileExists( sUrlRelatorio ) Then ' Barra de Status: Indicar qual relatório será processado BarraStatus.start( "Importando... [ " & sNomeRel & " ]",10) ' Abrir o relatório de forma oculta oArq = StarDesktop.loadComponentFromURL( sUrlRelatorio,"_blank",0,PropArq() ) ' Barra de Status: Indicar o progresso BarraStatus.setValue(10) ' Obter os dados do relatório oArqPlan = oArq.Sheets.getByName( "Planilha1" ) vData = oArqPlan.getCellRangeByName( "B1" ).Value mTurno1 = oArqPlan.getCellRangeByName( "A12:D22" ).getDataArray() mTurno2 = oArqPlan.getCellRangeByName( "A32:D42" ).getDataArray() ' Fechar o relatório oArq.Close( -1 ) ' Preencher a planilha BDDADOSMES ULin = ULinha( oPlan1 ) A = 0 Do oPlan1.getCellByPosition( 0,ULin).Value = vData oPlan1.getCellByPosition( 1,ULin).Value = mTurno1(A)(0) oPlan1.getCellByPosition( 2,ULin).Value = mTurno1(A)(1) oPlan1.getCellByPosition( 3,ULin).Value = mTurno1(A)(2) oPlan1.getCellByPosition( 4,ULin).String = mTurno1(A)(3) ULin = ULin+1 A = A + 1 Loop Until mTurno1(A)(3) = "" ULin = ULinha( oPlan1 ) A = 0 Do oPlan1.getCellByPosition( 0,ULin).Value = vData oPlan1.getCellByPosition( 1,ULin).Value = mTurno2(A)(0) oPlan1.getCellByPosition( 2,ULin).Value = mTurno2(A)(1) oPlan1.getCellByPosition( 3,ULin).Value = mTurno2(A)(2) oPlan1.getCellByPosition( 4,ULin).String = mTurno2(A)(3) ULin = ULin+1 A = A + 1 Loop Until mTurno2(A)(3) = "" End If Next ' Restaurar a barra de status BarraStatus.End MsgBox "Concluído!" End Sub ' Função para identificar a última linha preenchida ' da Planilha Function ULinha(oPlanilha as Object) as Integer ' Carregar biblioteca de apoio "Tools" ' do LibreOffice GlobalScope.BasicLibraries.LoadLibrary("Tools") ULinha = GetLastUsedRow(oPlanilha) + 1 End Function []s. TianK BDDADOSMES (MACRO).ods.zip
  6. @mdiego , É possível sim criar a macro que imagina. Mas para ajudá-lo, é preciso que você disponibilize duas planilhas de exemplo: uma dos relatórios que serão salvos ao longo do mês, e outra que receberá os dados. []s. TianK
  7. @1234fd, a dica de @Willer Reis não funcionou para você? É o método mais direto para a planilha eletrônica entender que você não quer inserir um número ou uma fórmula, mas sim um texto. Qual é a versão do seu LibreOffice?
  8. Bom dia, No caso, o comum é usar o método CurrentSelection juntamente com um teste para verificar se a seleção é uma célula individual: Sub Main oDoc = ThisComponent oCel = oDoc.CurrentSelection If oCel.ImplementationName <> "ScCellObj" Then MsgBox "Por favor, selecione uma única célula." Exit Sub End If vCel = oCel.Value sCel = oCel.String MsgBox "Valor: " & vCel & Chr(10) & "Texto: " & sCel End Sub Em todo caso, se precisar realmente de um comportamento mais parecido ao do ActiveCell do VBA, então pode usar a função abaixo em seu código: Function getActiveCell() Dim as1(), lSheet&,lCol&,lRow$, sDum as String,bErr as Boolean oView = ThisComponent.CurrentController as1() = Split(oView.ViewData, ";") lSheet = CLng(as1(1)) sDum = as1(lSheet +3) as1() = Split(sDum, "/") on error goto errSlash lCol = CLng(as1(0)) lRow = CLng(as1(1)) on error goto 0 getActiveCell = oView.Model.getSheets.getByIndex(lSheet).getcellByPosition(lCol,lRow) exit Function errSlash: if NOT(bErr) then bErr = True as1() = Split(sDum, "+") resume endif End Function Um exemplo de como usar a função acima: Sub Main2 oCel = getActiveCell vCel = oCel.Value sCel = oCel.String MsgBox "Valor: " & vCel & Chr(10) & "Texto: " & sCel End Sub []s. TianK
  9. Boa tarde, Substitua a linha: Formula = "=$Nomes.A" & n+2 & "&/"/ - "/&/" & "$Nomes.B" & n+2 por: Formula = "=$Nomes.A" & n+2 & " & "" - "" & " & "$Nomes.B" & n+2 No LibreOffice Basic quando você quer inserir as aspas (") dentro de uma string é preciso colocá-las em pares (""). []s. TianK
  10. Boa tarde, Você precisa usar a Validação de Dados (Dados > Validação). No link tem um passo a passo para uma situação bastante similar a sua: Como criar listas (combobox) no calc Outro link que pode te ajudar: http://camilaoliveira.net/blog/2015/02/02/libreoffice-validacao/ []s. TianK
  11. Boa tarde, Por esse trecho, meu palpite é um problema com o procedimento copiar/colar. O indicado é usar o "Colar Especial" para inserir os dados em um rol de células com formatação condicional. Caso contrário a formatação, que vem com as linhas coladas, irá se sobrepor a da formatação condicional. Você pode ir em Editar -> Colar Especial... ou combinar ctrl+shift+v. Então, desmarque a caixa "Formatos". Se este não for o seu problema, poste uma planilha de exemplo, com alguns dados e com a formatação condicional. []s. TianK
  12. @daniellopes2006 , é um prazer ajudar, então a mim você não deve nada... talvez "deva" ao fórum a sinalização de que o tópico foi resolvido. @k_dantas , Abaixo segue a planilha com o código alterado. Veja se é isso que procura. Tabela de Atualização Monetária v2macro.ods
  13. Façamos o seguinte: você disponibiliza um arquivo de exemplo, com dados com a formatação e o resultado desejado, como fizeram os outros, e eu vejo o que pode ser feito quanto a adaptar o código. Alterar a cor de fundo da célula selecionada para amarelo é tranquilo, agora "voltar a cor normal" dependerá de como você está pensando em formatar as células. A linguagem que estamos usando neste tópico é chamada LibreOffice Basic ou OpenOffice Basic (Se estiver usando o Apache OpenOffice). Ela é derivada da linguagem Basic, preservando desta as principais características: tipos de dados, sintaxe, funções internas, operadores, comandos, etc. Mas é possível programar macros com outras linguagens: Python, JavaScript, Java e BeanShell. Quanto a outra questão, desconheço outro método de se alterar o fundo da célula selecionada. Esse erro diz que o LibreOffice tentou chamar a macro "Main", mas a mesma não existe no módulo "Module1" na biblioteca "Standard". Para contornar o erro é preciso que você refaça os passos que indiquei na minha primeira resposta, certificando-se de seguir a ordem: (a) colar o código no módulo (após criá-lo) e (b) atribuir o evento de planilha "Seleção alterada" a macro "MudarFundo". []s. TianK
  14. @LENIO , Segue a planilha com alterações no código. Obs.: Código alterado e testado no LibreOffice 5.1.2.2. []s. TianK PLANILHA-v2.ods
  15. @LENIO, Não recebi sua planilha. Talvez fosse mais interessante você alterar os dados, editar sua postagem e inserir o arquivo. Assim mais pessoas poderiam dar uma olhada. []s. TianK
  16. @daniellopes2006, Se o arquivo é novo, é preciso criar um módulo dentro da biblioteca padrão (standard) do mesmo para receber o código: No menu "Ferramentas" vá em "Macros" > "Organizador de Macros" > "LibreOffice Basic..." No Diálogo que surgir, selecione o nome do arquivo em "Macro de" e depois o botão "Novo" Será sugerido "Module1". Renomeei ou deixe como está. Será aberta a IDE do LibreOffice Basic. Especificamente para o que você quer, é necessário atribuir o código ao evento "Seleção alterada" da planilha: Aba da Planilha > "Eventos de Planilha..." > Evento "Seleção Alterada" > Botão "Macro" Em Biblioteca navegue até o "Module1" do arquivo e selecione a macro. Sempre que uma nova célula for alterada, o Calc disparará a rotina. Minha sugestão de código: ' Variáveis globais Global gCol, gLin Sub MudarFundo( oEv ) ' Atribuir ao Evento de Planilha: Seleção alterada On Error GoTo SairErro If Not isEmpty(gCol) Then Call LimparFundoSelecaoAntiga End If oCol = oEv.Columns.getByIndex(0) oLin = oEv.Rows.getByIndex(0) oCol.CellBackColor = RGB( 255,255,0 ) oLin.CellBackColor = RGB( 255,255,0 ) gCol = oCol gLin = oLin SairErro: End Sub Sub LimparFundoSelecaoAntiga gCol.setPropertyToDefault("CellBackColor") gLin.setPropertyToDefault("CellBackColor") End Sub []s. TianK Exemplo_com_macro.ods
  17. Boa noite, A versão 3.5.x.y é muito obsoleta. Além disso, se me recordo bem nela existia um bug relacionado a espessura das linhas de bordas no Calc. você aumenta a espessura e nada... No seu lugar, eu verificaria a possibilidade de atualizar o LibreOffice para a versão 5.0.5 (atual e estável). []s TianK
  18. Boa noite, Para facilitar, você poderia disponibilizar uma planilha (aquivo .ods) com dados de exemplo e o resultado esperado. []s TianK
  19. Mari, boa tarde Se eu entendi corretamente, você deseja apagar o conteúdo das células desprotegidas. Então, uma macro construída usando a API Basic do LibreOffice ficaria assim: Sub Limpar ' Primeira planilha no momento (mais a esquerda) oPlan = ThisComponent.Sheets.getByIndex( 0 ) ' Intervalo oI = oPlan.getCellRangeByName( "C44:D45" ) ' Endereço/limites do intervalo oE = oI.getRangeAddress ' Loop nas células do Intervalo For nL = oE.StartRow to oE.EndRow For nC = oE.StartColumn To oE.EndColumn oC = oPlan.getCellByPosition( nC,nL ) ' Verifica se a célula está desprotegida If NOT oC.CellProtection.IsLocked Then ' 5 apaga conteúdo valor e texto da célula oC.ClearContents( 5 ) End If Next Next End Sub Abrs. Tiank
  20. Bom dia, Pensei numa solução um pouquinho diferente da de @g.schiavinatto. A macro será executada apenas se determinado valor estiver na célula (no caso o valor 1). Assim, se a célula estiver vazia ou com outro valor, a macro não rodará. Então, você deverá modificar sua macro para ter a seguinte estrutura: Sub Macro_Executar_AoAbrir() ' Começar com um teste para ver se a macro ' já foi executada. A função "Ja_Executou" ' se encarrega de fazer a verificação. ' Ao retornar "True" a macro é encerrada aqui If Ja_Executou Then Exit Sub ' Seu código normal ' Chamar a rotina que marcará a macro como ' excecutada, ou melhor, apagará o valor ' da célula A1048576 Call Marcar_como_Executada End Sub A seguir estão a função "Ja_Executou" e a rotina "Marcar_como_Executada": Function Ja_Executou As Boolean ' Planilha que está no momento na primeira posição oPlan = ThisComponent.Sheets.getByIndex( 0 ) ' Última célula da coluna A: A1048576 oCel = oPlan.getCellByPosition( 0,1048575 ) ' Se o valor de A1048576 for zero a macro já foi executada If oCel.Value = 0 Then Ja_Executou = 1 Else Ja_Executou = 0 End If End Function Sub Marcar_como_Executada ' Planilha que está no momento na primeira posição oPlan = ThisComponent.Sheets.getByIndex( 0 ) ' Última célula da coluna A: A1048576 oCel = oPlan.getCellByPosition( 0,1048575 ) ' Apagar os valores de A1048576 oCel.ClearContents( 1 ) End Sub E para não ter que colocar o valor 1 na célula A1048576 manualmente, rode a macro: Sub Definir_Executar ' Planilha que está no momento na primeira posição oPlan = ThisComponent.Sheets.getByIndex( 0 ) ' Última célula da coluna A: A1048576 oCel = oPlan.getCellByPosition( 0,1048575 ) oCel.Value = 1 End Sub []s. TianK
  21. Olá, Não estou muito familiarizado com a API (VBA) do PowerPoint, por isso não entendi o que seu código faz. Você poderia dar mais detalhes? Outra coisa, BrOffice é mega desatualizado. O indicado é usar o seu sucessor LibreOffice ou até mesmo o OpenOffice da Apache. []s. TianK.
  22. Bom dia, O que exatamente você deseja? É possível dar mais detalhes? Pela sua descrição inicial imaginei que a mala direta atenderia muito bem. []s. TianK
  23. @f.bernardino, bom dia! Você pode inserir campos no Writer a partir da planilha do Calc, através do menu Inserir > Campos > Outros... Neste link existe uma explicação mais detalhada com imagens. []s TianK
  24. @Ely_ems, boa tarde! Sua dúvida está aqui já um tempinho, então não sei se você encontrou alguma resposta. Mas, vou deixar aqui uma solução que cheguei, para quem estiver precisando. Primeiramente reescrevi a macro usando a API UNO do LibreOffice/OpenOffice: REM ***** BASIC *****Sub Planilha1_Conteudo_Alterado( oCelAlterada )' Evento de Planilha: Conteúdo alteradoDim oPlan as ObjectDim Lin as Long, Col as Long ' Sair se a alteração detectada não for em uma célula individual If oCelAlterada.ImplementationName <> "ScCellObj" Then Exit Sub Lin = oCelAlterada.CellAddress.Row Col = oCelAlterada.CellAddress.Column oPlan = oCelAlterada.getSpreadsheet If Col = 0 And Lin > 0 Then If oCelAlterada.String <> "" Then oPlan.getCellByPosition( 1,Lin ).String = Format( Now(), "DD/MM/YYYY" ) End If End IfEnd Sub Em seguida, clicando com o botão direito do mouse sobre a aba da planilha, acessei "Eventos de planilha...". Atribui a macro que estava em "Module1" ao Evento "Conteúdo alterado". Em meus testes no LibreOffice 4.4.4.3, tudo funcionou como o desejado. []s. TianK OOF-DataFixada-V2.ods.rar
  25. @Jessica Carvalho_522319, Uma fórmula pronta para isso acredito não exista. A solução para o caso seria apenas através de macro. Mas você pode usar a estratégia de criar uma coluna de controle, paralela a coluna que contém as células de cor, e atribuir um letra manualmente, por exemplo, para cada uma. Então você usa a função SOMASE() para somar por letra. Uma vez depois de somada, você oculta a a coluna controle, se preferir. []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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!