Copier coller dans la première case vide d'une colonne (macro)

Xtoff06

XLDnaute Nouveau
Bonjour,

J'aurai besoin d'aide svp
Malgré mes recherches je n'ai pas réussi à faire se que je voudrai

je suis novice en Excel et encore plus en Macro

J'aimerai faire une macro pour,
Copier la valeur, et non la formule, de la cellule "B30" de la "feuil2"
et la coller dans la première cellule vide de la colonne "i"de la "Feuil1"

et ensuite est il possible de faire la même chose, avec d'autre cellule bien sur, dans la même macro (que je vais attribuer a un bouton) ?

Merci beaucoup

PS: Je suis sur MacBook
 

Fred0o

XLDnaute Barbatruc
Bonjour Xtoff06 et bienvenue sur le forum

Un exemple de macro a adapter :
VB:
Sub Copie_Val()
    LMax = Sheets("Feuil1").Range("I1").End(xlDown).Row + 1
    Valeur = Sheets("Feuil2").Range("B30").Value
    Sheets("Feuil1").Range("I" & LMax) = Valeur
End Sub
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Si Mac a le même VBA que PC...
VB:
Sub a()
    Call CopieCellule(ThisWorkbook.Worksheets("Feuil1").Range("B30"), "I")
End Sub

Sub CopieCellule(Cellule As Range, Colonne As String)
    Dim Ligne As Long
  
    'Cherche la 1ère cellule vide de la colonne
    On Error Resume Next
    Ligne = Cellule.Parent.Range(Colonne & "1").End(xlDown).Offset(1, 0).Row
    If Err.Number Then Ligne = 1
    On Error GoTo 0
  
    'Copie la valeur de la cellule
    Cellule.Parent.Range(Colonne & CStr(Ligne)).Value = Cellule.Value
End Sub
 

Xtoff06

XLDnaute Nouveau
Merci Fred0o,
la première formule fonctionne très bien
ça fait exactement ce que je voulais
je l'ai copié/collé en dessous en changeant les cellule et colonne et ça fonctionne encore
c'est parfait
je vous remercie beaucoup.

PS: pour mon information personnel
je n'est pas essayé la 2ème formule (vu que la 1ère fonctionne)
mais si elle fonctionne
quelle serait l'intérêt de l'utiliser à la place de l'autre vu quelle est plus grande ?
Merci
 

patricktoulon

XLDnaute Barbatruc
re
bonjour


et si on veut faire une fonction réutilisable pour d'autres situations
par exemple avec la même fonction
VB:
Sub test()'copie vers la premiere ligne dispo en "I"
copievers Feuil2.[B30], Feuil1.Range("I:I")
End Sub

sub test2'copie vers une cellule précise
copievers Feuil2.[B30], Feuil1.Range("I4")
end sub

Function copievers(rng1 As Range, rng2 As Range)
If rng2.Rows.Count = Rows.Count Then Set rng2 = rng2.Cells(rng2.Cells.Count).End(xlUp).Offset(1)
rng2.Value = rng1.Value
End Function
 

Dudu2

XLDnaute Barbatruc
En fait aucune de ces propositions n'est 100% correct, y compris la mienne !
- Celle de Fred0o se plante s'il n'y a pas de valeur en colonne
- Celle de Dudu2 n'a pas vu les feuilles différentes Feuil1 et Feuil2
- Celle de patricktoulon ne répond pas au critère "coller dans la première cellule vide de la colonne "i"de la "Feuil1" car le xlUp ne va pas voir un éventuel trou dans la colonne

Pour ce qui me concerne, la correction...corrigée !
VB:
Sub Test()
    Call CopieCellule(ThisWorkbook.Worksheets("Feuil2").Range("B30"), ThisWorkbook.Worksheets("Feuil1").Range("I:I"))
End Sub

Sub CopieCellule(Cellule As Range, Colonne As Range)
    Dim Ligne As Long

    'Cherche la 1ère cellule vide de la colonne
    If IsEmpty(Colonne.Cells(1, 1)) Then
        Ligne = 1
    ElseIf IsEmpty(Colonne.Cells(2, 1)) Then
        Ligne = 2
    Else
        Ligne = Colonne.End(xlDown).Row + 1
    End If

    'MsgBox Ligne
    'Exit Sub
    
    'Copie la valeur de la cellule
    Colonne.Cells(Ligne, 1).Value = Cellule.Value
End Sub

Et pour répondre à la remarque de Xtoff06 "quelle serait l'intérêt de l'utiliser à la place de l'autre vu quelle est plus grande ?"
Les 2 dernières propositions utilisent une fonction appelable avec différents paramètres pour répondre à ta demande "et ensuite est il possible de faire la même chose, avec d'autre cellule bien sur, dans la même macro".
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Copier coller dans la première case vide d'une colonne (macro)
en fait très souvent cette question est posée maladroitement
le demandeur veut la première dispo en bas ou la première vide dans la colonne
très souvent les demandes sont ambiguës sur ce point là

perso je pense par déduction logique que c'est bien la première dispo en bas malgré les éventuelles vides entre deux
je ne vois pas l’intérêt de placer une valeur entre deux je ne sais ou sans pouvoir la faire correspondre a quelque chose les données serait alors pas dans le bon ordre ( c'est absurde)

dans ce cas la dudu2 tu aurais tords
il serait opportun de demander au demandeur ;) mais je pense a 90% avoir raison
c'est juste une question de logique:D
 

Xtoff06

XLDnaute Nouveau
bonjour dudu,
merci pour ta réponse

avec ta réponse je me rend compte que je me suis mal exprimé
en fait la version de patricktoulon me correspond puisque j'aimerai que ça copie dans la 1ere
cellule vide en bas de la colonne et laisser le trou si il y en a un plus haut

ensuite pour ma 2ème demande j'ai copier le code de fred0o que j'ai collé juste en dessous en changeant les colonne et cellule et ça fonctionne
par contre effectivement si il n'y a rien ça me met un message d'erreur 1004
VB:
Sub Reset()
    LMax = Sheets("Ticket Z").Range("I1").End(xlDown).Row + 1
    Valeur = Sheets("Caisse").Range("B30").Value
    Sheets("Ticket Z").Range("I" & LMax) = Valeur
    
     LMax = Sheets("Ticket Z").Range("H1").End(xlDown).Row + 1
    Valeur = Sheets("Caisse").Range("D30").Value
    Sheets("Ticket Z").Range("H" & LMax) = Valeur
    
    Range("C4:C9,C12:C16,D19:D21").ClearContents

End Sub
 

Xtoff06

XLDnaute Nouveau
re

en fait très souvent cette question est posée maladroitement
le demandeur veut la première dispo en bas ou la première vide dans la colonne
très souvent les demandes sont ambiguës sur ce point là

perso je pense par déduction logique que c'est bien la première dispo en bas malgré les éventuelles vides entre deux
je ne vois pas l’intérêt de placer une valeur entre deux je ne sais ou sans pouvoir la faire correspondre a quelque chose les données serait alors pas dans le bon ordre ( c'est absurde)

dans ce cas la dudu2 tu aurais tords
il serait opportun de demander au demandeur ;) mais je pense a 90% avoir raison
c'est juste une question de logique:D
Voila lol ;)

du coup il faudrait que j'essai ta version
 

Dudu2

XLDnaute Barbatruc
Ma version ne marche pas :( dans tous les cas.
Il y a le problème du 1er avec ce xlDown qui n'est pas si simple à manier. J'ai corrigé en post #5.
Quant à la cellule à remplir, j'ai répondu à la question en sachant pertinemment qu'elle pouvait être mal posée mais c'était la question.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
par contre sur la version de @patricktoulon que doit-je copier
pour faire les 2 copié collé
Merci
j'avoue que tes questions sont de plus en plus confuses
la fonction dans un module standard le code correspondant a ton souhait d'un de mes deux exemples dans le code de ton bouton tout simplement
donc pour les deux ça devrait être si je ne me trompe pas
VB:
Sub test()
'copievers Feuil2.[B30], Feuil1.Range("I4")                         'exemple pour copie vers une cellule précise
    copievers Feuil2.[B30], Feuil1.Range("I:I")                     'exemple pour copie vers la premiere ligne dispo en "I"
    copievers Sheets("Caisse").Range("D30"), Feuil1.Range("H:H")    'exemple pour copie vers la premiere ligne dispo en "H"

'ici il faut preciser sur quel sheets tu veux effacer les cellules
    Range("C4:C9,C12:C16,D19:D21").ClearContents
End Sub


Function copievers(rng1 As Range, rng2 As Range)
    If rng2.Rows.Count = Rows.Count Then Set rng2 = rng2.Cells(rng2.Cells.Count).End(xlUp).Offset(1)
    rng2.Value = rng1.Value
End Function
 

Xtoff06

XLDnaute Nouveau
Désolé si je ne suis pas clair
mais j'ai essayer ton code et ça ne fonctionne pas
mais en lisant ton message je comprend mieux
je pense que j'ai mis trop de ligne dans la macro

le code que j'ai posté au dessus fonctionne très bien et fait ce que je désire (faut juste que je fasse attention a ne pas avoir de case vide)
mais pour avoir le code "parfait" :) j'aurai voulu test avec le tient

c'est dans la feuille "Caisse"(feuil2) que je veut effacer les cellules
"Ticket Z" étant feuil1

en fait ce qui me perturbe c'est que dans tes exemples
-(exemple pour copie vers la premiere ligne dispo en "I")
-(exemple pour copie vers la premiere ligne dispo en "H")

ce n'est pas du tout le même code (j'aurai juste changer la lettre comme si dessous)

doit je écrire
copievers Feuil2.[B30], Feuil1.Range("I:I")
copievers Feuil2.[D30], Feuil1.Range("H:H")

ou
copievers Sheets("Caisse").Range("B30"), Feuil1.Range("I:I")
copievers Sheets("Caisse").Range("D30"), Feuil1.Range("H:H")

et a quoi servent les lignes du bas entre
function et end function
 

patricktoulon

XLDnaute Barbatruc
re

ben si le sheets("caisse") c'est bien feuil2 oui
doit je écrire
copievers Feuil2.[B30], Feuil1.Range("I:I")
copievers Feuil2.[D30], Feuil1.Range("H:H")

et a quoi servent les lignes du bas entre
heu......... ben dans la sub les lignes de code commence par quoi??? ;)
si tu met pas cette fonction ca risque pas de fonctionner :D:D:D:D:D:D

je traduit ce qui est simple a la base

appelle fonction (copievers) cellule à copier , colonne de destination
 

Xtoff06

XLDnaute Nouveau
ok merci
désolé mais c'est ma première macro :D
du coup j'ai mis comme ça

VB:
Sub test()
    copievers Feuil2.[B30], Feuil1.Range("I:I")
    copievers Feuil2.[D30], Feuil1.Range("H:H")
    copievers Feuil2.[D23], Feuil1.Range("F:F")
    
    Sheets("Caisse").Range("C4:C9,C12:C16,D19:D21").ClearContents
End Sub


Function copievers(rng1 As Range, rng2 As Range)
    If rng2.Rows.Count = Rows.Count Then Set rng2 = rng2.Cells(rng2.Cells.Count).End(xlUp).Offset(1)
    rng2.Value = rng1.Value
End Function

Mais quand j'attribut la macro a un bouton
on dirait qu'il ne prend en compte que "test" et pas la fonction copievers
 

Discussions similaires

Statistiques des forums

Discussions
312 202
Messages
2 086 178
Membres
103 152
dernier inscrit
Karibu