Ir ao conteúdo
  • Cadastre-se

Martti

Membro Pleno
  • Posts

    45
  • Cadastrado em

  • Última visita

  1. Olá senhores. Tenho um formulario(UserForm1) no Excel com 14 textbox(txt1 até txt14) e um botão Gerar Documento. Ao clicar no botão btnGerarDocumento, deve abrir um documento na rede( \\caminho\para\sua\pasta\AIF.docx), documento este que possui 14 Campos de Texto(Controle de Formulario), preencher de Campo1 até Campo14 com as informações do UserForm1, na mesma ordem. Estou com erro em .ActiveDocument.Close (SalvarDocumento) e não consigo resolver. Agradeço desde já pela ajuda. Option Explicit Private ObjWord As Object Private ObjDocument As Object Private Function AbrirDocumentoWord(NomeArquivoWordModelo As String) As Boolean ' Invoca o Word Set ObjWord = CreateObject("Word.Application") ' Se ocorrer erro, prossiga (pois checarei se houve erro logo após o comando que pode ter dado problema On Error Resume Next ' Tenta abrir um novo documento Word a partir de um modelo Set ObjDocument = ObjWord.Documents.Add(NomeArquivoWordModelo, False, 0, False) ' Checa se houve erro If Err <> 0 Then ' Restaura o tratamento padrão de erros On Error GoTo 0 Err = 0 ' Ocorreu erro na tentativa de abertura do documento Word AbrirDocumentoWord = False ' Interrompe a execução desta Function Exit Function End If ' Restaura o tratamento padrão de erros On Error GoTo 0 ' Abertura de documento Word foi bem-sucedida AbrirDocumentoWord = True End Function Private Sub PreencheCampo(NomeCampo As String, ConteudoNovo As String) With ObjDocument ' Verifica se o campo a preencher existe If .Bookmarks.Exists(NomeCampo) Then ' O campo existe ' Preenche o campo indicado .Bookmarks(NomeCampo).Range.Fields(1).Result.Text = ConteudoNovo End If End With End Sub Private Sub ExibirWord() ObjWord.Visible = True End Sub Private Sub FecharWord(SalvarDocumento As Boolean) ' Fecha o documento Word With ObjWord .ActiveDocument.Close (SalvarDocumento) .NormalTemplate.Saved = True End With ' Fecha o Word ObjWord.Quit End Sub Private Sub cmdGerarArquivoWord_Click() Dim NOME_ARQUIVO As String NOME_ARQUIVO = "\\caminho\para\sua\pasta\AIF.docx" ' Desabilita o botão de comando cmdGerarArquivoWord.Enabled = False ' Tenta abrir documento Word If Not AbrirDocumentoWord(NOME_ARQUIVO) Then ' Reabilita o botão de comando cmdGerarArquivoWord.Enabled = True ' Fecha o Word, mas sem salvar o documento FecharWord False ' Houve erro. Interromper execução desta Sub Exit Sub End If ' Abertura do documento Word foi bem-sucedida ' --- Preenche os campos do documento Word com os conteúdos desejados ----------------------- '************************************************************************************* ' Exibe o Word ExibirWord ' Reabilita o botão de comando cmdGerarArquivoWord.Enabled = True End Sub
  2. UP! Algum dos colegas poderia melhorar este código? Funciona 90%, mas ao atingir o limite de altura da linha (255 pixels), ele não divide o texto adicionando uma linha abaixo. Pode ser testado na planilha deste tópico. Agradeço desde já. 'Code generated by OpenChat 16/04/2023 Sub FormataCélulas() Dim cw As Double, rh As Double, cwA As Double, c As Range With Range("B42:AF42") .MergeCells = False cwA = .Cells(1).ColumnWidth For Each c In .Cells cw = cw + c.ColumnWidth Next c cw = cw + .Count * 0.66 ' .Cells(1).ColumnWidth = cw .Cells(1).WrapText = True .EntireRow.AutoFit rh = .RowHeight .Cells(1).ColumnWidth = cwA .MergeCells = True .RowHeight = rh .HorizontalAlignment = xlJustify .VerticalAlignment = xlJustify End With End Sub
  3. @Midori, obrigado pela contribuição. Pensei nisso inicalmente, mas como a digitação de dados já é feita em formulários no excel, seria selecionar o registro no listbox e apertar um botão "Imprimir". Se não fosse esse único campo, de 20 campos, o relatório impresso já estaria em funcionamento. Aliás, sempre funcionou até então, mas foi necessário inserir este campo com a avaliação da não conformidade, que era de outro relatório. Como já existe essa máscara de relatório pronta, com logotipo, cabeçalho etc., e há muito tempo já é utilizada com VBA, pelas boas práticas a probabilidade de erro é menor. Foi a inserção desse campo que impactou nesse único e gigantesco problema, porque a empresa quer que continue no Excel. Manda quem pode, obedece quem tem juízo. Já pesquisei muito, mas ainda não conseguir unir em uma macro o split, vbNewLine e Range.MergeCells. Se alguém puder colaborar ou pensar fora da caixa, agradeço desde já. @Midori, mais uma vez, como sempre, agradeço pela sugestão.
  4. @Goobsegue a planilha para melhor entendimento Quem puder ajudar, agradeço desde já. Conformidade.zip
  5. Salve colegas! Já resolvi 90% do modelo de relatório pedido, mas tenho ainda uma questão pendente. Os dados são registrados na Plan2(Base) através de um formulário padrão. Na Plan3(Relatorio) existe um modelo de relatório, com células referenciadas por PROCV até então fácil de preencher com dados numéricos. Existe uma determinada célula referenciada na Plan2(Base) que tem que ser preenchida com o texto do relatório de conformidade. Como a altura máxima da célula é de 255 pixels, o texto não cabe nesta célula(B42) pois ultrapassa em muito esse tamanho. A largura do formulário vai da coluna B até coluna AF, portanto, tenho limites laterais, mas sem limites de linhas. Já quebrei a cabeça, então peço ajuda dos mais experientes. Preciso de um código que insira o texto de B42 até AF42, quebre o texto, insira* uma linha abaixo(B43:AF43), no mesmo limite lateral e assim sucessivamente, até a ultima linha do texto. O texto varia muito de tamanho, na maioria das vezes mais de uma página, por isso tem que inserir linhas, tem campos abaixo e não posso ter espaço em branco, senão criaria um range definido, com células mescladas. Pensei em criar um split com o próximo espaço vazio depois de 100 caracteres e jogar o texto para baixo, mas não consegui implementar o código. Agradeço desde já a ajuda de todos. *não pode pular linhas pois há mais campos abaixo, acaba sobrepondo os campos.
  6. Depois de muitos testes, uma apanhado de códigos que resolveram minha necessidade. Necessário adequação para problemas específicos. Sub FormataCélulas() Application.ScreenUpdating = False Dim cw As Double, rh As Double, cwA As Double, c As Range Dim lng As Long, lastrow As Long With Range("A32:AD32") .MergeCells = False cwA = .Cells(1).ColumnWidth For Each c In .Cells cw = cw + c.ColumnWidth Next c cw = cw + .Count * 0.66 .Cells(1).ColumnWidth = cw .Cells(1).wrapText = True .EntireRow.AutoFit rh = .RowHeight .Cells(1).ColumnWidth = cwA .MergeCells = True .RowHeight = rh .HorizontalAlignment = xlJustify .VerticalAlignment = xlJustify End With '------------------------------------------------------------------------------------------------------------------------------- For lng = lastrow To 1 Step -1 If Rows(lng).RowHeight > 408 Then Rows(lng + 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Rows(lng).Resize(1).Select Selection.RowHeight = 409 Cells(lng, "A").Resize(1, 32).Select With Selection .HorizontalAlignment = xlGeneral .VerticalAlignment = xlTop .wrapText = True .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ReadingOrder = xlContext .MergeCells = True .ShrinkToFit = True End With End If If lastrow > 1 Then ActiveCell.Offset(-1, 0).Range("A32:AD32").Select End If lastrow = lastrow - 1 Next Application.ScreenUpdating = True End Sub
  7. Olá Senhores! Mais uma vez recorro ao conhecimento dos colegas aqui do fórum. No tópico anterior, este aqui, o problema foi resolvido com a colaboração dos colegas. Porém, com implementações, o relatório ficou mais detalhado. Por padrão, a altura de linha do Excel tem limite de 409 pontos e o texto atual de alguns relatórios tem superado este espaço, cortando o texto. Alguns relatórios utilizam 2 à 3 páginas Sei que o Excel não é a melhor ferramenta para esse fim, mas é o que tem para o momento. Se algum colega tiver ideia melhor de usar máscara de relatório ou resolver esse problema de mais de uma linha, agradeço desde já. Replicando o tópico original: "A empresa utiliza uma planilha que é uma máscara de formulário, onde as células são preenchidas facilmente com as funções INDICE+CORRESP. Porém, há um campo dinâmico, o único a ser preenchido, que não consigo resolver por VBA. Na célula A32 deve ser digitado um relatório de conformidade e vistoria. Esse relatório pode conter de 5 à "n" linhas. Manualmente é fácil mesclar as células, quebrar o texto e justificar o alinhamento do texto. Geralmente vai até o limite impresso do relatório, coluna T. Devido à essa variação do número de linhas do relatório e não poder haver linhas em branco, não consigo criar uma macro para mesclar as células, quebrar o texto e justificar o alinhamento, caso contrário seria só fixar uma range(A32:T"n") e aplicar a macro." cs_modelo.zip
  8. @Midorisem modéstia, ambas colaborações resolvem meu problema, de modos diferentes, mas atingem o mesmo propósito. Há situações onde preciso de tabela organizada por colunas e outras situações onde só uma coluna resolve o ÍNDICE+CORRESP. Por isso agradeço aos dois colegas por compartilharem do conhecimento, mais cebeças pensam melhor do que uma. Hoje ou amanhã devo postar outra situação para totalizar 3 planilhas diferentes... Começo de ano, com novas filiais e/ou terceirizados é uma tempestade de planilhas ainda sem padronização. E não sou programador, mas a necessidade é a mãe da criatividade...
  9. @Midori e @OreiaG muito obrigado por me auxiliarem nesse problema. Apenas indiquei a resposta do Midori como solução porque respondeu anteriormente, mas ambas as respostas resolvem prontamente a situação. Agradeço por compratilharem vosso tempo e vosso conhecimento.
  10. Bom dia senhores. Recorro mais uma vez ao conhecimento dos colegas. Passei a receber um arquivo em excel que foi convertido de um PDF. Essas conversões deixa a desejar, pois muitas vezes quebram tabelas, linhas e tabulações. O arquivo original em PDF possui 159 páginas, o que gera um arquivo .xls com 159 planilhas. Preciso juntar todas as planilhas em uma só, em sequencia, para organizar os dados e tabelas para gerar os relatórios. Em anexo envio um arquivo com uma situação semelhante. Desde já agradeço pela ajuda. Relacao-das-ruas-agupadas-por-bairro-em_01_12_22.zip
  11. @OreiaGMuito obrigado por compartilhar seu tempo e seu conhecimento. Atendeu plenamente minha necessidade.
  12. @ScofieldgynEncaminho um modelo com dados ficitícios, mas que atende minha necessidade. As células com margem são preenchidas através das funções ÍNDICE+CORRESP. Na célula A42 íncia uma região dinâmica, podendo ser de 5 à "n" linhas. Essa range tem que se auto-ajustar, delocando linhas para baixo ou para cima. Manualmente é fácil mesclar as células, quebrar o texto e justificar o alinhamento do texto. Geralmente vai até o limite impresso do relatório, coluna AD. Devido à essa variação do número de linhas do relatório e não poder haver linhas em branco, não consigo criar uma macro para mesclar as células, quebrar o texto e justificar o alinhamento, caso contrário seria só fixar uma range(A42:AD"n") e aplicar a macro. Agradeço desde já a ajuda recebida. cs_modelo.zip
  13. @ScofieldgynPerfeitamente, já estou trabalhando nas modificações, apenas adiantei o pedido de ajuda para iniciar a discussão sobre o problema. Grato pelo seu tempo.
  14. Olá Senhores! Mais uma vez recorro ao conhecimento dos colegas aqui do fórum. A empresa utiliza uma planilha que é uma máscara de formulário, onde as células são preenchidas facilmente com as funções INDICE+CORRESP. Porém, há um campo dinâmico, o único a ser preenchido, que não consigo resolver por VBA. Na célula A32 deve ser digitado um relatório de conformidade e vistoria. Esse relatório pode conter de 5 à "n" linhas. Manualmente é fácil mesclar as células, quebrar o texto e justificar o alinhamento do texto. Geralmente vai até o limite impresso do relatório, coluna T. Devido à essa variação do número de linhas do relatório e não poder haver linhas em branco, não consigo criar uma macro para mesclar as células, quebrar o texto e justificar o alinhamento, caso contrário seria só fixar uma range(A32:T"n") e aplicar a macro. Agradeço desde já a ajuda recebida.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...