Tenho uma macro no Calc que apresenta uma pesquisa em um grid e preciso retornar o número da linha que foi selecionada, mas o Basic apresenta a seguinte mensagem: “Propriedade ou método não encontrado: Row”
A estrutura da macro é
Sub XGridSelection_selectionChanged(oEvt)
msgBox "selected row: " & oEvt.Row
End Sub
Veja a minha pergunta: “LibreOffice Base, como excluir mais de um registro ao mesmo tempo?”
Nessa minha pergunta, o nosso amigo Grafeno gentilmente me forneceu um trecho de código que resolveu meu problema, eu apenas tive que adaptar alguma coisa a realidade do meu formulário, porém nesse código ele exibe a linha do número de um registro selecionado na grid, que é o que vc quer.
Segue o código:
Sub BotExcluirSelecoes_Click()
Dim mRegistrosSel() As Variant, nRegistro As Variant
Dim oForm As Object, oModelTab As Object
Dim oCtrldorTab As Object, oRcdSet2 As Object
Dim sRegistro As String, sTmp As String
oForm = Forms("FormProdutos") 'Formulário
oModelTab = oForm.Controls("CtrleTabela1").ControlModel 'Model Controle Tabela
oRcdSet2 = oForm.RecordSet.Clone() 'Clone do Recordset do Form
'Obter o controlador do Ctrle Tabela (API UNO original)
oCtrldorTab = ThisComponent.CurrentController.getcontrol( oModelTab )
mRegistrosSel = oCtrldorTab.getSelection 'Registros selecionados
If ubound( mRegistrosSel ) = -1 Then
MsgBox "Por favor, selecione o(s) registro(s) que deseja excluir!",48
Exit sub
End If
For Each nRegistro in mRegistrosSel 'Para cada registro selecionado
oRcdSet2.AbsolutePosition = nRegistro 'pula para o registro
sRegistro = oRcdSet2.Fields(1).Value 'String da Coluna "Nome"
sTmp = sTmp & nRegistro & ". " & sRegistro & Chr(10)
Next
MsgBox sTmp
End Sub
Então basicamente pra resumir vc deve seguir os passos:
1 - Além de crirar variáveis do tipo “Object” para referenciar os controles do formulário como no caso o formulário princial ( ou no seu caso a planilha )e o objeto grid, vc tb deve criar variváveis do tipo “variant” para variáveis que vão usar os métodos “getselect” ( registro selecionado ) e “absoluteposition” ( valor da posição absoluto )
2 - Referenciar os controles e criar um “RecordSet.Clone()” da fonte de dados da sua grid que se for a mesma do formulário o código seria:
oForm = Forms("FormProdutos") 'Referencia seu Formulário principal
oModelTab = oForm.Controls("CtrleTabela1").ControlModel 'Referencia sua grid
oRcdSet2 = oForm.RecordSet.Clone() ' 'Clone do Recordset do Form
'Referencia o controlador da sua gris ( necessário)
oCtrldorTab = ThisComponent.CurrentController.getcontrol( oModelTab )
mRegistrosSel = oCtrldorTab.getSelection 'Registros selecionados
For Each nRegistro in mRegistrosSel 'Para cada registro selecionado
oRcdSet2.AbsolutePosition = nRegistro 'recebe o valor da linha da grid selecionada
sRegistro = oRcdSet2.Fields(1).Value 'String uma coluna qualquer"
' exibe assim: Número da linha . texto qualquer do(s) registro(s) selecionado(s)
sTmp = sTmp & nRegistro & ". " & sRegistro & Chr(10)
Next
MsgBox sTmp
Saída: ( NO CASO DE 3 REGISTROS SELECIONADOS)
1.texto1
13.texto13
22.texto22
mas se a grid tiver outra fonte de dados como uma consulta por exemplo vc referencia assim:
oForm = Forms("FormProdutos") 'Referencia Form principal
oModelTab = oForm.Controls("CtrleTabela1").ControlModel 'Referencia sua grid
Set oRcdSet1 = Application.CurrentDb().OpenRecordset("nome_da_consulta_da_grid") ' Referencia dados da grid
Set oRcdSet2 = oRcdSet1.Clone() 'Clona o recordset
No segundo caso o restante do código é o mesmo do primeiro, no fim ia exbir a(s) linha(s) selecionada(s) e a posição dessa(s) linha(s).