Pergunte aqui
1

Pegar string de célula

perguntadas 2017-12-09 01:55:07 +0100

updated 2018-01-25 21:35:19 +0100

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
editar alterar tag assinalar como ofensivo fechar mesclar Excluir

Comentários

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

imagem do gravatar de GrafenoGrafeno ( 2017-12-10 22:54:26 +0100 )editar

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

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2017-12-10 23:02:17 +0100 )editar
1

@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

.

imagem do gravatar de GrafenoGrafeno ( 2017-12-12 00:14:09 +0100 )editar
1

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

imagem do gravatar de GrafenoGrafeno ( 2018-01-26 00:50:31 +0100 )editar
1

Ok @Grafeno, esquecimento meu......obrigado.

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2018-01-26 23:17:16 +0100 )editar

1 Resposta

1

respondidas 2017-12-10 14:47:39 +0100

imagem do gravatar de Grafeno

updated 2017-12-10 22:51:33 +0100

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.

editar assinalar como ofensivo Excluir Link mais

Comentários

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

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2017-12-10 18:44:22 +0100 )editar

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

imagem do gravatar de GrafenoGrafeno ( 2017-12-10 20:43:03 +0100 )editar

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
imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2018-05-09 16:24:14 +0100 )editar
1

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

imagem do gravatar de GrafenoGrafeno ( 2018-05-12 22:45:40 +0100 )editar

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

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2018-05-13 13:29:28 +0100 )editar
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2017-12-09 01:55:07 +0100

Lidas: 353 vezes

Última atualização: Jan 25 '18