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!!
3 Réponses :
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
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:
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
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
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
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
c
pour votre variable, j'aime rendre mes variables plus faciles à lire et à suivre, j'ai donc utilisé cell
.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
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
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
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.