7
votes

Copier deux lignes sélectionnées deux fois

J'ai écrit une macro Excel vraiment rudimentaire pour copier la ligne sélectionnée deux fois, puis déplacez le curseur sur 3 lignes afin que le processus puisse être répété à nouveau.

Donc, si j'ai un fichier où les 10 premières lignes doivent toutes être répétées deux fois, je cours la macro 10 fois.

Cela me sauve déjà un tas de frappes de frappe, mais je suis sûr que cela pourrait être écrit mieux pour que je sélectionne simplement les 10 premières lignes, puis exécutez la macro une fois.

Voici ce que j'ai jusqu'à présent: xxx

pour chaque fichier I exécuté cette macro, ce n'est peut-être pas les 10 premières lignes à copier.

En fait, une macro encore meilleure serait de copier chaque ligne deux fois si la cellule de la colonne J est vide.

Mise à jour: le fichier a une ligne d'en-tête avec des valeurs pour les colonnes A à X. Les lignes à copier seront les premières x des lignes après l'en-tête où la colonne J est vide. Donc, dans un exemple, les lignes 2-11 doivent être dupliquées deux fois. Mais dans un autre fichier, il peut s'agir de rangées 2-21.


4 commentaires

Quelle version d'Excel utilisez-vous? Pouvez-vous être plus précis sur la nature des valeurs?


Excel 2010. J'ai mis à jour ma question avec une brève explication de mon fichier


Y a-t-il une colonne qui peut être invoquée à avoir des valeurs aux extensions de son travail? Il ne peut pas s'agir de la colonne J car cette colonne dicte si les lignes sont copiées mais typiquement dans un bloc de données, il y a au moins une colonne toujours remplie.


La colonne A a toujours des données dedans.


4 Réponses :


2
votes

Essayez ceci:

Dim n&, x&
n = 0
x = Application.WorksheetFunction.CountIf(Range("J:J"), " ")
Range("A2").Select

While n <> x
    ActiveCell.EntireRow.Copy: ActiveCell.Offset(1, 0).EntireRow.Insert
    ActiveCell.EntireRow.Copy: ActiveCell.Offset(1, 0).EntireRow.Insert
    ActiveCell.Offset(3, 0).Select
    n = n + 1
Wend
Application.CutCopyMode = False
End Sub


4 commentaires

Merci! Cela devrait fonctionner pour copier 10 lignes, mais si mon fichier suivant nécessite 15 rangées copiées, je devrais éditer la macro. Et si j'ajoute une boîte de dialogue pour inviter l'utilisateur au nombre de lignes à copier? Ou pouvez-vous aider avec la 2e partie de ma question qui doit copier chaque ligne où la colonne j est vide?


S'il vous plaît voir la poste mise à jour. Pour la deuxième partie de votre question, il est préférable de fournir un échantillon de données ou une capture d'écran


Jusqu'à présent, c'est la meilleure réponse. Au lieu de l'entréebox, j'ai sélectionné les lignes à copier (ou les cellules vides de la colonne J) et modifiées votre déclaration de variable sur x = selection.rows.count . De cette façon, il supprime l'invite de message. Puis-je le rendre encore plus intelligent en utilisant comteblank pour voir combien de cellules vides sont dans la colonne J? Notez que la colonne A a des valeurs dans toutes les cellules afin qu'elle puisse être utilisée pour déterminer la dernière ligne à compter.


Je viens de réaliser que les rangées de la colonne J à copier ne sont pas vides, elles contiennent en fait un espace. J'ai mis à jour votre code pour compter le nombre de lignes à copier, puis j'utilise le reste de votre code. Cela fonctionne pour moi!



0
votes

Voici un code qui permettra à l'utilisateur de saisir le nombre de lignes et de tester si la colonne J est vide pour chaque ligne:

Sub CopyRows()

Dim x As Integer
x = InputBox("How Many Rows to Copy?", 8)

Dim c As Range
Set c = Range("A2")

Dim y As Integer

For y = x to c.Row Step -1

    If IsEmpty(Cells(y, "J")) Then

        Cells(y,1).EntireRow.Copy: Cells(y,1).Resize(2,1).EntireRow.Insert Shift:=xlDown

    End If

Next

End Sub


9 commentaires

Cela devrait fonctionner sauf que je reçois une erreur car la variable C n'a pas été déclarée. J'ai également oublié de mentionner que j'ai une ligne d'en-tête, donc si je veux copier les 10 premières lignes, c'est vraiment une ligne 2-11.


D'accord. Essayez-le maintenant. Je viens de faire c = gamme ("A2") mais vous pouvez ajuster si nécessaire. J'ai supposé que ActiveCell était là pour une raison spécifique , de sorte que l'utilisateur puisse insérer des lignes après la cellule qu'il était sur la cellule.


ActiveCell a plus de sens mais d'une manière ou d'une autre que votre boucle ne fonctionne pas avec elle. Cela ne fonctionne pas non plus avec C = gamme ("A2"). J'ai mis à jour mon message original avec une brève description de mon fichier.


Voir le code maintenant. J'ai oublié que nous devons nous rapprocher de la dernière ligne (définie par l'utilisateur) à la première ligne (2-Selon vos spécifications). Egalement ActiveCell est jamais la meilleure chose à utiliser, sauf si vous absolument besoin .


Pour les deux versions, il apporte l'invite pour le nombre de lignes à copier, mais après cela, il indique "Erreur d'exécution" 91 ': variable d'objet ou avec une variable de bloc non définie ". Quand j'appuie sur débogage, il met en évidence la rangée "c =" dans la VBA


Ugh ... c'est lundi matin. J'ai oublié le définir . Je viens de modifier que là-bas.


Ok je ne reçois plus une erreur avec la ligne "Set", mais rien d'autre n'arrive (c'est-à-dire rien inséré, sélectionné, copié ou collé)


Alors, la colonne J est-elle vraiment la colonne de vérifier? Ou les chaînes de texte de données sont-elles des chaînes de texte? Et si vous changez isempty (cellules (y, "j")) à len (cellules (y, "j")) = 0


Désolé je me suis trompé. Oui colonne j est celui à vérifier, mais les lignes à copier ont un espace vide et ne sont pas vides



3
votes

Puis-je jouer aussi? : P

Voici le moyen le plus rapide de le faire. Disons que vos données proviennent de la cellule A1: A10 . Il suffit d'exécuter ce code.

Vous n'avez pas à utiliser Copy / Coller du tout .

Qu'est-ce que ce code est, insère les lignes vides, puis simule le Ctrl + g -> spécial -> cellules vierges -> Remplissez la cellule vierge avec des données de la ligne ci-dessus à l'aide de Ctrl + Entrez . xxx

 Entrez la description de l'image ici


6 commentaires

Solution très cool en effet! La seule chose est que j'ai oublié de mentionner qu'il y a une rangée d'en-tête, alors quand j'ai dit 10 premières rangées, je voulais vraiment dire 10 premières lignes après l'en-tête (c'est-à-dire 2-11). De plus, votre macro ne copie que des valeurs dans la colonne A, plutôt que la rangée entière.


@wongnog: Cela ne devrait pas être un problème. La ligne pour i = 10 à 2 étapes -1 devient pour i = 11 à 3 étapes -1 et A1: A30 devient A2: A31 :)


@wongnog: vient de voir votre édition. Si vous voulez le faire pour plusieurs colonnes, remplacez simplement A2: A31 sur A2: F31 . Je suppose que les données sont jusqu'à ce que la colonne f . Remplacer f avec la lettre de colonne correspondante


@SidDharth Cela ne fonctionne que partiellement, car il copie les valeurs de la colonne A mais pas la ligne entière. De plus, je devrai changer manuellement le code «pour i = 11 'et' A2: A31» pour chaque fichier car il peut ne pas être le même numéro de rangées. J'ai mis à jour mon message original pour mieux décrire mon fichier. Êtes-vous capable d'aider avec la 2e partie, qui est uniquement pour seulement des lignes en double lorsque la colonne J est vide?


Ouais si vous comprenez la logique, c'est très simple :) Dans mon code, vous pouvez toujours utiliser des variables au lieu de valeurs codées dures. Par exemple, pour i = StarRow to endrow concernant 2-11 ou 2-21 Comment est-ce déterminé?


Il devrait copier des lignes 2 à 11 fois si les valeurs de J2: J11 sont vides ou des lignes 2-21 si J2: J21 sont vides



0
votes

Si la colonne A peut être invoquée à afficher les étendons des lignes à traiter, puis à trouver la dernière ligne peuplée de la colonne A et en fonction de la rangée 2 doit couvrir toutes les lignes à traiter.

Sub add_Duplicate_Blank_Js()
    Dim rw As Long

    With Worksheets("Sheet4")
        With .Cells(1, 1).CurrentRegion
            For rw = .Rows.Count To 2 Step -1
                If Not CBool(Len(.Cells(rw, "J"))) Then
                    With .Rows(rw).Cells
                        .Copy
                        .Resize(2, .Columns.Count).Insert Shift:=xlDown
                    End With
                End If
            Next rw
            Application.CutCopyMode = False
        End With
    End With
End Sub


4 commentaires

Belle idée, mais malheureusement exécutant le code ne produit aucun résultat


Les cellules de direction dans la colonne j véritablement vierge ou contiennent-elles des chaînes de longueur zéro renvoyées par des formules?


Aahhhh je suis tellement stupide! Les cellules vides de la colonne J contiennent en fait un espace.


@wongnog - J'ai ajusté le code pour couper l'espace et rechercher une longueur de zéro.