2012-03-19 5 views
5

Nella Guida VBA per la proprietà RefersTo, forniscono questo esempio di elencazione di tutti i nomi in un Wkb (formattato in modo da poterlo eseguire com'è)i nomi eliminati in un file Wbk esistono ancora e fanno riferimento a percorsi inesistenti, lento Excel

Sub showNames()'from VBA Help for "RefersTo" 
    Dim newSheet As Worksheet 
    Set newSheet = Worksheets.Add 
    Dim i As Long, nm As Name 
    i = 1 
    For Each nm In ActiveWorkbook.Names 
    newSheet.Cells(i, 1).Value = nm.Name 
    newSheet.Cells(i, 2).Value = "'" & nm.RefersTo 
    i = i + 1 
    Next 
    newSheet.Columns("A:B").AutoFit 
End Sub 

Quando lo eseguo nel mio progetto corrente, vengono visualizzati molti nomi che pensavo fossero lontani. Ma qui sono ancora in giro e si riferiscono a luoghi che non esistono più. Penso che questo sia ciò che sta rallentando il mio sistema e mi piacerebbe sbarazzarmi di quei Nomi, ma non appaiono nella finestra Define Name quindi dove li trovo?

modifica: Significa che l'elemento Collegamenti è disattivato per questo WBK.

+0

Questa è una lunga, rotonda (e possibilmente brutto) soluzione, ma hai provato a migrare tutti i tuoi dati in una nuova cartella di lavoro? Se il wkb è corrotto in qualche modo, probabilmente lo risolverebbe. – Gaffi

risposta

1

- Risposta Aggiornato -

Dal momento che si conosce il i nomi degli intervalli non validi ma non possono visualizzarli in Gestione nomi, è possibile provare a eliminarli manualmente dalla finestra Immediata VBA. Il nome assegnato GrPix!patternListRange indica un nome di foglio di lavoro così si dovrebbe essere in grado di eliminarla digitando

ActiveWorkbook.Names("GrPix!patternListRange").Delete 

o

Sheets("GrPix").Names("patternListRange").Delete 

nella finestra immediata


risposta originale

Have yo hai provato a cancellare i nomi non validi tramite codice? vale a dire

For Each nm In ActiveWorkbook.Names 
    If InStr(nm.RefersTo, "OldFileName.xls") > 0 Then 
     nm.Delete 
    End If 
Next nm 
+0

Boy, ho davvero avuto grandi speranze per questa soluzione. come dovrebbe funzionare, ma no, non riesce a trovare nessuno dei nomi dei problemi – Roy

+0

@Roy, ma ShowNames li trova ancora? – mischab1

+0

Sì, ce ne sono 4, tutti i nomi legali e con i loro Refers To all b asalmente lo stesso schema di cui sopra nel riferirsi avanti e indietro tra PC e Mac. La psf è l'acronimo di Parallels Shared Folder. – Roy

6

Update

opzione 1
Un manual method per cancellare i nomi corrotti utilizzando R1C1 (posso ricordare JKP affermando su un altro forum doveva codice per fare questo, ma lui non era disposta a fornire gratuitamente)

  1. Selezionare Strumenti, Opzioni e fare clic sulla scheda Generale.
  2. Fare clic sulla casella di controllo accanto a "Stile di riferimento R1C1", in modo da modificare l'impostazione corrente.
  3. Premere OK.
  4. Excel ti chiederà di cambiare il nome di qualsiasi nome (in tutte le cartelle di lavoro aperte!) Che contiene caratteri non validi.
  5. Selezionare Inserisci, nome, definire per eliminare i nomi appena rinominati.
  6. Imposta lo stile di riferimento R1C1 come preferisci usando Strumenti, Opzioni, Generale.

opzione 2
Chris Neilsen postato in Any chance to delete programatically corrupt ranged names (with spaces) in Excel (2007/2010)

Ma, ecco una possibile alternativa: SaveAs la cartella di lavoro come un .xlsm Si dovrebbe ottenere una finestra lamentano nomi non validi, con un'opzione da rinominare e un pulsante Ok a tutti. Una volta salvato, chiudi e riapri il file , Salva con nome.xls e si dovrebbe essere pronti per partire

Initial Post
Scarica Name Manager che è il componente aggiuntivo distinguersi da Jan Karel Pieterse e Charles Williams per la gestione dei nomi

Sarà gestire nomi che

  • ora errore fuori come gli intervalli sono stati cancellati (il tuo problema),
  • link ad altre cartelle di lavoro,
  • ora sono corrotti

Plus convertirà nomi globali per i nomi dei fogli locali, e viceversa, e così via

enter image description here

+0

Grazie brettdj, ho usato Name Manager per molti anni e dipendono da questo per mantenere il mio codice pulito di vecchi nomi, ma questa volta non ha funzionato. Sto iniziando a pensare che il wkb potrebbe essere danneggiato, e Name Manager non è veramente costruito per gestirlo. Ecco un esempio di RefersTo per uno dei nomi fasulli: = '\\. Psf \ Shared su MacHD \ Documents and Settings \ All Users \ Documents \ Gridder su tutti gli utenti Documents \ [NewGridder142.xls] Landmarks'! $ P $ 2 0 0 \\. psf \ Shared su MacHD \ Documents and Settings \ Tutti gli utenti \ Documenti \ Gridder su tutti gli utenti Documenti \ [NewGridder142.xls] – Roy

+0

Ecco perché stavo chiedendo dove sono memorizzati questi nomi, quindi posso andare a eliminarli manualmente, forse al di fuori di Excel.Se potessi trovarli. – Roy

+0

+1 per recco su Name Manager. Sono totalmente d'accordo. Programma meraviglioso, e la maggior parte delle persone che cercano su questo argomento troveranno risolto il loro problema. Just not mine :( – Roy

1

Qui ci sono due soluzioni che possono funzionare per gli altri alla ricerca su questo argomento, ma questi ancora non risolvono il mio particolare cartella di lavoro.

Sto ancora cercando.

Si tratta di Aaron Sangue e mostra il metodo R1C1 citato da brettdj:

Sub RemoveDemonLinks() 
    Dim wbBook As Workbook 
    Dim nName As Name 
    Dim i  As Long 

    Set wbBook = ActiveWorkbook 

    i = 0 
    If wbBook.Names.Count > 0 Then 
     With Application 
     .ReferenceStyle = xlR1C1 
     .ReferenceStyle = xlA1 
     End With 

    For Each nName In wbBook.Name 
     If InStr(nName.RefersTo, "#REF!") > 0 Then nName.Delete 
     i = i + 1 
    Next nName 

    If i > 0 Then MsgBox i & " corrupted names was deleted from " & wbBook.Name 
    End If 
End Sub 

Questo è da MS Help

' Module to remove all hidden names on active workbook 
    Sub Remove_Hidden_Names() 

    ' Dimension variables. 
    Dim xName As Variant 
    Dim Result As Variant 
    Dim Vis As Variant 

    ' Loop once for each name in the workbook. 
    For Each xName In ActiveWorkbook.Names 

     'If a name is not visible (it is hidden)... 
     If xName.Visible = True Then 
      Vis = "Visible" 
     Else 
      Vis = "Hidden" 
     End If 

     ' ...ask whether or not to delete the name. 
     Result = MsgBox(prompt:="Delete " & Vis & " Name " & _ 
      Chr(10) & xName.Name & "?" & Chr(10) & _ 
      "Which refers to: " & Chr(10) & xName.RefersTo, _ 
      Buttons:=vbYesNo) 

     ' If the result is true, then delete the name. 
     If Result = vbYes Then xName.Delete 

     ' Loop to the next name. 
    Next xName 
End Sub 
+0

In che modo il codice 'Remove_Hidden_Names' non funziona? Non ha mai visualizzato una finestra di messaggio con i nomi che devono essere cancellati? Il processo di eliminazione ha avuto esito negativo? È stato eseguito senza errori ma i nomi non sono stati cancellati? – mischab1

+0

Ha funzionato senza errori e non ha trovato alcun nome nascosto. Immagino che i miei 4 nomi siano nascosti troppo bene. Ecco un altro esempio (il numero 1 è sopra) di un nome e Refers To che non dovrebbe esistere. Nome: GrPix! PatternListRange Fa riferimento a: = '\\. Psf \ Shared su MacHD \ Documents and Settings \ Tutti gli utenti \ Documenti \ Gridder su tutti gli utenti Documenti \ [NewGridder142.xls] Punti di riferimento'! $ Z $ 2 0 0 \\. psf \ Condiviso su MacHD \ Documents and Settings \ All Users \ Documents \ Gridder su tutti gli utenti Documents \ [NewGridder142.xls] – Roy

+0

e digita 'ActiveWorkbook.Names (" GrPix! patternListRange "). Delete' o' Sheets ("GrPix")) .Names ("patternListRange"). Delete' nella Finestra Immediata non funzionerà? Non ha senso. L'unica differenza tra le due procedure "For Loop" è che si utilizza una variante e l'altra utilizza una variabile dell'oggetto Name. Questo non dovrebbe fare alcuna differenza. Devo assecondare quello che dicono gli altri. Non penso di poter dare ulteriore aiuto senza guardare il file vero e proprio. – mischab1

Problemi correlati