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.
Baseado nesses links:
https://wiki.openoffice.org/wiki/Printing_a_document
https://wiki.openoffice.org/wiki/Working_with_properties
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:
print.ods
Veja se ajuda!
Obrigado! Essa solução resolveu o meu problema. Agradeço a atenção.
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 a esquerda da resposta, para finalizar a pergunta.
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.