Sélections des lignes d'une colonne à la dernière ligne
Bonjour à tous,
Je n'arrive pas à faire quelque chose qui ne me parait pourtant pas compliqué, j'ai eu un peu de mal à mettre un titre clair, désolé.
J'ai un tabeau qui contient plusieurs lignes qui part de A1 jusqu'a Wx (x car le nombre de ligne change de semaine en semaine).
Parmis mes lignes, j'ai certaine cellule vide.
Je souhaite sélectionner toutes les valeurs (même vide) depuis C1 jusqu'à la dernière valeur W.
Donc ça peut etre C1:W620 puis la semaine suivante, C1:W403... sachant que mon C1 peut-etre une cellule vide, cependant il n'y aura jamais de cellule vide dans ma colonne W.
Ensuite je ne veux pas sélectionner les colonnes entière car ça merde lorsque je copie.
Merci pour votre aide
Vous pensez quoi de ce code ?
ActiveSheet.Range("C1", _
ActiveSheet.Range("I1").End(xlDown)).SelectLe code entier est le suivant :
Sub Import()
'
' Vider le contenu d'une feuille
'
Sheets("Extra").Select
Cells.Select
Selection.ClearContents
Range("A1").Select
'
' Import les cellules d'un fichier externe
'
MonClasseurActif = ActiveWorkbook.Name 'memorise le classeur actif
Dim QuelFichier
QuelFichier = Application.GetOpenFilename("Fichier Excel (*.xls), *.xls", Title:="Sélectionnez le fichier à importer")
If QuelFichier <> False Then
Workbooks.Open QuelFichier
Range("C4").Select
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
Selection.Copy
ActiveWindow.Close
Windows(MonClasseurActif).Activate
Sheets("Extra").Select
Range("A1").Select
ActiveSheet.Paste
Else
MsgBox "Vous n'avez pas sélectionné de fichier"
Exit Sub
End If
'
' creer feuille
'
Sheets("Base").Select
Sheets("Base").Copy Before:=Sheets("Base")
Sheets("Base (2)").Select
Sheets("Base (2)").Name = "SEC"
'
' copier données de EXTRA
'
Sheets("Extra").Select
ActiveSheet.Range("C1", ActiveSheet.Range("W1").End(xlDown)).Select
Selection.Copy
'
' coller données de EXTRA
'
Sheets("SEC").Select
Range("D3").Select
ActiveSheet.Paste ' je ne comprend pas pourquoi ma macro plante à ce niveau là <==============
'
' remplace un caractère et change le format de date
'
Range("G:G,N:N,O:O,P:P,Q:Q").Select
Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.NumberFormat = "dd/mm/yy;@"
MaFeuilleActive = ActiveSheet.Name 'memorise la feuille active
'
' Vider le contenu d'une feuille
'
Sheets("Extra").Select
Cells.Select
Selection.ClearContents
Range("A1").Select
Sheets(MaFeuilleActive).Activate
End SubCe que je ne comprend pas c'est que ça bloque à la ligne avec ce bout de code simple que j'utilise au dessus
ActiveSheet.PasteSurtout que si je fais le coller manuellement ça fonctionne !!! une idée ?
Bonsoir Leon, bonsoir le forum,
Tout d'abord une remarque, évite autant que tu le peux les Select qui ne font que ralentir l'exécution du code... Ensuite, si j'ai bien compris, voilà comment je verrais les choses :
Public Sub Import()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim E As Worksheet 'déclare la variable E (Onglet Extra)
Dim B As Worksheet 'déclare la variable B (Onglet Base)
Dim F As Variant 'déclare la variable F (Fichier)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim S As Worksheet 'déclare la variable S (Onglet SEC)
Set CD = ThisWorkbook 'définit le classeur destination CD
Set E = CD.Sheets("Extra") 'définit l'onglet E
Set B = CD.Sheets("Base") 'définit l'onglet B
E.Cells.ClearContents 'efface toutes les cellules de l'onglet E
'définit le fichier F
F = Application.GetOpenFilename("Fichier Excel (*.xls), *.xls", Title:="Sélectionnez le fichier à importer")
If F <> False Then 'condition : si F n'est pas [Faux]
Workbooks.Open F 'ouvre le fichier F
Set CS = ActiveWorkbook 'définit le classeur source CS
Set OS = CS.Sheets(1) 'définit l'onglet source OS (à adapter, j'ai choisi le premier onglet du classeur source...)
'copie la plage allant de C4 à la dernière cellule de la plage utilisée de l'onglet OS et la colle dans A1 de l'onglet E
OS.Range(OS.Cells(4, 3), OS.UsedRange.SpecialCells(xlLastCell)).Copy E.Range("A1")
Else 'sinon
MsgBox "Vous n'avez pas sélectionné de fichier" 'message
Exit Sub 'sort de la procédure
End If 'fin de la condition
CD.Activate 'active le classeur destination CD
B.Copy Before:=Sheets("Base") 'copie l'onglet Base
ActiveSheet.Name = "SEC" 'renomme l'onglet copiée
Set S = CD.Sheets("SEC") 'définit l'onglet S
'copie la plage C1:W... de l'onglet E et la colle à partir de D3 dans l'onglet S
E.Range("C1:W" & E.Cells(Application.Rows.Count, 23).End(xlUp).Row).Copy S.Range("D3")
With S.Range("G:G,N:N,O:O,P:P,Q:Q") 'prend en compte les colonne G, N à Q de l'onglet S
'remplace le point par un slash
.Replace What:=".", Replacement:="/", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
.NumberFormat = "dd/mm/yy;@" 'définit le format
End With 'fin de la prise en compte des colonnes...
E.Cells.ClearContents 'efface les cellules de l'onglet E
S.Select 'sélectionne l'onglet S
End SubTu remarqueras qu'il y a beaucoup de lignes au début pour déclarer et définir les variables. Ce qui semble être une perte de temps pour écrire des ligne superflues, s'avère par la suite très pratique et simplifie considérablement l'écriture du code. Plus de Select (sauf à la fin) et des Copier/Coller en une seule ligne :
OngletSource.Range(plage).Copy OngletDestination.Range(cellule)
Salut, merci pour ta réponse, j'vais essayer ta méthode.
As-tu une idée pourquoi j'ai une erreur sur la copie avec mon code ? Tout le reste fonctionne bien et ça va assez vite pour moi, j'ai bien noté que les select sont à éviter.