Enumere, cambie o elimine referencias de fórmulas externas (enlaces) usando VBA en Microsoft Excel

Anonim

Con las macros a continuación, puede buscar y eliminar fórmulas en celdas que hacen referencia a otros libros de trabajo.
Las macros no encuentran todas las referencias externas ya que solo buscan en las fórmulas de la hoja de trabajo.

Sub DeleteOrListLinks () Dim i As Integer If ActiveWorkbook is Nothing Entonces Salga de Sub i = MsgBox ("SÍ: Eliminar referencias de fórmulas externas" & Chr (13) & _ "NO: Listar referencias de fórmulas externas", _ vbQuestion + vbYesNoCancel, "Eliminar o enumerar referencias de fórmulas externas ") Seleccione Case i Case vbYes DeleteExternalFormulaReferences Case vbNo ListExternalFormulaReferences Fin Seleccione End Sub Sub DeleteExternalFormulaReferences () Dim ws As Worksheet, AWS As String, ConfirmReplace As Boolean Dim i As Integer, OK As Boolean Si ActiveWorkbook no es nada Entonces salga Sub i = MsgBox ("¿Confirmar todos los reemplazos de referencias de fórmulas externas con valores?", _ VbQuestion + vbYesNoCancel, "Convertir referencias de fórmulas externas") ConfirmReplace = False If i = vbCancel Then Exit Sub If i = vbYes Then ConfirmReplace = True AWS = ActiveSheet.Name Application.ScreenUpdating = False para cada ws en ActiveWorkbook.Worksheets OK = DeleteLinksInWS (ConfirmReplace, ws) Si no es correcto, salga para el siguiente ws Establecer ws = Nothing Sheets (A WS) .Select Application.ScreenUpdating = True End Sub Private Function DeleteLinksInWS (ConfirmReplace As Boolean, _ ws As Worksheet) As Boolean Dim cl As Range, cFormula As String, i As Integer DeleteLinksInWS = True Si ws no es nada, salga de la aplicación de función. StatusBar = "Eliminando referencias de fórmulas externas en" & _ ws.Name & "…" ws.Activate For Each cl En ws.UsedRange cFormula = cl.Formula If Len (cFormula)> 0 Then If Left $ (cFormula, 1) = "=" Then If InStr (cFormula, "[")> 1 Then If Not ConfirmReplace Then cl.Formula = cl.Value Else Application.ScreenUpdating = True cl.Select i = MsgBox ("¿Reemplazar la fórmula con el valor?", _ vbQuestion + vbYesNoCancel, _ "Reemplazar la referencia de fórmula externa en" & _ cl.Address (False, False, xlA1) & _ "con el valor de la celda?") Application.ScreenUpdating = False If i = vbCancel Then DeleteLinksInWS = False Exit Function End If If i = vbYes Then On Error Resume Next 'en caso de que la hoja de trabajo esté protegida cl.Formula = cl.Value On Error GoTo 0 End If E nd If End If End If End If Next cl Set cl = Nothing Application.StatusBar = False End Function Sub ListExternalFormulaReferences () Dim ws como hoja de trabajo, TargetWS como hoja de trabajo, SourceWB como libro de trabajo Si ActiveWorkbook no es nada, salga de la subaplicación.ScreenUpdating = False con ActiveWorkbook en caso de error Reanudar Siguiente Establecer TargetWS = .Worksheets.Add (Antes: =. Worksheets (1)) Si TargetWS no es nada Entonces 'el libro de trabajo está protegido Establecer SourceWB = ActiveWorkbook Establecer TargetWS = Workbooks.Add.Worksheets (1) SourceWB.Activate Establecer SourceWB = Nothing End If With TargetWS .Range ("A1"). Fórmula = "Secuencia" .Rango ("B1"). Fórmula = "Celda" .Rango ("C1"). Fórmula = "Fórmula" .Rango ( "A1: C1"). Font.Bold = Verdadero Terminar con para cada ws en .Worksheets. ("A: C"). Autoajuste en caso de error Continuar siguiente .Name = "Lista de enlaces" en caso de error Ir a 0 Finalizar con Establecer TargetWS = Nada Aplicación.ScreenUpdati ng = True End Sub Private Sub ListLinksInWS (ws como hoja de trabajo, TargetWS como hoja de trabajo) Dim cl como rango, cFormula como cadena, tRow tan largo si ws no es nada Entonces salga de Sub Si TargetWS no es nada y luego salga de la sub aplicación. referencias de fórmulas en "& _ ws.Name &"… "Para cada cl En ws.UsedRange cFormula = cl.Formula If Len (cFormula)> 0 Then If Left $ (cFormula, 1) =" = "Then If InStr (cFormula , "[")> 1 Luego con TargetWS tRow = .Range ("A" & .Rows.Count) .End (xlUp) .Row + 1 .Range ("A" & tRow) .Formula = tRow - 1 .Range ("B" & tRow) .Formula = ws.Name & "!" & _ cl.Address (False, False, xlA1) .Range ("C" & tRow) .Formula = "'" & cFormula End With End If End If End If Next cl Set cl = Nothing Application.StatusBar = False End Sub