Pergunte aqui
1

Função ou Condicional IF

perguntadas 2018-02-23 02:06:51 +0200

imagem do gravatar de Orlando

updated 2018-04-16 20:20:59 +0200

Olá, pessoal!

Primeiro, eu vou explicar como gostaria que funcionasse:

1ª) Se a col A estiver preenchida e a col B estiver limpa, copiar (sem recortar) os dados da col A e colar (sem formatação) na coluna B.

2ª) Se a coluna B estiver preenchida, limpar essa coluna e encerrar o código sem executar a 1ª) opção.

.

Fiz tudo até onde aprendi, pesquisando também aqui.

Tentei adaptar a função If a outros códigos com única ação de um Botão de pressão. Mas sempre dá em erros, conforme os procedimentos abaixo:

Sub SORTEAR
Dim document   as object
Dim dispatcher as object
Dim oDoc As Object, oPlan As Object
Dim oIntervalo1 As Object, oIntervalo2 As Object
Dim args1(0) as new com.sun.star.beans.PropertyValue
Dim sSQL As String

        ' Desproteger a planilha sem senha
        oDoc = ThisComponent
        oPlan = oDoc.Sheets.getByName( "Plan1" )
'       oPlan.Unprotect( "" )

' Iniciar os objetos
oDoc = ThisComponent
oPlan = oDoc.Sheets.getByName( "Plan1" )
oIntervalo1 = oPlan.getCellRangeByName( "A2:A18" )
oIntervalo2 = oPlan.getCellRangeByName( "B2:B18" )

' INCIANDO A CONDIÇÃO IF:
If oIntervalo1 <> 0 And oIntervalo2 = 0 Then

        ' Classificar em ordem crescente a coluna A
        '1º- os campos de classificação
        Dim mCampos(0) as New com.sun.star.util.SortField
        mCampos(0).Field = 0
        mCampos(0).SortAscending = True
        '2º- Descrever a classificação
        Dim mDescricao(1) As New com.sun.star.beans.PropertyValue   
        mDescricao(0).Name = "SortFields"
        mDescricao(0).Value = mCampos()
        mDescricao(1).Name = "HasHeader"
        mDescricao(1).Value = False
        '3º- classificar o intervalo
        oIntervalo1.Sort( mDescricao )

' Colar os dados da coluna A em B
oIntervalo2.setDataArray( oIntervalo1.getDataArray )

        ' Exportar como PDF para Salvar
        rem ----------------------------------------------------------------------
        rem get access to the document
        document   = ThisComponent.CurrentController.Frame
        dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
        rem ----------------------------------------------------------------------
        'dispatcher.executeDispatch(document, ".uno:ExportDirectToPDF", "", 0, args1())

' CONCLUINDO A CONDIÇÃO IF:
Else

'Apagar Registros
sSQL = "DELETE FROM ""oIntervalo2"""  
'Excutar a Instrução SQL
OInstSQL.Execute( sSQL )

End If

        ' Parar na cél A1
        rem ----------------------------------------------------------------------
        rem get access to the document
        document   = ThisComponent.CurrentController.Frame
        dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
        rem ----------------------------------------------------------------------
        args1(0).Name = "ToPoint"
        args1(0).Value = "A1"

        dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

' Proteger a planilha sem senha
oDoc = ThisComponent
oPlan = oDoc.Sheets.getByName( "Plan1" )
'oPlan.Protect( "" )

End Sub

Fonte de pesquisa

Planilha-modelo

.

Grato pela atenção!

Orlando Souza

.

8)

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

Comentários

@Orlando, quando você diz "a col A estiver preenchida" é se referindo a completamente preenchida, ou mesmo parcialmente é aceitável?

imagem do gravatar de GrafenoGrafeno ( 2018-02-24 15:48:29 +0200 )editar
1

O trecho para "Apagar registros" não vai funcionar no Calc, ele é para o Base (banco de dados). O metodo correto está nessa resposta, por exemplo;

imagem do gravatar de GrafenoGrafeno ( 2018-02-24 15:54:26 +0200 )editar

oi, @Grafeno! A col A tem que estar toda preenchida, por se tratar de um sorteio. abç.

imagem do gravatar de OrlandoOrlando ( 2018-02-24 16:49:33 +0200 )editar

Ah! Tá! Eu interpretei diferente a pergunta do autor daquele tópico. Realmente, o outro método atende a condição de limpar a col B, porém o comando da função IF não executa a rotina dos demais códigos:

https://www.dropbox.com/s/7pra4b31agj...

imagem do gravatar de OrlandoOrlando ( 2018-02-24 16:58:36 +0200 )editar

1 Resposta

2

respondidas 2018-02-25 17:08:49 +0200

imagem do gravatar de Grafeno

Bom dia,

Estruturei o código a partir do que entendi que você está buscando.

Para encontrar as células vazias e cheias nos intervalos é possível usar os métodos queryEmptyCells() e queryContentCells() respectivamente.

Como é possível notar, utilizei as condições If... then... else aninhadas e comecei pela sua "2ª condição" porque em meus testes assim é que a macro se comportou "melhor".

Limpei o código dos carregamentos repetidos para o mesmo objetos, como oDoc = ThisComponent. Para evitar surpresas ruins e inesperadas, a boa prática é carregar o objeto uma única vez, a menos que isso seja estritamente necessário. Como foi no caso do intervalo B2:B18 em oIntTmp = oPlan.getCellRangeByName( "B2:B18" ), que não estava sendo classificado direito se usasse o oIntervalo1.

Por favor, teste e comente os resultados....

Sub SORTEAR
Dim oDoc As Object, oPlan As Object, oIntervalo1 As Object
Dim oIntervalo2 As Object, oVazias1 As Object, oCheias2 As Object
Dim oIntTmp As Object, oCelA1 As Object

   'Iniciar objetos
   oDoc = ThisComponent
   oPlan = oDoc.Sheets.getByName( "Plan1")
   oIntervalo1 = oPlan.getCellRangeByName( "A2:A18" )
   oIntervalo2 = oPlan.getCellRangeByName( "B2:B18" )

   ' Desproteger a planilha sem senha
   'oPlan.Unprotect( "" )

   ' Celulas vazias na coluna A
   oVazias1 = oIntervalo1.queryEmptyCells()
   ' Celulas cheias na coluna B (4 => strings)
   oCheias2 = oIntervalo2.queryContentCells( 4 )

   If oCheias2.Count <> 0 Then
   ' Se a col B tiver célula(s) preenchida(s)
     'Limpar intervalo2 (4 => strings)
      oIntervalo2.clearContents( 4 )
   Else
     If oVazias1.Count = 0 Then
     ' Se a col A estiver toda preenchida
       ' Colar os dados da col A na col B
        oIntervalo2.setDataArray( oIntervalo1.getDataArray )

       ' Classificar em ordem crescente a col B
       '1º- os campos de classificação
       Dim mCampos(0) as New com.sun.star.util.SortField
       mCampos(0).Field = 0
       mCampos(0).SortAscending = True
       '2º- Descrever a classificação
       Dim mDescricao(1) As New com.sun.star.beans.PropertyValue   
       mDescricao(0).Name = "SortFields"
       mDescricao(0).Value = mCampos()
       mDescricao(1).Name = "HasHeader"
       mDescricao(1).Value = False
       '3º- classificar o intervalo
       oIntTmp = oPlan.getCellRangeByName( "B2:B18" )
       oIntTmp.Sort( mDescricao )
      End If
   End If   

   ' Ir p/ célula A1
   oCelA1 = oPlan.getCellRangeByName( "A1" )
   oDoc.CurrentController.Select( oCelA1 )

   ' Exportar como PDF para Salvar
   ' -----------------------------------------------------------------------------
   ' get access to the document
   Dim document, dispatcher
   document   = ThisComponent.CurrentController.Frame
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
   ' -----------------------------------------------------------------------------
   'dispatcher.executeDispatch(document, ".uno:ExportDirectToPDF", "", 0, args1())
   ' -----------------------------------------------------------------------------

   ' Proteger a planilha sem senha
   'oPlan.Protect( "" )
End Sub

Atte.

editar assinalar como ofensivo Excluir Link mais

Comentários

Muito bom, @Grafeno! Estrutura mais enxuta do que a anterior.

.

Depois que ativei a macro "Exportar como PDF para Salvar", aparece um erro referente à linha de objeto:

dispatcher.executeDispatch(document, ".uno:ExportDirectToPDF", "", 0, args1())

Outra dúvida, acho que não há nenhum problema se eu alterar no código para "Classificar em ordem crescente a col B" o invervalo "B2:B18", para "A2:A18", deixando as colunas A e B em ordem alfabética.

.

Obrigado! :)

imagem do gravatar de OrlandoOrlando ( 2018-02-25 20:20:57 +0200 )editar
1

a macro funcionou, depois que acrescentei no início a declaração de objeto, cuja linha segue abaixo:

Dim args1(0) as new com.sun.star.beans.PropertyValue

\o/ Muito obrigado, @Grafeno!!

:D

imagem do gravatar de OrlandoOrlando ( 2018-02-25 22:00:33 +0200 )editar

@Orlando, era realmente essa declaração que faltava. Eu não testei esse trecho do código. Apenas copiei e colei.

imagem do gravatar de GrafenoGrafeno ( 2018-02-25 22:37:24 +0200 )editar

"Outra dúvida, acho que não há nenhum problema se eu alterar [...] o invervalo 'B2:B18', para 'A2:A18'[...]"

Você queria dizer alterar de "B2:B18" para "A2:B18", imagino. Aí sim, sem problemas, as duas colunas ficarão classificadas.

imagem do gravatar de GrafenoGrafeno ( 2018-02-25 22:41:19 +0200 )editar
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2018-02-23 02:06:51 +0200

Lidas: 81 vezes

Última atualização: Feb 25