Sélectionner une cellule spécifique sur une plage donnée

Bonjour les gens,

J'ai un petit problème concernant les sélections de cellule.

Je pars d'un classeur contenant différentes informations, et en cliquant sur un bouton, certaines de ces informations doivent être copiées dans un autre classeur: jusque là, rien de bien compliqué.

Mon problème, c'est que dans le classeur sur lequel vont être copiée les données contient plusieurs tableaux (12 exactement, 1 tableau pour chaque mois). Le tableau dans lequel vont être copié les données sera donc celui en fonction de la date du jours

En gros, pour le mois de janvier, le tableau sera représenté par la plage "Range("B6:E13")", février par Range("B18:E25") ....

Mon code:

Sub com()

Dim Chemin As String, Fichier As String, Com As String, Chemin2 As String
Dim dateact As Range

'Chemin où se trouve le fichier à ouvrir
Chemin = "C:\Users\XXXX\Desktop\Ent\Com"

'Nom du fichier à ouvrir
Fichier = "com tableau.xlsm"
Fichier_Client = ThisWorkbook.Sheets("Clients").Range("B4") & ".xlsm"

'Empêche le raffraichissement de l'écran
Application.ScreenUpdating = False

'Ouverture du fichier
Workbooks.Open Chemin & "\" & Fichier

'Ouverture de l onglet correspondant
Windows(Fichier_Client).Activate
Com = Sheets("Clients").Range("B11")
Windows(Fichier).Activate
ActiveWorkbook.Worksheets(Com).Activate

If Format(Date, "mm") = "01" Then
    Set dateact = Sheets(Com).Range("B6:E13")

ElseIf Format(Date, "mm") = "02" Then
    Set dateact = Sheets(Com).Range("B18:E25")

ElseIf Format(Date, "mm") = "03" Then
    Set dateact = Sheets(Com).Range("B30:E37")

ElseIf Format(Date, "mm") = "04" Then
    Set dateact = Sheets(Com).Range("B42:E49")

ElseIf Format(Date, "mm") = "05" Then
    Set dateact = Sheets(Com).Range("B54:E61")

ElseIf Format(Date, "mm") = "06" Then
    Set dateact = Sheets(Com).Range("B66:E73")

ElseIf Format(Date, "mm") = "07" Then
    Set dateact = Sheets(Com).Range("B78:E85")

ElseIf Format(Date, "mm") = "08" Then
    Set dateact = Sheets(Com).Range("B90:E92")

ElseIf Format(Date, "mm") = "09" Then
    Set dateact = Sheets(Com).Range("B102:E109")

ElseIf Format(Date, "mm") = "10" Then
    Set dateact = Sheets(Com).Range("B114:E121")

ElseIf Format(Date, "mm") = "11" Then
    Set dateact = Sheets(Com).Range("B126:E133")

Else
    Set dateact = Sheets(Com).Range("B140:E147")

End If

Windows(Fichier_Client).Activate
Sheets("Clients").Range("B4").Copy
Windows(Fichier).Activate

End Sub

En fonction du mois de la date actuelle, il a donc été défini une plage correspondant au mois en cours. Mon soucis, c'est que, dans cette plage sélectionné, je ne vois pas comment sélectionner les cellules (en gros, comment réussir à sélectionner la première cellule, la seconde ... de chaque plage?).

Merci pour votre aide

Bonjour,

il est facile de calculer une adresse de cellule avec un offset par rapport à une autre ...

par contre il est extrêmement rare si ce n'est pour faire des animations d'avoir besoin de sélectionner une cellule !

est-tu sur que ce que tu veux faire c'est sélectionner une cellule ? ce ne serait pas plutôt de lire son contenu ou d'écrire dans une cellule ?

dis-nous ce que tu veux faire exactement ?

(trop tard pour le PS..)

En clair,

Dans le premier classeur, si je clique sur le bouton aujourd'hui, je veux qu'il m'ouvre le fichier "com tableau.xlsm", qu'il me sélectionne la plage correspondant au mois d'avril (dans notre cas, Range("B42:E49")), et je vais avoir besoin de recopier des informations du classeur1 dans le fichier "com tableau.xlsm".

Exemple:

Classeur1: Je clique sur le bouton

Classeur2: Ouverture du fichier "com tableau.xlsm"

Classeur2: Sélection de la plage correspond au mois d'avril ("B42:E49")

Classeur2:

Copie de la cellule B4 (du classeur1) dans la cellule B42 (du classeur2)

Copie de la cellule B16 (du classeur1) dans la cellule C42 (du classeur2)

Copie de la cellule B17 (du classeur1) dans la cellule D42 (du classeur2)

Copie de la cellule B18 (du classeur1) dans la cellule E42 (du classeur2)

Note: Si la ligne 42 est déjà remplie, il faudrait que la copie se fasse sur la ligne du dessous.

Merci de ton aide

Bonjour,

J'ai un petit problème concernant les sélections de cellule.

Bé moi j'en un gros ! C'est que sélectionner ou activer alors que ce n'est pas l'objectif ultime de l'opération, c'est accomplir une opération supplémentaire, parasite et inutile... Il convient d'abord de supprimer tout recours à la sélection ou activation pour laisser libre-cours à VBA d'opérer directement comme il sait faire !

Ta définition de dateact... Soit m une variable Integer :

    m = Month(Date)
    Set dateact = Workbooks(Fichier).Worksheets(Com).Range("B6:E13").Offset((m - 1) * 12)

Voilà qui suffit à définir la plage, sans sélection ni activation...

Bref ton code est à réécrire, et à indenter par la même occasion, pour le rendre normalement lisible !

Pour cela, tu indiques ce que tu veux faire, qui n'est pas clair, le résultat final à obtenir (hors sélection ! car droit au but c'est mieux), et on recode tout ça en VBA !

Cordialement.

Bonjour,

Merci pour le retour,

Après de nombreuses années sans en faire, je me remet dans VBA avec quelques difficultés. Pour l'instant, je reprend un peu mes marques et ai tendance à "coder" comme je réfléchis (ce qui explique peut être un peu le bazar ....).

Du coup, comment gérer la copie dans mes cellules?

re,

commence par faire du ménage dans ton code..

difficile de comprendre ce que tu fait avec test cellules B11 ...

si tu dois accéder à une cellule du classeur contenant ta macro utilise ThisWorkbook

'pour afficher la valeur d'une cellule
msgbox ThisWorkbook.Sheets("Clients").Range("B4")
'pour écrire dans une cellule 
ThisWorkbook.Sheets("Clients").Range("B4") = 123

utilise une variable classeur pour accéder à un autre classeur :

'(...)
Dim wk as workbook
set wk = Workbooks.Open (Chemin & "\" & Fichier)
'(..)
'ensuite utilise wk pour accéder au classeur :
wk.worksheets("Mafeuille").range("A1")=1 'écriture dans cellule A1

'copie donnée depuis la feuille clients du classeur contenant la macro vers le nouveau classeur
wk.worksheets("Mafeuille").range("A1") = ThisWorkbook.Sheets("Clients").Range("B4")

inspire toi de tout cela et reviens avec ton code et un descriptif de ce que tu veux faire descriptifs dans lequel nous ne voulons voir ni des mots tels que Selection ou Activer.

En me basant en partie sur ton code qui laissait supposer 3 fichiers et ton post (précédant immédiatement le mien) lequel ne fait état que de 2, j'ai donc supprimé ce qui relevait de FichierClient (?) et j'ai intégré les éléments ne figurant pas dans le code...

C'est donc à vérifier de près... Pour éviter toute erreur de lecture :

-Dans le classeur contenant la macro, feuille Client :

j'affecte la valeur de B11 à la variable Com

je prélève les valeurs de B4 ainsi que B16 à B18, que j'affecte à un tableau nommé Copie (!)

-J'ouvre le classeur (Fichier) et j'affecte dateact, plage de la feuille (Com)

puis dans la plage, je vérifie toutes les lignes... je m'arrête à la première ligne vide (la première si c'est le cas)

et j'affecte sur cette ligne le tableau Copie

(NB- on ne copie ni colle... ! mais j'ai appelé le tableau Copie pour que tu soies pas dépaysé ! )

- Vient ensuite un choix à faire de fermer le fichier, ou de l'activer pour voir, ou un 3e choix...

Sub Com()
    Dim Chemin$, Fichier$, Com$, dateact As Range, Copie(3), i%, j%
    Chemin = "C:\Users\XXXX\Desktop\Ent\Com\"
    Fichier = "com tableau.xlsm"
    With ThisWorkbook.Worksheets("Clients")
        Com = .Range("B11")
        Copie(0) = .Range("B4")
        For i = 1 To 3
            Copie(i) = .Range("B" & i + 15)
        Next i
    End With
    j = Month(Date) - 1
    Application.ScreenUpdating = False
    With Workbooks.Open(Chemin & Fichier).Worksheets(Com)
        Set dateact = .Range("B6:E13").Offset(j * 12)
    End With
    With dateact
        For j = 1 To 8
            For i = 1 To 4
                If .Cells(j, i) <> "" Then Exit For
            Next i
            If i > 4 Then i = j: Exit For
        Next j
        If j > 8 Then
            MsgBox "La plage est pleine !", vbCritical, "Erreur"
            Exit Sub
        End If
        .Rows(i) = Copie
    End With
    'ici : soit on referme Fichier (ligne ci-dessous à activer)
    'Workbooks(Fichier).Close True
    'soit on l'active pour voir (là l'activation est le but de l'opération !)
    ' ci-dessous
    'ActiveWorkbook.Worksheets(Com).Activate
End Sub

Cordialement.

Dsl pour le temps de réponse, j'ai été quelque peu accaparé par les enfants ...

J'ai essayé et le résultat répond plus qu'à mes attentes, je te remercie.

Il ne me reste plus qu'à étudier tout ça pour pouvoir le refaire.

Encore merci

Rechercher des sujets similaires à "selectionner specifique plage donnee"