Pergunte aqui
1

macro para maiúscula em nome próprio

perguntadas 2017-04-27 16:58:36 +0100

imagem do gravatar de Jorge Thomaz

updated 2017-05-24 18:51:59 +0100

imagem do gravatar de Grafeno

Bom dia, A tempos atrás, baixei uma macro, mas precisamente uma extensão criada por NOELSON A. DUARTE, para transformar a 1º letra de cada palavra em maiúscula, mas este macro ou extensão somente é para uso nas planilhas.... Gostaria de saber se tem como alterar o comando para que seja usado para o writer........ segue em anexo a estrutura da extensão.....

Sub ConverterLetrasIniciais
    oDoc = thisComponent
    oSelec = oDoc.getCurrentSelection()
    ' celula ou intervalo selecionado ?
    If (Not oSelec.supportsService("com.sun.star.sheet.SheetCellRange")) Then
        MsgBox "Selecione a célula ou o intervalo de células!", 48, "Erro"
        Exit Sub
    End If
    ' cria e exibe uma caixa de diálogo
    DialogLibraries.loadLibrary ( "TamLetra" )
    oDialogo = CreateUNODialog (DialogLibraries.TamLetra.Dialog1)
    iResp = oDialogo.execute()
    ' usuário cancelou ? encerra
    If iResp = 0 Then
        Exit Sub
    End If
    ' verifica estado da caixa de seleção
    bMinusc = False
    If oDialogo.Model.CheckBox1.State = 1 Then
        bMinusc = True
    End If
    ' verifica estado do botão de opção
    bNome = False
    If oDialogo.Model.OptionButton2.State = 1 Then
        bNome = True
    End If
    ' inicia a conversão
    LetrasIniciaisMaiusculas (oSelec, bNome, bMinusc)
End Sub

'_____________________________________________________________________________________________

Sub LetrasIniciaisMaiusculas (oSel As Variant, bNomeProprio As Boolean, bMinuscula As Boolean)
    ' obtem limites da seleção
    vEnd = oSel.getRangeAddress()
    nrLinhas = vEnd.EndRow - vEnd.StartRow
    nrColunas = vEnd.EndColumn - vEnd.StartColumn
    tipoTexto = com.sun.star.table.CellContentType.TEXT
    ' percorre as células selecionadas
    For i = 0 To nrLinhas
        For j = 0 To nrColunas
            oCelula = oSel.getCellByPosition(j, i)
            ' apenas células com texto nos interessa
            If oCelula.getType() = tipoTexto Then
                sConteudo = oCelula.getString()
                If bMinuscula Then
                    ' converte as letras em minúsculas
                    sConteudo = LCase(sConteudo)
                End If
                If bNomeProprio Then
                    ' converte no estilo de nomes próprios
                    novoCont = LetrasNomeProprio(sConteudo)
                Else
                    ' converte todas as iniciais para maiúsculas
                    novoCont = TodasIniciaisMaiusculas(sConteudo)
                End If
                ' atualiza o conteúdo da célula
                oCelula.setString(novoCont)
            End If
        Next j
    Next i
End Sub

'___________________________________________________

Function TodasIniciaisMaiusculas (sCadeia) As String
    vPalavras = Split (sCadeia)
    For i = 0 To UBound(vPalavras)
        letra = UCase(Left$(vPalavras(i),1))
        Mid(vPalavras(i), 1, 1, letra)
    Next i
    TodasIniciaisMaiusculas = Join(vPalavras())
End Function

Se tiver uma idéia para alterar este macro serei grato.....

se tem com ser uma texto selecionado .....

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

Comentários

Se o objetivo for colocar as palavras do texto no writer com a inicial em maiúsculas, existe um comando para isso em Formatar - Texto - Palavras Iniciando Com Maiúsculas.

imagem do gravatar de OlivierOlivier ( 2017-04-28 02:41:57 +0100 )editar

3 Respostas

1

respondidas 2017-05-04 18:11:42 +0100

imagem do gravatar de Grafeno

Boa tarde,

Modifiquei as duas subrotinas para funcionar no Writer. As funções que você forneceu permanecem iguais.

Não estou muito familiarizado com os objetos do Writer como estou com os do Calc. Por isso, posso apenas tentar uma aproximação. Ela funcionou para o texto selecionado, mesmo que em linhas (parágrafos) diferentes.

Sub ConverterLetrasIniciais
   oDoc = thisComponent
   oSelec = oDoc.getCurrentSelection()
   ' sair se a seleção não for a um intervalo de texto
   If oSelec.ImplementationName <> "SwXTextRanges" Then Exit Sub
   ' cria e exibe uma caixa de diálogo
   DialogLibraries.loadLibrary ( "TamLetra" )
   oDialogo = CreateUNODialog (DialogLibraries.TamLetra.Dialog1)
   iResp = oDialogo.execute()
   ' usuário cancelou ? encerra
   If iResp = 0 Then
       Exit Sub
   End If
   ' verifica estado da caixa de seleção
   bMinusc = False
   If oDialogo.Model.CheckBox1.State = 1 Then
       bMinusc = True
   End If
   ' verifica estado do botão de opção
   bNome = False
   If oDialogo.Model.OptionButton2.State = 1 Then
       bNome = True
   End If
   ' inicia a conversão
   LetrasIniciaisMaiusculas (oSelec, bNome, bMinusc)
End Sub

...

Sub LetrasIniciaisMaiusculas (oSel As Variant, bNomeProprio As Boolean, bMinuscula As Boolean)
   ' O texto da seleção
   oTexto = oSel.getByIndex(0)
   sConteudo = oTexto.getString()
   If bMinuscula Then
   ' converte as letras em minúsculas
     sConteudo = LCase(sConteudo)
   End If
   If bNomeProprio Then
   ' converte no estilo de nomes próprios
     novoCont = LetrasNomeProprio(sConteudo)
   Else
   ' converte todas as iniciais para maiúsculas
     novoCont = TodasIniciaisMaiusculas(sConteudo)
   End If
   ' atualiza o texto da seleção
   oTexto.setString(novoCont)
End Sub

...

Atte,

editar assinalar como ofensivo Excluir Link mais

Comentários

Bom dia Grafeno, então a função abaixo (LetrasNomeProprio) não há necessidade de ser alterado para ser usado no writer???

imagem do gravatar de Jorge ThomazJorge Thomaz ( 2017-05-05 15:42:31 +0100 )editar

Boa tarde! Não é preciso alterar a função LetrasNomeProprio e nem a função TodasIniciaisMaiusculas. Elas não interagem com qualquer objeto e por isso não precisam ser "traduzidas" do Calc para o Writer.

imagem do gravatar de GrafenoGrafeno ( 2017-05-05 18:54:20 +0100 )editar

Ficou ok. mas aos exportar para extensão dá esta mensagem:(com.sun.star.deployment.DeploymentException) { { Message = "Ocorreu um erro ao ativar: NomeProprio", Context = (com.sun.star.uno.XInterface) @6942960 }, Cause = (any) { (com.sun.star.lang.IllegalArgumentException) { { { Message = "", Context = (com.sun.star.uno.XInterface) @0 } }, ArgumentPosition = (short) 0 } } } Tem alguma solução.....

imagem do gravatar de Jorge ThomazJorge Thomaz ( 2017-05-05 19:21:10 +0100 )editar

segue link do arquivo criado para ser extensão https://www.dropbox.com/s/treh7egllov...

imagem do gravatar de Jorge ThomazJorge Thomaz ( 2017-05-05 20:40:32 +0100 )editar

Olha o erro " Message = "Ocorreu um erro ao ativar: NomeProprio ". Seu arquivo não veio com a Biblioteca "NomeProprio" que contém o diálogo usado na extensão. Vc tem que importar esta biblioteca para o arquivo antes de distribui-lo.

imagem do gravatar de GrafenoGrafeno ( 2017-05-06 14:11:00 +0100 )editar

Reenviando Vincular texto

Agora acho que deu...

imagem do gravatar de Jorge ThomazJorge Thomaz ( 2017-05-07 08:09:33 +0100 )editar

Vincular texto acho que agora deu....

Encontrei o erro: após criar a extensão é necessário apagar a biblioteca aonde foi criado.... contudo, mesmo adicionando a extensão ela não aparece no writer..... segue arquivo de extensão. Vincular texto

Fico no aguardo se encontrar a solução....

imagem do gravatar de Jorge ThomazJorge Thomaz ( 2017-05-07 08:12:30 +0100 )editar

Como colocar uma condição no Sub ConverterLetrasIniciais, para que se não selecionar o texto a ser alterado e não é um documento writer, ele dá um mensagem de erro. E estando o texto selecionado e sendo um documento writer ele ativa a caixa de diálogo. Pois dá dando erro no comando getByIndex(0), quando testo no calc.

imagem do gravatar de Jorge ThomazJorge Thomaz ( 2017-05-09 07:55:15 +0100 )editar

@Jorge Thomaz, após baixar e instalar a extensão que você disponibilizou, testei e funcionou perfeitamente no Writer, mas tive que ir em Ferramentas >> Macros >> Executar macro... >> Minhas macros > NomeProprio > Module1 > ConverterLetrasIniciais.

imagem do gravatar de GrafenoGrafeno ( 2017-05-09 19:04:53 +0100 )editar

Na macro ConverterLetrasIniciais da minha resposta, se você observar, tem a linha If oSelec.ImplementationName <> "SwXTextRanges" Then Exit Sub que justamente evita a execução do código fora do Writer. Na extensão que você disponibilizou veio outra coisa. Atte,Grafeno.

imagem do gravatar de GrafenoGrafeno ( 2017-05-09 19:10:31 +0100 )editar
0

respondidas 2017-04-28 05:38:45 +0100

Oi @Jorge Thomaz, tendo a dica do @Olivier, montei com o gravador de macro.

Com o texto selecionado.

sub IniciarPalavrasComMaiusculas
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:ChangeCaseToTitleCase", "", 0, Array())
end sub
editar assinalar como ofensivo Excluir Link mais

Comentários

Oi @Gilberto, contudo, este macro torna todas as iniciais de palavras em maiúsculas... O que preciso é um macro ou Function que apenas torne as palavras de nomes próprios em maiúsculas como o macro que enviei acima, ou seja, ao escrever manuel de souza ele deixa assim: Manuel de Souza como a extensão - macro - que enviei....Também gostaria de saber se posso transformar o macro em extensão para usar no writer, já que no calc já tem......

imagem do gravatar de Jorge ThomazJorge Thomaz ( 2017-05-02 14:34:27 +0100 )editar

Oi @Jorge Thomaz, como mencionou inicialmente "se tem com ser uma texto selecionado ....." deduzi que selecionaria o texto necessário. Sobre a Function LetrasNomeProprio, desconheço se o Writer sabe quais são os Nomes Próprios. Uma saída não muito elegante seria cadastrar em Autocorreção, por exemplo: se digitar maria substituir por Maria. Será um cadastro um a um e sempre que houver Nomes Próprios novos, terá que incluir.

imagem do gravatar de SchiavinattoSchiavinatto ( 2017-05-03 01:40:41 +0100 )editar

este macro ou função foi extraído do macro criado pelo Noelson A. Duarte, usando caixa de diálogo e transformando em extensão para ser usado no Calc. Contudo, eu queria alterar os comandos deste criação para ser adaptada ao writer já que o macro criado pelo noelson usa a célula selecionada para alteração de letra maiúscula para nome próprio. Assim, como o Writer é um processador de texto, a forma de selecionar seria através do cursor passando por cima da palavra para ser alterada...

imagem do gravatar de Jorge ThomazJorge Thomaz ( 2017-05-03 16:32:03 +0100 )editar

Ou um macro para usar igual ao comando em Formatar - Texto - Alterar Caixa. Pois ele altera usando o cursor para selecionar.....Ou um macro que não reconhece ("e","da","de","do","das","dos") dos nomes próprios e automatizar como no tópico MACRO-IMPRIME E DELETA

imagem do gravatar de Jorge ThomazJorge Thomaz ( 2017-05-03 17:00:01 +0100 )editar
0

respondidas 2017-05-02 14:35:26 +0100

imagem do gravatar de Jorge Thomaz

updated 2017-05-04 03:07:57 +0100

Segue em anexo a function que faltou:

   Function LetrasNomeProprio (sCadeia) As String
        vExcluir = Array("e","da","de","do","das","dos")
        vPalavras = Split (sCadeia)
        For i = 0 To UBound(vPalavras)
            bExcluir = False
            For j = 0 To UBound(vExcluir)
                If LCase(vPalavras(i)) = vExcluir(j) Then
                    vPalavras(i) = LCase(vPalavras(i))
                    bExcluir = True
                    Exit For
                End If
            Next j
            If Not bExcluir Then
                letra = UCase(Left$(vPalavras(i),1))
                Mid(vPalavras(i), 1, 1, letra)
            End If
        Next i
        LetrasNomeProprio = Join(vPalavras())
    End Function

.

editar assinalar como ofensivo Excluir Link mais
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2017-04-27 16:58:36 +0100

Lidas: 202 vezes

Última atualização: May 04 '17