Código VBA para planilhas de cópia contendo intervalos nomeados da pasta de trabalho de origem à destino
-
28-10-2019 - |
Pergunta
Eu tenho 2 pastas de trabalho. Uma pasta de trabalho de origem e uma pasta de trabalho de destino. Eles são completamente iguais, exceto por 1 planilha que tem o mesmo nome em ambos, mas com dados diferentes (ambos contêm cerca de 30 planilhas). O que eu queria era copiar o resto das planilhas idênticas da pasta de trabalho de origem para a pasta de destino, deixando aquela planilha que adia os dados.
Basicamente, as planilhas idênticas presentes na pasta de trabalho de destino devem ser substituídas pelas da pasta de trabalho de origem. As planilhas contêm fórmulas e intervalos nomeados. Consegui escrever o código VBA para copiar as planilhas. Mas uma vez que os intervalos nomeados têm um escopo de pasta de trabalho. Os intervalos nomeados ainda se referem a locais nas pastas de trabalho de origem. Portanto, recebo 2 intervalos nomeados com o mesmo nome. Algo como:
'The one already present in the destination workbook (from the worksheet which was replaced)
Name=VaccStart , Refers To =Sheet2!$A$2
'The one due to the copied worksheet.
Name=VaccStart , Refers To =[C:\Users\.....\Source.xls]Sheet2!$A$2
Desejo que os intervalos nomeados se refiram à pasta de trabalho de destino e não à pasta de trabalho de origem ao copiá-los. Uma vez que todas as planilhas em ambas as pastas de trabalho são iguais e estou apenas substituindo-as.
Solução
Uma maneira fácil de contornar a criação inadvertida de link ao mover de uma pasta de trabalho de origem para a de destino é vincular novamente a pasta de trabalho de destino da fonte para ela mesma
Captura de tela para xl2010
- Editar .... Links
- 'Alterar fonte "e escolha o arquivo atual como a nova fonte
Outras dicas
Isso modificará os intervalos nomeados para remover a referência do arquivo externo:
Sub ResetNamedRanges()
Dim nm As Name
Dim sRefersTo As String
Dim iLeft As Integer
Dim iRight As Integer
For Each nm In ActiveWorkbook.Names
sRefersTo = nm.RefersTo
iLeft = InStr(sRefersTo, "[")
iRight = InStr(sRefersTo, "]")
If iLeft > 1 And iRight > 0 Then
sRefersTo = Left$(sRefersTo, iLeft - 1) & Mid$(sRefersTo, iRight + 1)
nm.RefersTo = sRefersTo
End If
Next nm
End Sub