Pergunte aqui
0

Macro para imprimir intervalo de páginas no Calc

perguntadas 2019-03-16 17:49:56 +0200

imagem do gravatar de Sapiroto

updated 2019-03-17 15:07:26 +0200

Existe uma forma de criar uma macro para imprimir um intervalo de páginas de uma planilha do Calc tendo como referência o valor constante em uma célula? Exemplo: Se na célula A1 tem o valor 3, então será impresso o intervalo de páginas de 1 a 3.

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

2 Respostas

1

respondidas 2019-03-16 20:23:49 +0200

imagem do gravatar de mrkalvin

updated 2019-03-16 21:26:19 +0200

Baseado nesses links:

https://wiki.openoffice.org/wiki/Prin...

https://wiki.openoffice.org/wiki/Work...

Function fnNewProperty(sName, optional vValue)
    aProperty = createUnoStruct("com.sun.star.beans.PropertyValue")
    aProperty.Name = sName

    If not isMissing(vValue) Then
        aProperty.Value = vValue
    End If
        fnNewProperty = aProperty
End Function


Sub subAddProperty(mProperties, sName, optional vValue)
    nNext = uBound(mProperties) + 1
    redim preserve mProperties(nNext)

    If isMissing(vValue) Then
        mProperties(nNext) = fnNewProperty(sName)
    Else
        mProperties(nNext) = fnNewProperty(sName, vValue)
    End If
End Sub


Sub subPrint(oDoc, optional ncopies, optional bCollate, optional sPages, optional sFileName)
    Dim mPrintOptions()

    If not isMissing(nCopies) Then
        subAddproperty(mPrintOptions(), "CopyCount", nCopies)
    End If

    If not isMissing(bCollate) Then
        subAddproperty(mPrintOptions(), "Collate", bCollate)
    End If

    If not isMissing(sPages) Then
        subAddproperty(mPrintOptions(), "Pages", sPages)
    End If

    If not isMissing(sFilename) Then
        subAddproperty(mPrintOptions(), "FileName", sFileName)
    End If

    oDoc.print(mPrintOptions())
End Sub


Sub CustomPrint
    Dim oDoc, oPlan As Object
    Dim myUltimaPag, myIntervaloPg As String

    oDoc = ThisComponent
    oPlan = oDoc.Sheets.getByName("Base")
    'oPlan = oDoc.CurrentController.ActiveSheet

    myUltimaPag = oPlan.getCellRangeByName("A1").getString()
    myIntervaloPg = "1-" & myUltimaPag

    'Imprimir como Arquivo PDF
    'subprint(ThisComponent, 1, ,myIntervaloPg, "PrintExample.pdf")

    'Imprimir para impressora Padrão    
    subprint(ThisComponent, 1, ,myIntervaloPg)

    msgbox("Impressão das páginas " & myIntervaloPg & " concluída com sucesso!", 6, "Seu título de Aviso")
End Sub

Pode escolher imprimir na impressora padrão ou imprimir como PDF, como descrito no código!

Um arquivo de exemplo: C:\fakepath\print.ods

Veja se ajuda!

editar assinalar como ofensivo Excluir Link mais

Comentários

Obrigado! Essa solução resolveu o meu problema. Agradeço a atenção.

imagem do gravatar de SapirotoSapiroto ( 2019-03-16 21:11:04 +0200 )editar
0

respondidas 2019-03-16 19:16:29 +0200

updated 2019-03-16 19:16:57 +0200

Ola @Sapiroto, seja bem vindo ao Grupo.

Nomeei a célula A1 para AreaPrint, a página 1 para Area1, a pagina 1 e 2 para Area2 e a pagina 1 a 3 para Area3.

'================================================|
Sub IMPRIMIR
'================================================|
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "AreaPrint"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
Dim oSel as Object
    oSel = ThisComponent.getCurrentSelection()
'   MsgBox oSel.getString()
    Var1 = oSel.getString()
'end Sub
If Var1 = "1" Then
    Call AreaX "Area1"
ElseIf Var1 = "2" Then
    Call AreaX "Area2"
ElseIf Var1 = "3" Then
    Call AreaX "Area3"
Else
    MsgBox "Área desconhecida"
End If
End Sub

'================================================|
sub Areax ( xArea As String )
'================================================|
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = xArea
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
'dispatcher.executeDispatch(document, ".uno:PrintDefault", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:DefinePrintArea", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:Print", "", 0, Array())
end sub

.

Caso a resposta atendeu sua necessidade, por gentileza, click na bolinha Descrição da imagem a esquerda da resposta, para finalizar a pergunta.

editar assinalar como ofensivo Excluir Link mais

Comentários

Obrigado! Essa solução funcionou, mas eu teria que ir acrescentando ao código "Area4", "Area5" e assim por diante conforme a necessidade. Agradeço pela atenção.

imagem do gravatar de SapirotoSapiroto ( 2019-03-16 21:08:54 +0200 )editar
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2019-03-16 17:49:56 +0200

Lidas: 41 vezes

Última atualização: Mar 16