0
votes

Boucle toutes les valeurs de la colonne A pour trouver tous les matchs de la colonne B

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>

 1 p> xxx pré >

J'ai testé les trois réponses, rien ne se passe dans le code de code. p>

Code complet à examiner: 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


2 commentaires

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.


4 Réponses :


1
votes

boucle une fois et utilisez application.match () pour voir s'il existe: xxx


2 commentaires

Pourquoi ne pas supprimer le len vérifier et envelopper les feuilles (C) .Delete avec sur erreur CV Suivant ? :)


J'obtiens une erreur dans la décalaction de type VBA après avoir exécuté ce code, ligne 4



1
votes

Essayez quelque chose comme ça xxx

éditer: J'ai ajouté .Cells en deux lignes: dans mon expérience omission que cela a causé des problèmes pour moi dans le passé.

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.

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.

  • 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"

  • 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 10 dans votre gamme, vous pouvez le calculer comme ceci: xxx

    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.

    Vous pouvez maintenant faire référence à la plage comme ceci: xxx

    Notez que (à partir de l'image ci-dessus) llastrow a maintenant la valeur 3, ce qui signifie que votre code ne sera pas bouclé 7 fois plus inutilement.


0 commentaires

0
votes

Scott & Dwirony m'a battu, mais j'y suis arrivé alors qu'ils postaient ici's Voici le code que j'ai proposé: xxx

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.

hth


0 commentaires

0
votes

Je pense que cela fonctionne parfaitement maintenant. J'ai mélangé vos codes: xxx


0 commentaires