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
orUtilisation 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.