Msgbox nombre
Bonjour à tous,
je souhaite avec la macro existante (voir fichier) faire un copier-coller des valeurs dans la feuille 2 et dans la colonne A.
Cependant, si dans la colonne A de la feuille 2 il y a déjà des valeurs j'aimerai les coller dans la colonne B, et ainsi de suite...
Merci
Bonjour,
Si tu veux faire :
un copier-coller des valeurs dans la feuille 2 et dans la colonne A.
c'est que comme résultat tu veux obtenir des valeurs, et donc que tu n'as nul besoin de faire un copier-coller, comme tu le ferais manuellement, car VBA peut faire autrement, lui !
Mais tu ne parle que de la colonne A de Feuil2, s'il s'agit des valeurs de cette colonne que l'on doit reproduire ailleurs, il faut savoir où ? Et si c'est les valeurs qui viennent d'ailleurs, il faut alors savoir d'où ?
Pour mettre des valeurs d'un endroit à un autre il faut 2 emplacements, un de départ, un d'arrivée ! (Ce peut être le même, mais il faut alors le préciser).
Cordialement.
Yo,
Tu veux copier quel valeurs ? D'ou tu les copies ? Ces valeurs sont déjà dans le presse-papiers ?
MFerrand,
Je pense que le Classeur/feuille de destination est bien la feuille deux et colonne A, sinon il ne demanderai pas de décaler sur la B et ainsi de suite si elle est rempli.
je ne me suis peut-être pas exprimé assez clairement mais mon objectif est bien de faire un copier-coller des valeurs de la colonne A et de la feuille 1 dans les cellules de la feuille 2 en commençant par la colonne A (toujours feuille 2 donc).
autant pour moi les valeurs sont générées par la macro (par la formule 'randbetween') elles ne sont pas à la base dans la feuille 1 et la colonne A
On va s'y perdre !
On va supposer que l'on prend les valeurs Feuil2, colonne A et qu'on les dépose Feuil2 (même feuille) dans la première colonne disponible.
On va décomposer la construction de la macro : variables : n pour dimensionner la longueur des données, k pour définir la colonne, A pour prélever les données colonnes A (un tableau est souvent commode aussi bien pour travailler les données en dehors d'Excel que pour les déplacer, etc.) On n'a pas besoin d'autre chose, si on travaille sur la même feuille on la met sous With (plus rapide et largement aussi efficace que les variables...)
Sub Test()
With Worksheets("Feuil2")
n = .Cells(.Rows.Count, 1).End(xlUp).Row
A= .Range("A1:A" & n).Value
k= .Cells(1, .Columns.Count).End(xlToLeft).Column + 1
.Cells(1, k).Resize(n).Value = A
End With
End SubOn pourrait compresser et gagner une ou deux lignes, se passer de A... mais cela ne ferait rien gagner de plus, et le tableau matérialise bien l'action de prendre les données (sans pour autant les supprimer de là où elles sont) pour en faire ce qu'on veut ensuite et les poser ailleurs, si on les pose exactement au même endroit, elles remplaceront les données initiales (écraseront les formules s'il y en a, même résultat qu'un copier-coller valeurs mais infiniment plus rapide).
Ce dont il ne faut pas se passer, c'est d'abord le With : dès qu'on a plus d'une expression référant au même objet on le met sous With, cela accélère et on élimine des répétitions dans l'écriture. Si on travaillait sur deux feuilles, soit on les met sous With successivement, soir si c'est simultané on met sous With celle à laquelle on réfère le plus, et l'autre on l'affecte à une variable Worksheet...
Quant à la méthode consistant à affecter des valeurs, la ligne d'affectation :
.Cells(1, k).Resize(n).Value = Aen montre bien la simplicité et l'efficacité : on affecte le tableau de valeurs à une plage dimensionnée pour l'accueillir. Sans utiliser de tableau, on aurait fait :
.Cells(1, k).Resize(n).Value = .Range("A1:A" & n).Valueaffectation directe des valeurs de la plage source à la plage cible...
Mais il est intéressant de noter que si l'on a diverses choses à faire, l'utilisation d'un tableau va souvent les faciliter et permettre une exécution plus rapide.
Lorsqu'on prélève des données en tableau comme ici : affectation des valeurs d'une plage à une variable de type Variant qui les accueille sous forme de tableau, on obtient un tableau qui a les dimensions de la plage source mais dont la première ligne est toujours 1, la dernière UBound(tablo, 1), la première colonne 1 et la dernière UBound(tablo, 2), on le parcourt et travaille avec d'autant plus facilement...
Dans l'autre sens aussi, avec une variable tableau que l'on dimensionne soit au départ, soit au fur et à mesure on évite de travailler sur la feuille ligne par ligne et on n'y intervient qu'à la fin pour déposer le résultat...
Cordialement.
Re-Bonjour,
Très belle proposition de MFerrand qui montre sa parfaite maitrise des fonctions native d'Excel !
J'ai aussi une proposition à faire, beaucoup moins optimale, tout aussi fonctionnelle et un peu d'algorithmie ne fait jamais de mal !
Déjà j'ai pas pu m'empêcher de changer la partie de ton code qui créer des chiffres aléatoire, même si je pense que tu as eu du mal à arriver à ce résultat avec l'enregistreur de macro, les selections que ce code effectue n'est pas très pratique et écrase les valeurs déjà présente dans la cellule au lancement de la fonction.
For i = 1 To 10
Randomize
nombre_aleatoire = Int(8 * Rnd) + 1
ActiveWorkbook.Sheets(2).Cells(i, 1).Value = nombre_aleatoire
NextCe code va boucler jusqu'a la ligne 10(For i=1 To 10) en remplissant chacune d'entre elles par un un chiffre allant de 1 à 8 ( Int(8*Rnd)+1 )
Ensuite:
Set Rng = Range(Cells(1, 1), Cells(1, 1).End(xlDown))
If Cells(1, 2) <> "" Then
ColDestination = Cells(1, 1).End(xlToRight).Column + 1
Else
ColDestination = 2
End If
For i = 1 To Rng.Count
Cells(i, ColDestination) = Rng.Item(i).Value
Next iOn va récupérer la plage de cellules ou sont tes données aléatoires, On test le cas ou il n'y as que cette colonne ci sur la feuille, puis on va copier les valeurs de chaque cellules de la plage Rng (Avec une même boucle "For") dans la colonne vide suivante !
Je t'ai mit un petit bouton (Soit qui oblige à l'utilisateur d'être sur la feuille présente pour lancer la macro) !
Tu trouvera aussi ton fichier ci-joint, modifié, même si j'espère que tu prendras le temps de comprendre nos manipulations
Mais la solution de Mferrand est beaucoup plus optimale, quoique beaucoup plus propre à Excel !
Super ! Merci beaucoup MFerrand et Tiagorimb en tout cas de prendre du temps pour me répondre !
Bonjour voici une façon il me semble de copier et coller des valeurs d'une feuille à une autre par des variables tableau.
(Si des améliorations sont possibles, je suis preneur)
Sub Macro()
Worksheets("sheet1").select
Dim Macro(1 To 1000) As String
Dim i As Integer
Dim Cel As Range
Set Cel = Range("B1")
For i = 1 To 1000
Macro(i) = Cel.Value
Set Cel = Cel.Offset(1)
Next i
Worksheets("sheet2").Range("C$1").Resize(UBound(sheet2)).Value = Application.Transpose(sheet2)
End Sub
Voici une manière de compter les valeurs présentes et de les ressortir sur un message box en fonction des valeurs voulues
Sub macro_1()
Worksheets("sheet1").Select
Dim N_Row As Long, i_loop As Long
Dim counter As Long
N_Row = Worksheets("sheet1").Cells(1, 1).End(xlDown).Row
counter = 0
For i_loop = 1 To N_Row
If Cells(i_loop, 1) = "Valeur1" Then
counter = counter + 1
End If
Next i_loop
MsgBox "Valeur1 : " & counter, vbInformation, "Type"
'2ème valeur
counter = 0
For i_loop = 1 To N_Row
If Cells(i_loop, 1) = "Valeur2" Then
counter = counter + 1
End If
Next i_loop
MsgBox "Valeur2 : " & counter, vbInformation, "Type"
End Sub
Façon de compter le nombre de valeurs dans une matrice carrée.
Option Explicit
Option Base 1
Sub SQUARE()
Worksheets("Feuil1").Select
Dim Tableau()
Dim ligne As Variant
Dim colonne As Variant
Dim counter As Integer
For ligne = 1 To 6
For colonne = 11 To 6
Tableau(ligne, colonne) = Range("A1:F20")
Next colonne
Next ligne
counter = 0
For ligne = 1 To 6
For colonne = 11 To 16
If Cells(ligne, colonne) = "valeur1" Then
counter = counter + 1
End If
Next colonne
Next ligne
MsgBox "Nombre de valeur1 : " & counter, vbInformation, "type"
End Sub