Ir para conteúdo
Fórum Script Brasil
  • 0

VBA Dúvidas


Fabiooo

Pergunta

Olá,

Estou tendo problemas com meu código de VBA. Eu tenho uma variável, uma matriz string de 3 dimensões, que eu gero no Microsoft Project e quero compartilhá-la com o Excel. Ou seja, eu crio a variável no VBA do Project com os dados dos cronogramas e quero acessá-la no VBA do Excel.

Como eu faço isso? Sou meio leigo na linguagem do VBA, se possível poderiam me dar uma força?

Grato.

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Use o método do Excel Application.Run "'planilha.xls!'nome_da_macro", arg1, arg2

Onde nome_da_macro deve ser uma rotina que espera 2 argumentos (você pode colocar mais) e nesses argumentos você passa o valor de sua variável do Project.

Exemplo:

Código no Excel:

Sub nome_da_macro(byval var1, byval var2)
End Sub
Código no Project
Application.Run "'planilha.xls!'nome_da_macro", varProject1, varProjectN

Agora, confirme, por favor, se o Application.Run é do próprio Excel (se for terá de criar uma instância nele) ou se o Project tem também.

Link para o comentário
Compartilhar em outros sites

  • 0

O application.run também é um método do project, porém meu código não rodou.

Ao colocar esse método no vba e mandar rodar, não apresentou erro, porém o código da macro do excel não foi executado (coloquei uma msgbox para testar e ela não apareceu, nem mesmo uma célula do excel que eu havia mandado inserir um valor havia sido escrito). Quais alternativas eu tenho para que meu programa funcione?

Editado por Fabiooo
Link para o comentário
Compartilhar em outros sites

  • 0

Meu código não apresenta problema, já que é só uma rotina para pegar os dados do project e armazenar em uma variável de três dimensões. Mas se ajuda, vou postar:

Sub PesquisaSE()

Dim tTask As Task
Dim tSub As Task
Dim Revitalizacoes() As String
Dim MatCopia() As String
Dim SE As Integer
Dim x As Boolean


ReDim Revitalizacoes(1 To 1, 1 To 2, 1 To 10)

For Each tTask In ActiveProject.Tasks
    If tTask.OutlineLevel = 1 Then 
        Do Until x = True
            For a = 1 To UBound(Revitalizacoes, 1)                    
                If tTask.Text1 = Revitalizacoes(a, 1, 1) Then          
                    SE = a
                    x = True
                    Exit Do
                End If
            Next a
''''''''''ROTINA que redimensiona as LINHAS da MATRIZ REVITALIZACOES'''''''''''''''''''''''''''''
            ReDim MatCopia(1 To UBound(Revitalizacoes, 1), 1 To UBound(Revitalizacoes, 2), 1 To UBound(Revitalizacoes, 3)) 
            For a = 1 To UBound(Revitalizacoes, 1)                'copia de revitalizacoes para MatCopia
                For aa = 1 To UBound(Revitalizacoes, 2)
                    For aaa = 1 To UBound(Revitalizacoes, 3)
                        MatCopia(a, aa, aaa) = Revitalizacoes(a, aa, aaa)
                    Next aaa
                Next aa
            Next a
              
            ReDim Revitalizacoes(1 To UBound(Revitalizacoes, 1) + 1, 1 To UBound(Revitalizacoes, 2), 1 To UBound(Revitalizacoes, 3))        
            For a = 1 To UBound(MatCopia, 1)  
                For aa = 1 To UBound(MatCopia, 2)
                    For aaa = 1 To UBound(MatCopia, 3)
                        Revitalizacoes(a, aa, aaa) = MatCopia(a, aa, aaa)
                    Next aaa
                Next aa
            Next a
            
            Revitalizacoes(UBound(Revitalizacoes, 1), 1, 1) = tTask.Text1
            x = True
            SE = UBound(Revitalizacoes, 1)
        Loop
        x = False 
        
        For k = 1 To UBound(Revitalizacoes, 2)
            If Revitalizacoes(SE, k, 1) = "" Then
                Revitalizacoes(SE, k, 1) = tTask.Name
                DE = k
                If k = UBound(Revitalizacoes, 2) Then
''''''''''ROTINA que redimensiona as COLUNAS da MATRIZ REVITALIZACOES'''''''''''''''''''''''''''''
                    ReDim MatCopia(1 To UBound(Revitalizacoes, 1), 1 To UBound(Revitalizacoes, 2), 1 To UBound(Revitalizacoes, 3))
                    For a = 1 To UBound(Revitalizacoes, 1)
                        For aa = 1 To UBound(Revitalizacoes, 2)
                            For aaa = 1 To UBound(Revitalizacoes, 3)
                                MatCopia(a, aa, aaa) = Revitalizacoes(a, aa, aaa)
                            Next aaa
                        Next aa
                    Next a
              
                    ReDim Revitalizacoes(1 To UBound(Revitalizacoes, 1), 1 To UBound(Revitalizacoes, 2) + 1, 1 To UBound(Revitalizacoes, 3))        
                    For a = 1 To UBound(MatCopia, 1)
                        For aa = 1 To UBound(MatCopia, 2)
                            For aaa = 1 To UBound(MatCopia, 3)
                                Revitalizacoes(a, aa, aaa) = MatCopia(a, aa, aaa)
                            Next aaa
                        Next aa
                    Next a
                                        
                End If
                Exit For
            End If
        Next k
    End If
    
    For Each tSub In ActiveProject.Tasks
        tarefa = tSub.Text6 \ 10
        If tTask.Text6 = tarefa And tSub.OutlineLevel > 1 Then
            Select Case tSub.Name
                Case "Aquisição de Material"
                    Revitalizacoes(SE, DE, 2) = tSub.Start
                    Revitalizacoes(SE, DE, 3) = tSub.Finish
                Case "Montagem"
                    Revitalizacoes(SE, DE, 4) = tSub.Start
                    Revitalizacoes(SE, DE, 5) = tSub.Finish
                Case "Comissionamento"
                    Revitalizacoes(SE, DE, 6) = tSub.Start
                    Revitalizacoes(SE, DE, 7) = tSub.Finish
                Case "Obras Civis"
                    Revitalizacoes(SE, DE, 8) = tSub.Start
                    Revitalizacoes(SE, DE, 9) = tSub.Finish
            End Select
        End If
    Next tSub
Next tTask

'Debug.Print "SE: " & Revitalizacoes(2, 1, 1)                                                                                 'Códigos que usei para testar se a matriz estava coerente.
'Debug.Print "Descrição: " & Revitalizacoes(2, 2, 1)
'Debug.Print "Aquisição de Material: " & Revitalizacoes(2, 2, 2) & "----" & Revitalizacoes(2, 2, 3)

End Sub
A seguinte linha foi adicionada ao código após eu ler sua resposta, imediatamente antes de "End Sub":
Application.Run "'Anexo.xlsm'!mod1.Testando", Revitalizacoes, SE
Anexo é o arquivo do excel, mod1 é o nome do módulo e Testando é o nome da macro do excel. Agora segue o código da macro testando do excel:
Public Sub Testando(ByVal Revitalizacoes, ByVal SE)
MsgBox ("Aquisição de Material: " & Revitalizacoes(2, 2, 2) & "----" & Revitalizacoes(2, 2, 3))
End Sub

Quando rodo o código do project, não há erro algum e a matriz é gerada perfeitamente, porém a linha q eu adicionei não está chamando a macro Testando. É como se eu não tivesse colocado aquela linha.

Editado por Fabiooo
Link para o comentário
Compartilhar em outros sites

  • 0

Tenta desta forma:

Dim e As Object
Dim pasta As Object

Set e = CreateObject("Excel.Application")
Set pasta = e.Workbooks.Open("C:\Anexo.xlsm")
e.Visible = True
e.Run "'Anexo.xlsm'!mod1.Testando", Revitalizacoes, SE

Editado por João.Neto
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...