Quais etapas são necessárias para usar este código VB no Excel 2013?

0

Estou tentando usar o código VB em esta pergunta no Excel 2013 e não está funcionando. Eu não estou familiarizado com o VB e provavelmente estou perdendo um passo simples.

Private Sub Workbook_TwoWayMatch(ByVal Sh As Object, ByVal Target As Range) 
If UCase(Sh.Name) = "sheet1" Or UCase(Sh.Name) = "sheet2" Then 
    If Not Application.Intersect(Target, Range("A1")) Is Nothing Then 
        Application.EnableEvents = False 
        If UCase(Target.Parent.Name) = "SHEET1" Then 
            Sheets("Sheet2").Range("A1") = Target 
        Else 
            Sheets("Sheet1").Range("A1") = Target 
        End If 
        Application.EnableEvents = True 
    End If 
 End If
End Sub

Usando uma nova pasta de trabalho com planilhas denominadas Sheet1 e Sheet2, tentei o seguinte no Visual Basic:

  • colando o código no objeto: ThisWorkbook
  • colando o código nos objetos: Folha1 (Folha1) e Folha2 (Folha2)
  • colando o código em todos os 3 objetos
  • garantindo que a pasta de trabalho seja salva como macro ativada
  • garantindo que as configurações de segurança da pasta de trabalho estejam definidas para confiar no acesso ao modelo de objeto VBA e que as macros estejam ativadas

O que preciso fazer para que esse código seja executado?

Em resposta à sugestão da Caneca de Mat:

Eu coloquei o código em um módulo padrão como você sugeriu, mudei o procedimento para Public e modifiquei o intervalo. No entanto, ainda não consigo copiar os valores do intervalo de uma folha para a outra. O código é assim agora:

Public Sub Workbook_TwoWayMatch(ByVal Sh As Object, ByVal Target As Range)
If UCase(Sh.Name) = "SHEET1" Or UCase(Sh.Name) = "SHEET2" Then
    If Not Application.Intersect(Target, Range("A1:J23")) Is Nothing Then
        Application.EnableEvents = False
        If UCase(Target.Parent.Name) = "SHEET1" Then
            Sheets("Sheet2").Range("A1:J23") = Target
        Else
            Sheets("Sheet1").Range("A1:J23") = Target
        End If
        Application.EnableEvents = True
    End If
 End If
End Sub
    
por raindelay 17.12.2015 / 22:30

2 respostas

1

ThisWorkbook e SheetX objetos são módulos especiais "document" class ; macros são mais facilmente expostas em módulos padrão , então ao invés de colá-lo em todos os lugares, adicione um novo módulo de código (.bas) e cole-o lá.

A maneira mais fácil de adicionar um novo módulo de código é clicar com o botão direito do mouse em qualquer lugar no Explorador de Projetos (Ctrl + R) e selecionar Inserir > Módulo .

O próximo problema é que o procedimento é Private . "Particular" significa que qualquer código que precise ver e chamar esse procedimento deve estar no mesmo escopo - ou seja, no mesmo módulo. Faça Public e você poderá ligar de qualquer lugar.

O próximo problema, são os parâmetros. A partir da implementação, parece que Sh deve ser um objeto Worksheet e Target é um objeto Range : para executar o procedimento, você precisará fornecer os parâmetros.

Existem muitas maneiras de fazer isso.

Um deles é abrir o painel imediato (Ctrl + G) e chamá-lo diretamente:

Module1.Workbook_TwoWayMatch Sheet42, Sheet42.Range("Z123")

É claro que os parâmetros reais que você passará variam dependendo do que você está tentando alcançar, mas espero que você entenda a ideia.

    
por 17.12.2015 / 23:01
0

O problema pode ser que UCase(Sh.Name) = "sheet1" na linha 2 nunca acontecerá.

Tente alterá-los para "SHEET1" e "SHEET2" .

    
por 18.12.2015 / 03:21