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 !
Ta définition de dateact...
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 !
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