0
votes

Condition d'instruction VBA If qui vérifie si une ligne contient du texte

Exemple de feuille de calcul avec 2 espaces dans "Date de contrôle" Je n'ai pas de formation formelle en programmation, alors veuillez rester avec moi. J'essaie de créer une macro qui puisse vérifier si la ligne 1 de ma feuille active nommée "Exceptions" contient le texte "Control__Date" (ajout de traits de soulignement pour afficher 2 espaces car le formatage ne permettait pas d'afficher 2 espaces vides) ou "Control Date ". Malheureusement, je n'ai pas été en mesure de comprendre comment écrire une condition appropriée, car mon code ci-dessous continue de trouver la condition fausse.

Dim a As Range
Dim exceptions As Worksheet
Set exceptions = ActiveWorkbook.Worksheets("Exceptions")
For Each c In Exceptions.Range("A1:Z1")
    If c = "Control  Date" Then
    Cells.Find(What:="control  date", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate

Else
Cells.Find(What:="Control Date", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
End If
Next c

Merci d'avance!!

entrez la description de l'image ici


4 commentaires

Pourriez-vous clarifier, vous avez "Date de contrôle" deux fois dans votre question? contains the text "Control Date" or "Control Date"


Quand c = "Date de contrôle", pourquoi rechercher à nouveau presque le même texte? Veuillez partager avec nous le texte des en-têtes de colonnes qui font l'objet de la recherche, afin que nous puissions également voir les données.


Désolé pour la confusion, j'ai édité le message pour plus de clarté.


@donPablo La recherche est telle que ma macro sélectionne la colonne avec la date de contrôle, crée une nouvelle colonne, puis remplit cette nouvelle colonne avec la date de contrôle et le numéro de contrôle. Actuellement, je dois supprimer l'espace supplémentaire entre la date de contrôle avant d'exécuter la macro sur ces types de feuilles de calcul, mais j'aimerais ne plus avoir à gérer cela.


3 Réponses :


0
votes

Pourquoi dupliquer les données dans une troisième colonne? Chaque fois que vous avez besoin de la date «combinée», allez simplement la chercher, mais ne la stockez pas deux fois.

Option Explicit    '<<-- always have this


Sub doFindControl()

    Dim a As Range
    Dim c As Range  '<<-- add this
    Dim colDate As Long, colNumber As Long, colBlank As Long  '<<--add this
    Dim exceptions As Worksheet
    Set exceptions = ActiveWorkbook.Worksheets("Exceptions")
    For Each c In exceptions.Range("A1:Z1")
    
        ' first find the 2 key columns
        If InStr(c, "Control") > 0 Then
        
            If InStr(c, "Date") > 0 Then
                colDate = c.Column
            
            ElseIf InStr(c, "Number") > 0 Then
                colNumber = c.Column
            End If
        ' second look for the first blank column for you to put results in
        ElseIf c.Text = "" Then
                colBlank = c.Column
                Exit For    ' stop looking after its found
        End If
        
    Next c

    ' now you have the 2 FROM columns, and the TO column
    MsgBox (colDate & " " & colNumber & " " & colBlank)
    ' and you can loop thru all the rest of the rows doing combine

End Sub


0 commentaires

0
votes

Comment écrire la condition

Pour ce qui est de vérifier si la valeur de la cellule est "Date de contrôle" avec un seul espace ou une avec deux espaces, il existe deux façons de procéder:

Utilisez l'opérateur like

L' opérateur like facilite la comparaison d'une chaîne à un modèle de base. Dans cet exemple, l'utilisation du caractère générique * (zéro ou plusieurs caractères) retournera vrai quel que soit le nombre d'espaces entre le Control et la Date .

Public Sub Demo()
    Dim cell As Range
    For Each cell In Exceptions.Rows(1).Cells
        If cell.Value2 Like "Control*Date" Then
            ' Do something with that cell
        End If
    Next cell
End Sub

Utilisez l'opérateur or

Utilisation de l' opérateur ou ok à utiliser également, mais pas flexible et peut-être un peu plus difficile à voir ce qui se passe pour votre exemple spécifique.

For Each cell In Exceptions.Range("A1:Z1")
    ' Do something...
Next cell

Nom de code de la feuille de travail

Chaque feuille de calcul a ce qu'on appelle un nom de code . Il s'agit d'une référence qui peut être appelée directement dans le code vers cette feuille de calcul spécifique par son nom.

Pour définir ce nom, dans la fenêtre des propriétés, mettez à jour la propriété du name

Fenêtre IDE Properites

Donc au lieu de

Dim Exceptions As Worksheet
Set Exceptions = ActiveWorkbook.Worksheets("Exceptions")
For Each cell In Exceptions.Range("A1:Z1")
    ' Do something...
Next cell

vous pouvez appeler la référence de feuille de calcul directement

If cell.Value2 = "Control Date" Or cell.Value2 = "Control  Date" Then
    ' Do something with that cell
End If

Mettre ensemble

  • Au lieu d'utiliser c pour votre variable, j'aime rendre mes variables plus faciles à lire et à suivre, j'ai donc utilisé cell .
  • En outre, au lieu de coder en dur vos colonnes d'en-tête dans la plage, vous pouvez boucler les cellules de la première ligne entière. C'est une suggestion d'option cependant.
  • Enfin, soyez plus explicite dans la propriété que vous recherchez dans votre Cell . Dans mon exemple, j'utilise .value2 pour montrer que je recherche la valeur de cette cellule.
If cell.Value2 Like "Control*Date" Then
    ' Do something with that cell
End If


2 commentaires

Veuillez noter que les colonnes 16 et 17 ont un autre texte dans les cellules d'en-tête.


Ajouter un caractère * au début If cell.Value2 Like "*Control*Date" Then serait alors suffisant pour ignorer le texte avant également



0
votes

Merci pour toutes les réponses! La réponse de Robert Todar m'a conduit à mon moment d'ampoule, et je ne peux pas croire à quel point la réponse était simple. Tout ce que j'avais à faire était de changer ce code:

Cells.Find(What:="Control*Date", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate

à:

Cells.Find(What:="Control Date", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate


0 commentaires