Pegar string de célula

Tenho esta macro que já faz isto…

sub PegarStringCelula
Dim Plan As Object
Dim Var1 As String
Plan = thisComponent.sheets(2)
Var1 = plan.getCellByPosition(0,0).String
end Sub

Porem gostaria de informar o endereço (Planilha.Celula), na chamada da Macro, tipo:

sub PegarStringCelula (x As String)
Dim Plan As Object
Dim Var1 As String
Plan = thisComponent.sheets
Var1 = plan.getCellByPosition( x ).String
end Sub

Logicamente a alteração que fiz, não funciona, Como consertar?


Vide complemento na Resposta do @Grafeno.


@Grafeno, me desculpe, me deparei com outro problema, a célula fonte (exemplo: Planilha.A1), é uma Variável, então não sei o endereço.
Em linguagem pratica seria isto:

Option Explicit
Private Var1 As String

Sub PegarStringCelula   'Pegar da célula atual'
      Usar o Endereço atual da célula
      Var1 = seu conteúdo
End Sub

Ola @Grafeno, após sua 2a. resposta considerei resolvida (sem testar) e por motivos de prioridade, congelei meu projeto, e voltei agora, porém não estou conseguindo resultado.


Esta macro: Funciona

Sub PegarStringCelula2 
    Dim Plan As Object
 	Dim Var1 As String
       x1 = Split( "Planilha1.B6", "." ) 
       Plan = thisComponent.Sheets.getByName( x1(0) )
       Var1 = Plan.getCellRangeByName( x1(1) ).String 
   msgbox Var1    
End Sub

Mas com a dica dada não esta funcionando, sabe dizer o motivo:

Sub Main2
   Call PegarStringCelula ("Planilha1.B6")
   MsgBox Var1
End Sub

Sub PegarStringCelula (x As String)
    Dim Plan As Object
 	Dim Var1 As String
       x1 = Split( x, "." ) 
       Plan = thisComponent.Sheets.getByName( x1(0) )
       Var1 = Plan.getCellRangeByName( x1(1) ).String 
End Sub

@Gilberto Schiavinatto, só para esclarecer mais, você quer a célula ativa no momento da execução do código?

@Grafeno, sim, pegar o conteúdo da célula ativa e guardar na Var1

@Gilberto Schiavinatto, já respondi algumas perguntas sobre célula ativa. Aqui eu trouxe a função ActiveCell, que se você inserir em seu módulo, poderá usar a linha:

Var1 = ActiveCell.String

.

@Gilberto Schiavinatto, a principal possibilidade que vejo para o não funcionar é que vc inseriu a declaração Dim Var1 As String dentro da subrotina PegarStringCelula(). Veja o complemento da minha resposta, onde disse que a variável precisa ser declarada fora da SUB (subrotina). Geralmente, declara-se no topo do módulo.

Ok @Grafeno, esquecimento meu…obrigado.

Olá,


Primeiro você precisa usar o método **getCellRangeByName()** no lugar de **getCellByPosition()**. Ele que vai suportar endereços (Ex. "A1") de células individuais:
Var1 = plan.getCellRangeByName( x ).String

Segundo, ao invés da linha Plan = thisComponent.sheets(2) use algo como:

Plan = thisComponent.sheets.getByName( "Nome_da_Planilha" )

Por último, para passar o endereço Planilha.Célula para a subrotina, é preciso uma estratégia. Acredito que uma boa solução é usar a função SPLIT():

sub PegarStringCelula (x As String)
Dim Plan As Object
Dim Var1 As String
   x1 = Split(x,".") 'Quebra x em uma matriz de dois elementos'
   Plan = ThisComponent.Sheets.getByName( x1(0)) 'x1(0) => Elemento antes do ponto'
   Var1 = plan.getCellRangeByName( x1(1) ).String 'x1(1) => Elemento após o ponto'
end Sub

Edição: completar a resposta.

A necessidade é a seguinte: Pegar o
conteúdo desta célula e transforma-la
em uma Variável Privada (pois poderá
ser usada em outra macros dentro do
mesmo Modulo)

@Gilberto Schiavinatto, isto é questão de escopo de variável. Ela precisa ser declarada fora de uma SUB ou FUNCTION e, para ser válida apenas no módulo, usar Dim ou Private.

Veja o exemplo:

REM  *****  BASIC  *****

Dim Var1 As String 'Poderia ser Private Var1 As String'


Sub Main
   Call PegarStringCelula( "Planilha1.A1" )
   msgbox Var1
End Sub




Sub PegarStringCelula(x As String) As String
    Dim Plan As Object
       x1 = Split( x, "." ) 
       Plan = thisComponent.Sheets.getByName( x1(0) )
       Var1 = Plan.getCellRangeByName( x1(1) ).String 
    End Sub

Para mais detalhes, veja esta página da ajuda do LibreOffice.

Ola @Grafeno, tinha certeza que daria a resposta. Mas me confundi, vou refazer a pergunta sem tentar fazer a macro:

Partindo que já estou na célula desejada.

A necessidade é a seguinte: Pegar o conteúdo desta célula e transforma-la em uma Variável Privada (pois poderá ser usada em outra macros dentro do mesmo Modulo)

Li que é possível isto, no livro de Cleuton Sampaio ( Criando Macros no BrOffice Calc).

@Gilberto Schiavinatto, veja se agora a resposta ficou correta.

Ola @Grafeno, encontrei uma macro simples que me atende perfeitamente, no eBook “Aprendiendo OOo Basic” de Mauricio Baeza Servin:

Sub PegarStringDaCelulaAtual()
Dim oSel as Object
	oSel = ThisComponent.getCurrentSelection()
'	MsgBox oSel.getString()
	Var1 = oSel.getString()
end Sub

@Gilberto Schiavinatto, cuidado pois getCurrentSelection pode levar a um erro se a seleção for um objeto como uma forma ou um intervalo de células. Vc precisa colocar um teste If oSel.ImplementationName <> "ScCellObj" Then Exit Sub.

Ola @Grafeno, Obrigado pela dica vou acrescentar. Não havia dado problema até agora, pois sempre usei com um endereçameno pontual celula antes. ( tipo: Vai pra a Célula tal e Pegue a String).