Copier des colonnes selon valeur
Bonjour,
Je désire copier des colonnes d'une feuille à une autre
Le problème est que je n'arrive pas à copier les colonnes contenant des formules
Merci de voir le fichier joint
Bonjour,
Logique dans la mesure où tu as une formule en D4 te renvoyant quoi qu'il arrive la date du 1er janvier ! La copiant, elle continuera et modifiera ta ligne de dates...
A partir du moment où tu veux que ton tableau commence à n'importe quelle date, il te faut au minimum cette première date en dur (mais vu la structure, il serait possible d'envisager de ne pas utiliser de formule sur cette ligne...)
Il s'agit donc simplement d'adapter la composition de ton tableau à la façon dont tu entends l'utiliser !
Autre remarques : je ne vois pas ta localisation géographique, mais tu dois savoir que la fonction NO.SEMAINE n'est pas utilisable en Europe où l'on utilise un numéro de semaine répondant à la norme ISO8601 :
- pour les versions antérieures à 2010, aucune fonction ne renvoie le n° de semaine ISO, il faut faire une formule (ou une fonction personnalisée),
- pour Excel 2010, on peut l'utiliser avec le paramètre 21 : =NO.SEMAINE(date;21)
- pour les version ultérieures, la fonction NO.SEMAINE.ISO.
Le calcul des colonnes de début et fin pourrait être fait par simple soustraction dans ton tableau : datedébut - D4 + 4 pour la colonne départ, et datefin - datedébut + colonnedépart pour la colonne fin...
Je m'y fierais pour ma part plus qu'à Find dans ce domaine...
Je conseille aussi toujours de ne jamais mettre les nombres entre guillemets : quand VBA ou Excel en ont l'utilité sous forme texte, ils en assurent généralement la conversion, mais c'est plus rarement le cas dans l'autre sens... Donc en ne mettant jamais de guillemets autour d'un nombre on n'aura à y revenir que dans de très très rares cas, alors qu'en en mettant, les risques sont nettement plus fréquents...
Cordialement.
Bonjour,
Une piste :
Private Sub CommandButton1_Click()
Dim CelD As Range
Dim CelF As Range
Dim ColD As Long
Dim ColF As Long
With Sheets("Source")
.Rows(4).NumberFormat = "General"
Set CelD = .Rows(4).Find(CLng(CDate(TextBox5.Text)), , xlValues, xlWhole)
Set CelF = .Rows(4).Find(CLng(CDate(TextBox6.Text)), , xlValues, xlWhole)
.Rows(4).NumberFormat = "yyyy-mm-dd;@"
If CelD Is Nothing Or CelF Is Nothing Then
MsgBox "La date début ou de fin n'existe pas.", vbCritical, "Erreur"
Exit Sub
Else
ColD = CelD.Column
ColF = CelF.Column
Union(Range(.Columns(1), .Columns(3)), Range(.Columns(ColD), .Columns(ColF))).Copy Sheets("Destination").Range("A1")
End If
End With
End SubLa recherche de dates avec Find() étant assez capricieuse, surtout avec des formatages donc j'ai fais un code qui passe le formatage en Standard et transforme les dates String en Long puis remet le formatage comme avant !
Bonjour Theze,
Ta solution fonctionne très bien mais en l'essayant avec des données dans la feuille source, le fichier excel prend du volume et passe parfois de 500k à 9mb
Parfois ca prend quelques secondes, voir 2 min pour que la copie s'exécute
Lorsque je supprime la feuille destination et je créée une nouvelle en la renommant bien sur Destination, le fichier retrouve sa taille originale
Le but de mon fichier excel est d'imprimer les colonnes sélectionnées. Je ne sais pas si c'est mieux de travailler directement avec la feuille source et ainsi pouvoir masquer les colonnes non désirées
Merci pour toute autre solution qui pourrait s'appliquer