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

28msgbox-nombre.xlsm (17.01 Ko)

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 Sub

On 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 = A

en 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).Value

affectation 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
    Next

Ce 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 i

On 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 !

18msgbox-nombre.xlsm (19.92 Ko)

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

Rechercher des sujets similaires à "msgbox nombre"