Copie coller d'une colonne

Fermé
benjamin - Modifié par pijaku le 22/01/2014 à 09:46
 benjamin - 31 janv. 2014 à 17:09
Bonsoir!!
Je vous lance un message d'assistance technique en VBA
Le probleme que j'ai consiste à copier coller une colonne et la coller dans un autre emplacement de la meme feuille.
Le principe est le suivant: je saisi un mot ou groupe de mots dans un inputbox (ce mot devant etre imperativement un titre de champs d'une feuille d'un classeur donné).
Par exemple, Mars 2014, la recherche est faite et ensuite on copie la colonne dont le titre de champ est Mars 2014 et la colle ailleurs.
Apres execution de mon programme j'ai ce message d'erreur:
Excel ne dispose pas assez de ressources pour exécuter cette tache. veuillez réduire les données ou fermer des applications.. .

Voici mon programme
Sub copy_cumul(ByRef wk As Workbook) 
Dim trouve1 As Range 
Dim trouve2 As Range 
Dim bte 
Application.ScreenUpdating = False 

Do While trouve1 Is Nothing Or trouve2 Is Nothing 
bte = InputBox("Veuillez renseigner un champs! " & Chr(10) & "Par Exemple : Janvier 2014", "CHOIX DU MOIS!!!") 
Set trouve1 = Workbooks("Tampon.xlsx").Worksheets("tamp_cumul").Rows(1).Cells.Find(bte, LookIn:=xlValues, LookAt:=xlWhole) 
Set trouve2 = wk.Worksheets("Cumul").Rows(1).Cells.Find(bte, LookIn:=xlValues, LookAt:=xlWhole) 
Loop 

trouve1.EntireColumn.Copy trouve2 
Application.ScreenUpdating = True 
End Sub


le debogage souligne : trouve1.EntireColumn.Copy trouve2


Maintenant, je veux faire une copier coller de la premiere ligne jusqu'a la derniere lignie non vide de la colonne d'interet (ici par exemple c'est Mars 2014,)
A voir également:

7 réponses

Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
21 janv. 2014 à 22:12
Bonjour,

Si les classeurs sont ouverts et volumineux, il faut peut être envisager d'effectuer les traitements différemment ou bien d'utiliser une base de données digne de ce nom et un gestionnaire indépendant des données...

Excel n'est ni une base de données, ni un environnement de développement. En voulant en faire une BdD et une application de gestion, on minimise fortement ses capacités.

Il est possible de travailler dans des classeurs fermés pour manipuler les données. Voir ici

Bon courage
0
Merci!
Je suis noviste dans le domaine de la programmation. C'est pourquoi je veux savoir Quel gestionnaire indépendant des données me recommande tu?
Sache qu'il existe des formules dans plusieurs cellules de ma feuille excel de sorte qu'une modification ( une copie coller d'une colonne par exemple actualise les données des autres cellules). A mon avis c'est l'avantage que j'ai a utiliser le VBA excel. C'est mon avis
Aide moi s'il te plait!
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 312
Modifié par michel_m le 23/01/2014 à 08:48
Bonjour

Si tu es novice, on évitera la technologie ADO proposée par notre ami Polux (bonjour)

modif à apporter dans ta macro

1 seul classeur ouvert à la fois si tes classeurs sont volumineux
On évite de trimballer des cellules toujours gourmandes en mémoire et on crée des variables tableaux ne comportant que les valeurs des cellules
on cherche le numéro de la colonne et la dernière ligne utilisée dans la colonne et on crée le tableau (baptisé "copie")
on ferme le classeur source et on ouvre le classeur cible
on suppose (tu n'as pas précisé) que la colonne destination ne comporte pas de données

Dim Bte As String
Dim Col As Integer
Dim Lig As Integer
Dim Copie()
'ouvrir le fichier source Workbooks("Tampon.xlsx")
' ton code inputbox
With Worksheets("tamp_cumul")
On Error GoTo fin 'détecte une mauvaise saisie
Col = .Rows(1).Cells.Find(Bte, LookIn:=xlValues, LookAt:=xlWhole).Columns
On Error GoTo 0
Lig = .Columns(Col).Find("*", , , , , xlPrevious).Row
Copie = Application.Transpose(.Range(.Cells(2, Col), .Cells(Lig, Col).Value))
End With

'fermer le fichier source
'ouvrir le fichier cible
With Worksheets("Cumul")
Col = .Rows(1).Cells.Find(Bte, LookIn:=xlValues, LookAt:=xlWhole).Column
.Cells(2, Col).Resize(UBound(Copie), 1) = Application.Transpose(Copie)
End With
'.... code éventuel
Exit Sub
fin:
MsgBox Bte & " : saisie incorrecte !!!", vbCritical
End Sub



Michel
0
Merci Michel!!!!!
Je te promets de te faire signe une fois que ca marche
0
Bonsoir Michel !!
Apres avoir executer ton programme, je suis confronté à un problème. Je constate que tantot
Col =Worksheets ("tamp_cumul").Rows(1).Cells.Find(Bte, LookIn:=xlValues, LookAt:=xlWhole).Columns
Tantot
Col =Worksheets("Cumul").Rows(1).Cells.Find(Bte, LookIn:=xlValues, LookAt:=xlWhole).Column

Je me demande si tu t'es pas trompé ?
Si tel est le cas(si tu t'es trompé), je pense qu'il va falloir apporter des modifications aux parties faisant référence à col(juste preciser s'il s'agit de col1 ou col2)

voici tel que j'avais conçu le problème :
Je saisi dans un inputbox par exemple : Fevrier_2014 ; il cherche dans la première ligne de la feuille source la référence de la cellule dont le champ de titre est Fevrier_2014(col1)
Il cherche également dans la feuille de destination la référence de la cellule dont le champ de titre est Fevrier_2014(col2)
Il copie la colonne col1 et la colle dans la colonne col2.
Tant que fevrier_2014 n'existe pas dans les deux feuilles en tant que titre de champs, il envoie l'inputbox pour saisir de nouveau un titre de titre.
C'est pourquoi j'avais prevu un do while
Do While col1 is nothing or col2 is nothing then
Bte=inputbox("...............")
Col1= Worksheets ("tamp_cumul").Rows(1).Cells.Find(Bte, LookIn:=xlValues, LookAt:=xlWhole).Columns
Col2 =Worksheets("Cumul").Rows(1).Cells.Find(Bte, LookIn:=xlValues, LookAt:=xlWhole).Column
Loop
La commande de la copie.

Je suis vraiment noviste. A toi de m'aider a me retrouver.
Cordialement
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 312
24 janv. 2014 à 15:59
bonjour

je t'avoue que sans classeurs(s), écrire un code est assez aléatoire

essaies ceci (modifs en gras)
Sub bb()
Dim Bte As String
Dim Col As Integer
Dim Lig As Integer
Dim Copie()
'ouvrir le fichier source Workbooks("Tampon.xlsx")
1 Bte = InputBox("Veuillez renseigner un champs! " & Chr(10) & "Par Exemple : Janvier 2014", "CHOIX DU MOIS!!!")
With Worksheets("tamp_cumul")
On Error GoTo fin 'détecte une mauvaise saisie
Col = .Rows(1).Cells.Find(Bte, LookIn:=xlValues, LookAt:=xlWhole).Columns
On Error GoTo 0
Lig = .Columns(Col).Find("*", , , , , xlPrevious).Row
Copie = Application.Transpose(.Range(.Cells(2, Col), .Cells(Lig, Col).Value))
End With

'fermer le fichier source
'ouvrir le fichier cible
With Worksheets("Cumul")
On Error GoTo fin
Col = .Rows(1).Cells.Find(Bte, LookIn:=xlValues, LookAt:=xlWhole).Column
On Error GoTo 0
.Cells(2, Col).Resize(UBound(Copie), 1) = Application.Transpose(Copie)
End With
'.... code éventuel
Exit Sub
fin:
MsgBox Bte & " : saisie incorrecte !!!", vbCritical
Resume 1
End Sub

tu n'es pas obligé de garder le msgbox mais il est souvent préférable d'indiquer à l'utilisateur qu'il a fait une c....
le mieux alors est de choisir un msgbox avec un bouton yesno et le texte
"saisie incorrecte! continuer ?"

par ex
rep=msgbox(""saisie incorrecte! continuer ?",vbyesno,vbexclamation)
If rep=vbyes then resume 1

(rep est du type byte)


Bon WE
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci!
Mais je me demande si le fait de dire
col= Worksheets("tamp_cumul").Rows(1).Cells.Find(Bte, LookIn:=xlValues, LookAt:=xlWhole).Column
et aller ecrire
Col =Worksheets("Cumul") .Rows(1).Cells.Find(Bte, LookIn:=xlValues, LookAt:=xlWhole).Column
ne crée pas probleme.
Je me dis c'est comme si tu ecrivais
X=1 et apres X=2
Cordialement
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
24 janv. 2014 à 16:53
(Petite incrust)

Salut Benjamin, Hello Michel ;0)

Ça ne pose aucun problème.

Dans le premier cas, Col sert à chercher la colonne contenant le retour du InputBox (Bte). Ensuite, si trouvé, les données de la colonne sont "transférées" dans Copie(). Col n'est plus utile à ce niveau et la variable Col peut être utilisée pour stocker autre chose

;0)
0
Bonjour Michel;
Après exécution de ton programme, cela me renvoie le message Bte & " : saisie incorrecte !!!", vbCritical.
Or j'ai saisi DISPONIBLE qui est à la première ligne (et dans une colonne dont j'ai oublié le numéro) de Worksheets("tamp_cumul").
Normalement, il devait copier toute cette colonne DISPONIBLE de Worksheets("tamp_cumul"), et la copier dans la colonne ou le titre de champ(1 ère ligne) de Worksheets("Cumul") est DISPONIBLE.
A cet effet, j'aimerais que tu me traduise ligne par ligne le programme que tu as écris.
Peut être je me retrouverai.
je compte sur toi!
cordialement
0
Bonjour Michel;

Après exécution de ton programme, cela me renvoie le message Bte & " : saisie incorrecte !!!", vbCritical.

Or si j'ai saisi DISPONIBLE qui est à la première ligne (et dans une colonne dont j'ai oublié le numéro) de Worksheets("tamp_cumul").

Normalement, il devait copier toute cette colonne DISPONIBLE de Worksheets("tamp_cumul"), et la copier dans la colonne ou le titre de champ(1 ère ligne) de Worksheets("Cumul") est DISPONIBLE.

A cet effet, j'aimerais que tu me traduise ligne par ligne le programme que tu as écris.

Peut être je me retrouverai.

je compte sur toi!

cordialement
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 312
29 janv. 2014 à 10:27
Bonjour,

j'avais écris
je t'avoue que sans classeurs(s), écrire un code est assez aléatoire

d'autant + que tu es novice et qu'en vBA (ou autre langage) il y a des "pinaillages" d'écriture pas triste

Donc, pour essayer d'^tre efficace:

mettre des extraits des 2 classeurs( je zappe au delà de 2mo au total) sans données confidentielles en pièce jointe sur
https://www.cjoint.com/
puis copier l'adresse du lien et la coller dans le message de réponse


0
Bonsoir Michel !!
J'ai bien reçu ton commentaire à travers lequel tu m'as demandé d'envoyer le classeur excel .je te remercie pour cette réponse qui marque ton engagement à m'aider.
Toutefois, le classeur de données que j'utilise est trop lourd et la quasi-totalité des données est confidentielle. Je suis en train de modifier les données avant d'effectuer l'envoi.
Par ailleurs, voici un autre classeur de données http://cjoint.com/14jv/DAFrfkr8jKO_ann_leg_.xlsx que je t'envoie pour m'aider à faire une opération de filtre que je considère d'avancé.
Dans ce classeur, je veux réaliser un filtre sur la colonne E de sorte à afficher que les éléments dont la valeur prise par la colonne E est 1.

Voici ce que j'ai fais
Sub Filtrer()
Workbooks("ANN_LEG.xlsx").Worksheets("données").Range("A1").AutoFilter _
field:=5, _
Criteria1:="1", _
VisibleDropDown:=False
End Sub

Cette commande fonctionne comme je l'ai écrite. Mais, étant données qu'il y a des lignes en gras (représentant des totaux)dans la colonne G, je veux que ces lignes apparaissent quelque soit le critère de filtre choisi. En plus, pour ces totales, les valeurs prises par la colonne ANNEE 2006 doivent changer à causes formules.
Par exemple, si le critère de filtre est 1, la valeur ANNEE 2006 de la ligne TOTAL ne doit plus être 31279
Celle de la ligne Agriculture doit être différente de 5058

Comment faire ? Aide moi s'il te plait. Je compte vraiment sur toi,
Merci d'avance

Voici le lien pour acceder au classeur . il suffit de le copier et le coller dans le navigateur web http://cjoint.com/14jv/DAFrfkr8jKO_ann_leg_.xlsx
0