Microsoft 365 Comment dit-on en VBA "fait partie de" ?

Dem8

XLDnaute Nouveau
Bonsoir à tous,

J'ai une petite question qui, je pense, ne nécessite pas de joindre un fichier.

En gros, je clique sur une cellule puis sur un bouton. Cela lance la création et l'enregistrement d'un nouveau fichier qui est renommé d'après le contenu de la cellule sélectionnée (ou active).

J'aimerais que la formule fonctionne uniquement si la cellule sélectionnée fait partie de la colonne A. Est-ce que c'est possible ? Si oui, comment dit-on ça en VBA ?

Cordialement,

Dem8
 

soan

XLDnaute Barbatruc
Inactif
Bonsoir Dem8,

à mettre dans la macro appelée par le bouton.

(macro d'un module standard tel que Module1)

VB:
If ActiveCell.Column = 1 Then 'uniquement pour la colonne A
  'ton code ici, qui s'exécutera seulement si la colonne de
  'la cellule active est la 1ère colonne, donc la colonne A.
End If



par contre, si la macro appelée fait partie du code d'une feuille,
alors utiliser Intersect, comme indiqué dans les posts #3 et #4.

(mais ça dépend aussi du contexte réel)

soan
 
Dernière édition:

Dem8

XLDnaute Nouveau
Quelle réactivité ! Merci à tous les trois @soan @kiki29 @Marcel32 !

J'ai d'abord essayé le plus simple en testant ActiveCell.Column = 1. La formule fonctionne nickel.
J'ai ensuite voulu comprendre comment fonctionnait la méthode Intersect. La formule fonctionne aussi donc, à priori, je n'ai pas fait d'erreur.

Voici le code dans son intégralité :

Code:
'Formule pour créer le fichier Word avec le code barre du numéro de référence sélectionné

Private Sub CommandButton3_Click()

If Not Application.Intersect(ActiveCell.Rows, Range("A:A")) Is Nothing Then

'If ActiveCell.Column = 1 Then

Application.ScreenUpdating = False

Dim enregistrersous As String
enregistrersous = "C:\Users\" & Environ("username") & "\Desktop\" & ActiveCell.Value & " (barcode).docx"

Set wordapp = CreateObject("word.Application")
wordapp.documents.Open "C:\Users\" & Environ("username") & "\support files\support file (barcode).docx"
wordapp.Visible = True

ActiveCell.Offset(0, 4).Font.Size = 85
ActiveCell.Offset(0, 4).Copy
wordapp.activedocument.Range.PasteSpecial (xlPasteValues)
ActiveCell.Offset(0, 4).Font.Size = 11

Application.CutCopyMode = False

Application.DisplayAlerts = False

wordapp.Application.activedocument.SaveAs enregistrersous
wordapp.Application.Quit

Application.DisplayAlerts = True

Else

MsgBox "Please select a reference number"

End If

End Sub
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
@Dem8

J'ai d'abord essayé le plus simple en testant ActiveCell.Column = 1. La formule fonctionne nickel.

merci pour ton retour ! :)



J'ai ensuite voulu comprendre comment fonctionnait la méthode Intersect. La formule fonctionne aussi.

perso, je n'ai jamais eu besoin d'utiliser Intersect dans un module standard tel que Module1 ; je l'utilise uniquement dans le code d'une feuille, et dans une procédure événementielle ; car dans une sub comme Worksheet_SelectionChange() ou Worksheet_Change() je teste Intersect() entre Target et un Range ; et encore, dans certains cas, je passe par une autre méthode, par exemple en testant Target.Address si le range est une seule cellule ! :)

rappel : les procédures événementielles n'ont pas toutes l'argument Target ! donc c'est seulement si Target est présent dans les arguments de la sub événementielle que j'utilise éventuellement Intersect.​

soan
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
J'ai d'abord essayé le plus simple en testant ActiveCell.Column = 1. La formule fonctionne nickel.
J'ai ensuite voulu comprendre comment fonctionnait la méthode Intersect. La formule fonctionne aussi donc, à priori, je n'ai pas fait d'erreur.

Voici le code dans son intégralité :
Tu peux aussi, si besoin, vérifier que tu as bien une seule cellule active en testant si Selection.Cells.Count=1. ;)
 

Dem8

XLDnaute Nouveau
@Dem8



merci pour ton retour ! :)





perso, je n'ai jamais eu besoin d'utiliser Intersect dans un module standard tel que Module1 ; je l'utilise uniquement dans le code d'une feuille, et dans une procédure événementielle ; car dans une sub comme Worksheet_SelectionChange() ou Worksheet_Change() je teste Intersect() entre Target et un Range ; et encore, dans certains cas, je passe par une autre méthode, par exemple en testant Target.Address si le range est une seule cellule ! :)

rappel : les procédures événementielles n'ont pas toutes l'argument Target !​

soan
Oulà, tu m'as perdue, c'est un langage trop avancé pour moi. Je ne sais même pas ce qu'est un argument Target... 😅
 

soan

XLDnaute Barbatruc
Inactif
@Dem8

un argument = un paramètre de la sub ; car on peut envoyer des paramètres à une sub, et ils apparaissent sur la 1ère ligne de la sub, entre les parenthèses, juste à droite du nom de la sub ; exemple :​

VB:
Sub Job(ligne As Long) 'ligne est un argument de la sub Job, de type entier long

dans certaines procédures événementielles (pas toutes), le paramètre Target peut être présent ; c'est mis automatiquement quand tu choisis la sub événementielle dans la liste adéquate ; dans de tels cas, Target représente en fait la cellule sélectionnée, ou le groupe de cellules sélectionnées.​

soan
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Oulà, tu m'as perdue, c'est un langage trop avancé pour moi. Je ne sais même pas ce qu'est un argument Target... 😅
Un argument, c'est un paramètre que tu passes à une fonction ou à une macro.

Si tu regardes la macro Worksheet_SelectionChange d'une feuille, tu vois qu'elle est de cette forme :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
...
End Sub

Target est l'argument passé par valeur à la macro Worksheet_SelectionChange.
Et Target est ici la plage (d'une ou plusieurs cellules) que tu as sélectionnée.
Ainsi, dans cette macro tu peux utiliser Target ou Selection, ça représente la même chose (la plage sélectionnée). ;)
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
ajouter un test d’existence du fichier serait judicieux a mon avis

VB:
Sub test()
    Dim chemin$, x As Boolean, wordapp As Object, part$
    x = ActiveCell.Column = 1    'determine un boolean selon si la colonne active est la "A"
    part = Sheets(1).Cells(ActiveCell.Row, "E")    ' partie du nom dans la colonne "E" de la meme ligne
    chemin = "C:\Users\" & Environ("username") & "\Desktop\" & part & " (barcode).docx"    'chemin
    If Dir(chemin) = "" Then MsgBox "ce fichier n'existe pas": Exit Sub    ' test de l'existance du fichier avant d'essayer de l'ouvrir

    If x Then
        Application.ScreenUpdating = False

        Set wordapp = CreateObject("word.Application")
        wordapp.documents.Open chemin
        wordapp.Visible = True

        Sheets(1).Cells(ActiveCell.Row, "E").Font.Size = 85
        Sheets(1).Cells(ActiveCell.Row, "E").Copy
        wordapp.activedocument.Range.PasteSpecial (xlPasteValues)
        Sheets(1).Cells(ActiveCell.Row, "E").Font.Size = 11

        With Application: .CutCopyMode = False: .DisplayAlerts = False: End With

        With wordapp.Application: .activedocument.SaveAs chemin: .Quit: End With
        Application.DisplayAlerts = True

    Else

        MsgBox "Please select a reference number"

    End If

End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 913
Messages
2 093 534
Membres
105 751
dernier inscrit
fred13340