Macro para buscar e copiar imagem de uma planilha e colocar em outra conforme célula

Ola pessoal, estou usando o LibreOffice a pouco tempo. Estou refazendo várias planilhas que estavam em excel e estou com algumas dificuldades.

Venho pedir ajuda para a seguinte:

  • conforme imagem em anexo, no excel é possível você ter várias imagens em uma aba da planilha, dar um nome para o intervalo e associar uma figura ao nome criado. Assim é possível mudar a exibição de uma imagem em uma outra aba específica, conforme a variação do conteúdo de uma célula.

A planilha serve para fazer-se recibos avulsos.

Então conforme pode-se ver, as etapas eram:
Na 1 etapa - o usuário define se é um recibo para empresa contabilidade ou imobiliária
Na 2 etapa - na planilha auxiliar a planilha refere-se ao informado.
Na 3 etapa - através do vinculo do intervalo nomeado, e a imagem, a logo respectiva é impressa.

Pois bem, no calc, pelo que eu verifiquei não há essa opção idêntica. Há algumas maneiras de se fazer via macro, porém, das maneiras dispostas na internet, que eu encontrei, eu não consegui entender e aplicar na minha planilha.

Em resumo o que eu preciso é uma macro que:

  • quando o usuário definir “Imobiliária”, na celula, na 1ª aba “Dados” > que a logo correspondente (que esta na 4ª aba “Planilha Auxiliar”) seja impressa/definida na 2ª aba “Recibo”, e que o mesmo aconteça quando selecionar “Contabilidade”.

Obs. Eu não preciso que a mudança ocorra a cada vez que o conteúdo seja alterado, pois irei fazer uma “Call” para que o código ocorra junto a outros comandos.

Obs. Eu sou leigo no assunto de macros, e programação, consigo fazer algumas coisas apenas conforme pesquisas na internet.

Disponibilizo aqui meu contato no Telegram: @airtonlcjr para o caso de alguém que se sentir disposto a me ajudar me contatar para eventuais dúvidas sobre.

Desde ja muito obrigado.

Segue uma sugestão, a imagem deve estar ancorada na célula e ajustada ao tamanho da celula.

Macro ligada ao Evento de planilha, Conteúdo alterado.

teste imagem procv.ods (15.4 KB)

Caso não conseguir reproduzir em seu arquivo, poste o arquivo, que faço nele.

Uma alternativa, é nomear cada célula com o nome da imagem de origem, então, pode simplesmente copiar a tarefa.

Por exemplo.

Sub copiar_imagen()
doc = ThisComponent

nombre_hoja_origen = “datos”
nombre_hoja_destino = “recibo”

nombre_celda_imagen = “A1”
nombre_celda_destino = “C1”

hoja_destino = doc.Sheets.getByName(nombre_hoja_destino)

pagina_dibujo = hoja_destino.DrawPage
if pagina_dibujo.Count > 0 Then
imagen = pagina_dibujo.getByIndex(pagina_dibujo.Count - 1)
pagina_dibujo.remove(imagen)
end if

nombre_imagen = hoja_destino.getCellRangeByName(nombre_celda_imagen).String
celda_destino = hoja_destino.getCellRangeByName(nombre_celda_destino)
celda_origen = doc.Sheets.getByName(nombre_hoja_origen).getCellRangeByName(nombre_imagen)
hoja_destino.copyRange(celda_destino.CellAddress, celda_origen.RangeAddress)

End Sub

Você poderia postar uma planilha de exemplo?
Pois tentei aplicar seu código e não consegui. Deu erro.

Ola @elmau, valeu a dica de nomear a célula com o nome da imagem, minha macro, do arquivo acima, ficou assim: ( Macro ligada a Eventos de Planilha, Conteúdo Alterado ).

 Sub AlteredContentCell ( oCelula )
   If Right(oCelula.AbsoluteName,5) = "$C$14" Then

' PEGAR NOME DA IMAGEM ESCOLHIDA
	GoToLocal "$C$14" : Var1 = ThisComponent.getCurrentSelection().getString()

' DELETAR IMAGEM ANTERIOR
		GoToLocal "E14"
		Execute "Cut"

' COLAR IMAGEM NOVA
	GoToLocal Var1
	Execute "Copy"
	GoToLocal "E14"
	Execute "Paste"
End If
End Sub


    ' ======= SubMacros ===============
    Sub Execute ( oQue$, Optional nQtd% )
    Dim Exec(1) as new com.sun.star.beans.PropertyValue
    Exec(0).Name = "By" : Exec(0).Value = nQtd
    Exec(1).Name = "Sel" : Exec(1).Value = false
    CreateUnoService("com.sun.star.frame.DispatchHelper") _
    .executeDispatch(ThisComponent.CurrentController _
    .Frame, ".uno:" & oQue & "", "", 0, Exec())
    End Sub

    Sub GoToLocal ( xLocal$ )
    dim Loc(0) as new com.sun.star.beans.PropertyValue
    Loc(0).Name = "ToPoint" : Loc(0).Value = xLocal
    CreateUnoService("com.sun.star.frame.DispatchHelper") _
    .executeDispatch(ThisComponent.CurrentController.Frame _
    , ".uno:GoToCell", "", 0, Loc())
    End Sub

planilha de exemplo
teste imagem 2.ods (17.2 KB)

Ok, agora funcionando, completei a macro no module2 e na planilha Recibo ligue macro no Evento de planilha…

2021-10-18 17-17-43

teste imagem 2.ods (15.4 KB)