7
votes

Suppression de toutes les colonnes sauf les colonnes avec certains titres

J'essaie de formater des données exportées et de supprimer plusieurs colonnes. Je veux garder des colonnes avec certains rubriques. Pour une commodité si j'ai 15 colonnes et que je veux garder des colonnes avec les en-têtes suivantes;

état Ville Nom Client Produit

Mon inquiétude est que les données que j'exprime peuvent changer et que des colonnes pourraient être ajoutées à l'avenir. Je veux pouvoir filtrer des colonnes indésirables et conserver les colonnes susmentionnées.

Edit: J'utilise Excel et je n'ai jamais écrit une ligne de code avant de ma vie. Jamais.


1 commentaires

Exceller? Accès? Quel programme utilisez-vous?


3 Réponses :


3
votes

Je suppose que nous parlons d'excellence ici. Si tel est ainsi itérant à travers vos colonnes avec une boucle tandis que la boucle et que vous décidez de garder ou de ne pas conserver devrait faire le tour.

Sub deleteIrrelevantColumns()
    Dim keepColumn As Boolean
    Dim currentColumn As Integer
    Dim columnHeading As String

    currentColumn = 1
    While currentColumn <= ActiveSheet.UsedRange.Columns.Count
        columnHeading = ActiveSheet.UsedRange.Cells(1, currentColumn).Value

        'CHECK WHETHER TO KEEP THE COLUMN
        keepColumn = False
        If columnHeading = "State" Then keepColumn = True
        If columnHeading = "City" Then keepColumn = True
        If columnHeading = "Name" Then keepColumn = True
        If columnHeading = "Client" Then keepColumn = True
        If columnHeading = "Product" Then keepColumn = True


        If keepColumn Then
        'IF YES THEN SKIP TO THE NEXT COLUMN,
            currentColumn = currentColumn + 1
        Else
        'IF NO DELETE THE COLUMN
            ActiveSheet.Columns(currentColumn).Delete
        End If

        'LASTLY AN ESCAPE IN CASE THE SHEET HAS NO COLUMNS LEFT
        If (ActiveSheet.UsedRange.Address = "$A$1") And (ActiveSheet.Range("$A$1").Text = "") Then Exit Sub
    Wend

End Sub


3 commentaires

Merci. Je vais le tester demain. Je l'ai marqué "VBA". N'était-ce pas assez clair?


Cela ne fonctionne pas. Il supprime la première colonne qu'elle rencontre qui ne respecte pas les critères «Colonne de colonne», puis s'arrête. L'exécution à nouveau supprimera la prochaine rubrique de colonne qui ne répond pas aux critères. Lorsqu'il rencontre un titre de colonne spécifié, il s'arrête et ne fait rien. Quelqu'un d'autre a des suggestions?


Étrange, ça marche pour moi. Je dois admettre que la solution de David est un Néache beaucoup.



13
votes

Essayez celui-ci.

Itéréter sur les colonnes dans l'ordre inverse, vérifiez les en-têtes dans un boîtier de sélection et supprimez au besoin. P>

Sub deleteIrrelevantColumns()
    Dim currentColumn As Integer
    Dim columnHeading As String

    ActiveSheet.Columns("L").Delete

    For currentColumn = ActiveSheet.UsedRange.Columns.Count To 1 Step -1

        columnHeading = ActiveSheet.UsedRange.Cells(1, currentColumn).Value

        'CHECK WHETHER TO KEEP THE COLUMN
        Select Case columnHeading
            Case "State", "City", "Name", "Client", "Product"
                'Do nothing
            Case Else
                'Delete if the cell doesn't contain "Homer"
                If Instr(1, _
                   ActiveSheet.UsedRange.Cells(1, currentColumn).Value, _
                   "Homer",vbBinaryCompare) = 0 Then

                    ActiveSheet.Columns(currentColumn).Delete

                End If
        End Select
    Next

End Sub


6 commentaires

Merci! Jusqu'à présent, cela fonctionne vraiment bien. Existe-t-il un moyen d'intégrer quelque chose dans la section "Vérifier s'il faut garder la section" de la colonne "pouvant détecter si un mot particulier est dans la rubrique colonne? J'ai réalisé que j'ai une en-tête de colonne qui lit "type de produit / catégorie de produits", mais elle est séparée en deux lignes. Au début, j'ai essayé d'ajouter; Cellules.Sélectionnez avec la sélection .wraptext = Faux extrémité avec puis utilisez votre code. Mais il ne détecte pas la rubrique "Type de produit / Catégorie de produit" et continue de la supprimer.


Vous pouvez utiliser la fonction Instr pour vérifier la présence d'un mot / chaîne dans une chaîne.


Merci! J'apprécie l'aide.


Aucun problème. Voici un exemple de cette fonction utilisée: INSTR (1, "Marge et Homer Simpson", "Homer", VBBRYCOMPARE) Une valeur de 0 signifie que la recherche n'a pas été trouvée , toute valeur autre que 0 signifie que la recherche a été trouvée.


Comment puis-je incorporer cela dans votre code de coas de sélection? Donc, disons Homer / Simpson était l'en-tête de colonne et je voulais garder cette colonne?


@ Subvention Désolé je ne sais pas. Il est probablement pas nécessaire de rester inutile de tout ce que je faisais pour déboguer cela à l'époque, mais c'était il y a près de six ans lol.



1
votes

J'ai eu un problème similaire et c'est le code qui a fonctionné pour moi. Je pense que c'est beaucoup plus simple.

Range("A1").Select

Do Until ActiveCell.Value = ""

    If ActiveCell.Value = "Forecast Status" _
        Or ActiveCell.Value = "Amount " _
        Or ActiveCell.Value = "Service Booking Value " _
        Or ActiveCell.Value = "Transaction Number" _
        Or ActiveCell.Value = "Last Modified by" _
        Or ActiveCell.Value = "Last Modified Date" _
        Or ActiveCell.Value = "T# Comparison" _
        Or ActiveCell.Value = "Amount Comparison" _
        Or ActiveCell.Value = "Forecast Status Comparison" _
        Or ActiveCell.Value = "First Ship Date Comparison" Then

        ActiveCell.Offset(0, 1).Select

    Else

        ActiveCell.EntireColumn.Select
        Selection.Delete Shift:=xlToLeft
        Selection.End(xlUp).Select

    End If
Loop


1 commentaires

Ouais, ça va être une "erreur" sur la déclaration "beaucoup plus simple".