locked
Problema com macros RRS feed

  • Pergunta

  •  

    Caros colegas,

     

    Trabalho em uma empresa que desenvolve software usando Visula FoxPro 8.0.

    Utilizamos como padrão para criação dos relatórios dos nossos sistemas o Excel.

    O sistema gera os relatórios da seguinte forma:

    1)       Os dados dos relatórios são processados e um cursor com o resultado final é criado

    2)       O Cursor é exportado para o formato Excel (COPY TO ... TYPE XL5)

    3)       O Excel é instanciado (lsheet = GetObject('','excel.sheet'))

    4)       A planilha gerada é aberta

    5)       Uma macro previamente gerada é inserida no Excel (objeto.ActiveWorkBook.VBProject.VBComponents.Import (...))

    6)       A macro é executada com a finalidade de formatar a planilha

    Este sistema tem funcionado bem desde a versão 97 do Excel, porém na versão 2007 alguns comandos de macro tem se comportado de maneira diferente e em algumas vezes gerando resultados diferentes a cada execução.

    Estou relatando abaixo as duas principais diferenças que encontrei.

     

     

    - Posicionamento de imagens – problema 1:
    Esta macro insere uma imagem em uma determinada célula:

        ActiveSheet.Cells(5, 5).Select

        ActiveSheet.Pictures.Insert ("c:\teste\logo.jpg")

    Comportamento no Office até a versão 2003:

    A figura seria corretamente posicionada dentro da célula, ou seja, as coordenadas (posições “top” e “left”) da imagem seriam as mesmas da célula.

    Comportamento no Office 2007:

    Insere a imagem em local aleatório. Nunca na célula selecionada.


    - Inclusão de texto em um Textbox:

    Esta macro adiciona a palavra “Office” a um Textbox que já possui a palavra “Microsoft”.
       
    ActiveSheet.Shapes.AddLabel(msoTextOrientationHorizontal, 100, 100, 100, 100).Select

        Selection.Text = "Microsoft"

        Selection.Characters(10).Insert String:=" Office"

    Comportamento no Office até a versão 2003:

    Obtenho um Textbox com o texto “Microsoft Office”

    Comportamento no Office 2007:

    Run-time error ‘1004’:

    Unable to get the Characters property of TextBox class.

     

    Alguém sabe alguma coisa a respeito?

    quarta-feira, 3 de outubro de 2007 17:38

Respostas

  • Caros amigos,

     

    Finalmente, após um longo período sem poder testar este problema, consegui encontrar uma solução.

    O erro ao posicionar as imagens está relacionado a diversos fatores, entre eles, o zoom.

    Fiz uma macro para testes usando imagens do próprio Windows contidas na pasta "C:\Windows\Web\Wallpaper\" para facilitar. Simulei este erro em uma máquina com Windows Vista e Office 2007. Esta mesma macro rodando em outro computador com Windows Vista e Office 2003 não apresenta problemas.

    Ao executar a macro observe a posição das imagens nas últimas colunas, por exemplo, a coluna ‘AJ’. Ela está totalmente forra de posição.

    Após constatar o erro, retirem a linha ‘ActiveWindow.Zoom = 90’, execute novamente e as imagens serão posicionadas corretamente. Como disse, isto está relacionado a diversos fatores e não tive tempo ainda de testar todos. Observem então que se removerem toda o código anterior a linha ‘ActiveWindow.Zoom = 90’, mantendo esta linha, as imagens também serão posicionadas corretamente.

    Espero que isto possa ajudar outros desenvolvedores.

     

    Atenciosamente,

     

    Luis Cesar

     

    Sub ErroImagem()

        '* Esquemas de Cores

        ActiveWorkbook.ResetColors

        ActiveWorkbook.Colors(55) = 14540253

        ActiveWorkbook.Colors(54) = 13382451

        ActiveSheet.Cells.Interior.ColorIndex = 2

       

        '* Exclui coluna do Tipo

        ActiveSheet.Columns("C:E").Delete Shift:=xlToLeft

     

        '* Limpa linha de cabeçalho

        ActiveSheet.Rows("1:1").ClearContents

       

        '* Ajusta largura das colunas

        ActiveSheet.Columns("C:C").EntireColumn.AutoFit

        ActiveSheet.Columns(1).ColumnWidth = 0.8

        For lc = 3 To 21

           ActiveSheet.Columns(lc).ColumnWidth = 20

        Next

       

        '* Insere 4 Linhas

        ActiveSheet.Rows("2:4").Insert Shift:=xlDown

        ActiveSheet.Range(Cells(2, 1), Cells(4, 1)).Font.ColorIndex = 0

       

        '* Formata Título (Padrão)

        With ActiveSheet.Range(Cells(3, 3), Cells(3, 21))

                .ClearContents

                .MergeCells = True

                .Value = "Título"

                .HorizontalAlignment = xlCenter

        End With

        ActiveSheet.Range(Cells(2, 1), Cells(4, 21)).Interior.Color = 14540253

        '* Altura das linhas

        ActiveSheet.Rows(2).RowHeight = 13.5

        ActiveSheet.Rows(4).RowHeight = 13.5

        ActiveSheet.Rows(5).RowHeight = 9

       

                       

        ActiveSheet.Rows(5).Insert Shift:=xlDown

        LinhaImg = 7

       

        '* O erro começa aqui

        ActiveWindow.Zoom = 90

        lDir = "C:\Windows\Web\Wallpaper\"

        Set FSO = CreateObject("Scripting.FileSystemObject")

        Set SourceFolder = FSO.GetFolder(lDir)

        li = 0

        ActiveSheet.Rows(LinhaImg).RowHeight = 85

        For Each FileItem In SourceFolder.Files

            If (Right(FileItem.Path, 3) = "jpg") Then

                li = li + 1

                ActiveSheet.Columns(li).ColumnWidth = 20

                InsereImagem FileItem.Path, ActiveSheet.Cells(LinhaImg, li)

                If li > 40 Then Exit For

            End If

        Next

       

    End Sub

     

     

    Sub InsereImagem(Imagem As String, lRange As Range)

        lRange.Select

        ActiveSheet.Pictures.Insert(Imagem).Select

        Selection.ShapeRange.Left = lRange.Left

        Selection.ShapeRange.Top = lRange.Top

        Selection.ShapeRange.Height = lRange.Height - 1

        If Selection.ShapeRange.Width > lRange.Width Then

            Selection.ShapeRange.Width = lRange.Width

        End If

        Selection.ShapeRange.Left = lRange.Left + _

                (lRange.Width - Selection.ShapeRange.Width) / 2

    End Sub

     

     

    quinta-feira, 7 de fevereiro de 2008 12:11

Todas as Respostas

  • Luis, com certeza o office 2007 mudou algumas coisas sim. Entretanto, até então não sei se foram pra melhorar (é o objetivo, espero realmente que sim né!rs)

    Não sei realmente o que pode estar acontecendo com a importação da imagem. Entretanto, se vc sempre a tem em um local fixo, na célula E5, no seu caso, trabalhe com as propriedades Left e Right, ou IncrementLeft e IncrementRigh.

    Referencie o objeto imagem da mesma forma que referenciou a textbox [ActiveSheet.Shapes("Nome da Imagem").Select; Selection.Left = x ou Selection.IncrementLeft = #12] e posicione-a no lugar desejado...

    Acho que logo após inserir a imagem, ela já estará selecionada...ae trabalhe apenas com o Selection diretamente jah...

     

    Referente à text box (ou seria um objeto label), não entendi realmente a intenção.
    Pelo que entendi de sua programação, vc adiciona um objeto label, determinando coordenadas e orientações, insere a palavra Microsoft e depois insere a palavra Office. Pq não inserir "Microsof Office" de uma vez soh?

    ActiveSheet.Shapes.AddLabel(msoTextOrientationHorizontal, 100, 100, 100, 100).Select

        Selection.Text = "Microsoft Office"

     

    Me corrija se estiver errado, ok?

     

    Faça os testes e retorne os resultados,

     

    Abraços!!

     

     

    sábado, 6 de outubro de 2007 00:45
  • Olá amigo!

    Tente da seguinte forma:

     

    ActiveSheet.Range("F13").Select
    ActiveSheet.Pictures.Insert ("c:/teste/logo.jpg")

     

    Aqui funcionou!

    quarta-feira, 10 de outubro de 2007 18:41
  • Galera, aproveitando o tópico gostaria de postar um problema que estou tendo com macros no excel 2007.

    Estou gravando uma macro que apenas insere uma imagem na respectiva planilha, porém quando vou executar a macro ela não executa nada.

    Depurando o código é possível notar que a inserção da imagem não foi gravada.

    Tentei fazer a mesma coisa no Word (2007 também) e deu certo, o problema parece ser com o excel mesmo.

    Alguma sugestão, idéia??

    Grato,

    Ricardo F. Matiazzo.
    sexta-feira, 25 de janeiro de 2008 13:21
  •  Unicolas wrote:
    Galera, aproveitando o tópico gostaria de postar um problema que estou tendo com macros no excel 2007.

    Estou gravando uma macro que apenas insere uma imagem na respectiva planilha, porém quando vou executar a macro ela não executa nada.

    Depurando o código é possível notar que a inserção da imagem não foi gravada.

    Tentei fazer a mesma coisa no Word (2007 também) e deu certo, o problema parece ser com o excel mesmo.

    Alguma sugestão, idéia??

    Grato,

    Ricardo F. Matiazzo.

     

    Ricardo,

    Testei o funcionamento do código abaixo no Excel 2007 e está funcionando sem problemas:

    Code Snippet
    Sub Inserir_Imagem()
        ActiveSheet.Shapes.AddPicture _
            "C:\Documents and Settings\All Users\Documentos\Minhas imagens\Amostras de imagens\Inverno.jpg", True, True, 100, 100, 70, 70
    End Sub

     

     

    Maiores informações sobre o método AddPicture podem ser encontrados no help do VBA.

    Acredito que responda à tua pergunta.

    []s

    sexta-feira, 25 de janeiro de 2008 15:40
  • Adilson, funcionou direitinho cara.

    Valeu mesmo, agora dá pra continuar desenvolvendo aqui.

    Obrigadão.

    []s
    sexta-feira, 25 de janeiro de 2008 15:56
  • Olá Unicolas,

     

    quando tiver nova dúvida, poste-a em um tópico separado (se necessário, com um link para um tópico de origem), para que possamos fechar as threads separadamente, ok?

     

    Obrigado. 

    domingo, 27 de janeiro de 2008 00:11
    Moderador
  • Olá Luiz Cláudio,

    Ok, lição aprendida.

    Abraços,

    Ricardo F. Matiazzo (Unicolas).
    segunda-feira, 28 de janeiro de 2008 13:54
  • Caros amigos,

     

    Desculpem-me pelo silencio no forum, mas tive problemas com outros sistemas e não dei continuidade na solução deste.

    Agradeço ao skyz!n’ e ao Sandro Luiz, mas o problema ainda persiste.

    Vou voltar para este problema em breve e informarei sobre uma solução ou, se não conseguir, uma macro para simular o ocorrido.

    Atenciosamente,

     

    Luis Cesar

     

    terça-feira, 29 de janeiro de 2008 15:45
  • Caros amigos,

     

    Finalmente, após um longo período sem poder testar este problema, consegui encontrar uma solução.

    O erro ao posicionar as imagens está relacionado a diversos fatores, entre eles, o zoom.

    Fiz uma macro para testes usando imagens do próprio Windows contidas na pasta "C:\Windows\Web\Wallpaper\" para facilitar. Simulei este erro em uma máquina com Windows Vista e Office 2007. Esta mesma macro rodando em outro computador com Windows Vista e Office 2003 não apresenta problemas.

    Ao executar a macro observe a posição das imagens nas últimas colunas, por exemplo, a coluna ‘AJ’. Ela está totalmente forra de posição.

    Após constatar o erro, retirem a linha ‘ActiveWindow.Zoom = 90’, execute novamente e as imagens serão posicionadas corretamente. Como disse, isto está relacionado a diversos fatores e não tive tempo ainda de testar todos. Observem então que se removerem toda o código anterior a linha ‘ActiveWindow.Zoom = 90’, mantendo esta linha, as imagens também serão posicionadas corretamente.

    Espero que isto possa ajudar outros desenvolvedores.

     

    Atenciosamente,

     

    Luis Cesar

     

    Sub ErroImagem()

        '* Esquemas de Cores

        ActiveWorkbook.ResetColors

        ActiveWorkbook.Colors(55) = 14540253

        ActiveWorkbook.Colors(54) = 13382451

        ActiveSheet.Cells.Interior.ColorIndex = 2

       

        '* Exclui coluna do Tipo

        ActiveSheet.Columns("C:E").Delete Shift:=xlToLeft

     

        '* Limpa linha de cabeçalho

        ActiveSheet.Rows("1:1").ClearContents

       

        '* Ajusta largura das colunas

        ActiveSheet.Columns("C:C").EntireColumn.AutoFit

        ActiveSheet.Columns(1).ColumnWidth = 0.8

        For lc = 3 To 21

           ActiveSheet.Columns(lc).ColumnWidth = 20

        Next

       

        '* Insere 4 Linhas

        ActiveSheet.Rows("2:4").Insert Shift:=xlDown

        ActiveSheet.Range(Cells(2, 1), Cells(4, 1)).Font.ColorIndex = 0

       

        '* Formata Título (Padrão)

        With ActiveSheet.Range(Cells(3, 3), Cells(3, 21))

                .ClearContents

                .MergeCells = True

                .Value = "Título"

                .HorizontalAlignment = xlCenter

        End With

        ActiveSheet.Range(Cells(2, 1), Cells(4, 21)).Interior.Color = 14540253

        '* Altura das linhas

        ActiveSheet.Rows(2).RowHeight = 13.5

        ActiveSheet.Rows(4).RowHeight = 13.5

        ActiveSheet.Rows(5).RowHeight = 9

       

                       

        ActiveSheet.Rows(5).Insert Shift:=xlDown

        LinhaImg = 7

       

        '* O erro começa aqui

        ActiveWindow.Zoom = 90

        lDir = "C:\Windows\Web\Wallpaper\"

        Set FSO = CreateObject("Scripting.FileSystemObject")

        Set SourceFolder = FSO.GetFolder(lDir)

        li = 0

        ActiveSheet.Rows(LinhaImg).RowHeight = 85

        For Each FileItem In SourceFolder.Files

            If (Right(FileItem.Path, 3) = "jpg") Then

                li = li + 1

                ActiveSheet.Columns(li).ColumnWidth = 20

                InsereImagem FileItem.Path, ActiveSheet.Cells(LinhaImg, li)

                If li > 40 Then Exit For

            End If

        Next

       

    End Sub

     

     

    Sub InsereImagem(Imagem As String, lRange As Range)

        lRange.Select

        ActiveSheet.Pictures.Insert(Imagem).Select

        Selection.ShapeRange.Left = lRange.Left

        Selection.ShapeRange.Top = lRange.Top

        Selection.ShapeRange.Height = lRange.Height - 1

        If Selection.ShapeRange.Width > lRange.Width Then

            Selection.ShapeRange.Width = lRange.Width

        End If

        Selection.ShapeRange.Left = lRange.Left + _

                (lRange.Width - Selection.ShapeRange.Width) / 2

    End Sub

     

     

    quinta-feira, 7 de fevereiro de 2008 12:11