Função ou Condicional IF

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

.

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

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;

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

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:

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.

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!
:slight_smile:

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!!

:smiley:

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

“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.