Mon code trouve toutes les connexions internes dans un classeur externe, trouve toutes les feuilles cachées.
Ce que j'aimerais réaliser grâce à ces valeurs consiste à supprimer toutes les feuilles cachées qui ne sont pas des sources pour toute autre feuille de classeur. P>
Je sais que cela devrait être fait avec une boucle imbriquée, mais j'ai des problèmes de construire cela. p>
J'ai testé les trois réponses, rien ne se passe dans le code de code. p> Code complet à examiner: P>
p> Sub a()
Dim xSheet As Worksheet
Dim xRg As Range
Dim xCell As Range
Dim xCount As Long
Dim xLinkArr() As String
Dim wbmacro As Workbook
Dim wbtarget As Workbook
Dim strfile As String
Dim strpath As String
Dim filename As String
Dim hsheet As String
Set wbmacro = ActiveWorkbook
filename = Application.GetOpenFilename(FileFilter:="Excel Files,*.xlsx")
Set wbtarget = Workbooks.Open(filename, UpdateLinks:=0)
On Error Resume Next
For Each xSheet In wbtarget.Sheets
Set xRg = xSheet.UsedRange.SpecialCells(xlCellTypeFormulas)
If xRg Is Nothing Then GoTo LblNext
For Each xCell In xRg
If InStr(1, xCell.Formula, "!") > 0 Then
xCount = xCount + 1
ReDim Preserve xLinkArr(1 To 2, 1 To xCount)
xLinkArr(1, xCount) = xCell.Address(, , , True)
xLinkArr(2, xCount) = "'" & xCell.Formula
End If
Next
LblNext:
Next
If xCount > 0 Then
wbmacro.Activate
wbmacro.Sheets("Link Sheet").Activate
Range("A1").Resize(, 3).Value = Array("Location", "Reference", "Reference Sheet Name")
Range("A2").Resize(UBound(xLinkArr, 2), UBound(xLinkArr, 1)).Value = Application.Transpose(xLinkArr)
Columns("A:D").AutoFit
Else
MsgBox "No links were found within the active workbook.", vbInformation
End If
x = 2
For Each ws In wbtarget.Worksheets
If ws.Visible = xlSheetHidden Then
wbmacro.Sheets("Link Sheet").Cells(x, 4) = ws.Name
x = x + 1
End If
Next ws
wbmacro.Activate
Columns("A:C").Select
ActiveSheet.Range("$A$1:$B$758").RemoveDuplicates Columns:=1, Header:=xlNo
Dim rc As Range
For Each c In wbmacro.Sheets("Link Sheet").Range("D2:D10").Cells
' The default behaviour is to delete the sheet
bDeleteSheet = True
For Each rc In wbmacro.Sheets("Link Sheet").Range("C2:C10").Cells
If c.Value = rc.Value Then
' If you find the sheet name then it is used
' Do NOT delete it
bDeleteSheet = False
Exit For
End If
Next
If bDeleteSheet Then wbtarget.Sheets(c).Delete
Next
End Sub
4 Réponses :
boucle une fois et utilisez application.match () code> pour voir s'il existe:
Pourquoi ne pas supprimer le len code> vérifier et envelopper les feuilles (C) .Delete code> avec sur erreur CV Suivant code>? :)
J'obtiens une erreur dans la décalaction de type VBA après avoir exécuté ce code, ligne 4
Essayez quelque chose comme ça éditer:
J'ai ajouté Je dois aussi mentionner que c'est de loin le plus efficace ou code dynamique, mais il suit votre logique et c'est un bon point de départ. P> En réalité dans un petit code comme celui-ci, toute optimisation fera très peu de différence pour l'heure d'exécution du code. Cependant, lorsque votre code grandit et / ou si vous avez une boucle à travers plus de cellules, il existe des moyens d'optimiser votre code. P> Pour rendre votre code plus efficace Une règle générale consiste à minimiser toute interaction avec l'application Excel et à réaliser que vous avez des sujets Google comme "Comment lire ma plage dans la mémoire dans VBA" P>
li>
Pour rendre votre code plus dynamique google sujets comme "Comment faire référence à des gammes plus dynamiquement dans Excel VBA". À titre d'exemple au lieu de codage dur, le numéro de ligne Ceci est identique à partir de la dernière cellule dans la colonne C et appuyez sur Ctrl + up, ce qui vous mènera à la cellule usée de cette colonne, puis Lecture du numéro de ligne. P> Vous pouvez maintenant faire référence à la plage comme ceci: p> Notez que (à partir de l'image ci-dessus) .Cells code> en deux lignes: dans mon expérience omission que cela a causé des problèmes pour moi dans le passé. P>
10 code> dans votre gamme, vous pouvez le calculer comme ceci: p>
li>
ul> llastrow Code> a maintenant la valeur 3, ce qui signifie que votre code ne sera pas bouclé 7 fois plus inutilement. p> p>
Scott & Dwirony m'a battu, mais j'y suis arrivé alors qu'ils postaient ici's Voici le code que j'ai proposé: Remarque: j'ai défini deux références nommées dynamiques afin que cela ne soit pas nommé. T Peu important combien d'éléments sont dans la colonne C: Nom "Références" ou Colonne D: Nom "Hiddensheets" J'ai également commenté l'instruction DELETE et utilisé une boîte de message pour vérifier ce qui se passait. Notez l'utilisation d'afficheurs afin que vous n'obtiens pas à supprimer des boîtes de dialogue pour cliquer sur. Vous devrez également rajouter dans vos références entièrement qualifiées pour les classeurs pour supprimer les feuilles de. P> hth p> p>
Je pense que cela fonctionne parfaitement maintenant. J'ai mélangé vos codes:
Pourriez-vous s'il vous plaît expliquer comment votre capture d'écran se rapporte au code?
Dans la colonne c I, j'ai des noms de feuilles qui sont des sources pour d'autres feuilles de classeur. Dans la colonne D, j'ai des draps cachés dans un classeur. Ce que j'aimerais avoir, c'est d'éliminer toutes les feuilles cachées que les noms ne sont pas donnés dans la colonne C.