0
votes

Basé sur la valeur cellulaire, identifier la ligne actuelle et copier la même ligne dans 3 feuilles de calcul dans un nouveau classeur (en boucle) - VBA

La manière dont mes données sont la configuration sont les suivantes:

feuille de maîtrise:
Colonne A: Noms de la société (rangées 1-100)
Colonne B: Drapeau? Y / N (rangées 1-100)

feuille2:
Colonne A: Noms de la société (lignes 1-100 dans le même ordre que la feuille maître)
Colonnes BD: Données de chaque société (données d'une société par ligne)

feuille 3/4 sont identiques sur la feuille2, juste des données différentes.

Ce que j'essaie faire:
Si sur la valeur de la colonne B de feuille maître est "Y", c'est "Y", alors pour cette ligne, copiez la même ligne de feuilles 2/3/4 dans un nouveau classeur.

Exemple: de
Dans la feuille principale, la première ligne avec une valeur "y" est la ligne 6 (donc, la société n ° 6). J'aimerais copier la ligne 6 des feuilles 2/3/4 dans un nouveau classeur avec 4 feuilles (première feuille de feuille 6 uniquement, feuille2 / 3/4 rangée 6 uniquement).

répéter pour toutes les lignes avec une valeur y.

Le code que j'ai jusqu'à présent: xxx

Ça ne fonctionne pas-- Mon hypothèse est dû à la ligne xxx

mais je ne sais pas comment travailler autour de cela. Toute aide appréciée.

merci.


7 commentaires

C'est lignes (11) pas k


Vous n'avez pas besoin de la variable en cours, il est déjà stocké dans k


Pouvez-vous également amender votre question à ("feuille maître"). Lignes ? Vous manquez un " et il gâche le reste de l'extrait de l'extrait


Pourquoi serait-il une ligne 11? Désolé juste d'essayer de comprendre. Et j'ai ajouté le ", mon mauvais! Merci.


Parce que d'abord, les lignes sont des chiffres et des colonnes sont des lettres - mais également dans VBA, les deux ont des valeurs numériques. Tout en tapant cela, j'ai réalisé que vous utilisez k comme une variable - essayez de cacher cette ligne et de la exécuter à nouveau - qu'est-ce que vous obtenez?


Qu'est-ce qui se passe exactement lorsque vous exécutez l'indice?


Le code d'origine était "bien", une petite erreur. Si des feuilles de calcul ("feuille maître"). Cellules (K, 2) .Value = "Y" puis . Une fois que vous avez utilisé Set wbtemp = workbooks.add Le nouveau classeur est le classeur actif maintenant, les feuilles de travail si elles ne trouveront jamais "feuille maîtrise". Ajout de WB. à cette ligne devrait réparer le tout. si wb.worksheets ("feuille maître"). Cellules (k, 2) .Value = "y" alors


3 Réponses :


0
votes

Lors de la copie sur la nouvelle feuille de calcul, vous devez accéder aux lignes de la feuille de la feuille.

wb.Sheets(3).Rows(currentRow).Copy Destination:=wbTemp.Sheets(3).Rows(1)


0 commentaires

2
votes

On dirait que vous pouvez le faire dans une autre déclaration de boucle imbriquée. Pas besoin de créer une deuxième variable pour suivre la ligne que vous êtes sur la ligne - votre variable k est déjà ceci.

Vous devrez ajouter DIM J comme long bien sûr xxx


9 commentaires

Cela semble bon! J'essaie de le tester maintenant, mais je reçois une erreur pour la ligne "Nest J" - j'ai ajouté le Dim J aussi longtemps que je ne sais pas ce qui cause ce problème? Il dit sous ou fonction non définie.


Essayez-vous de tester ce code tel quel? Cela doit être mis dans votre code en remplaçant votre boucle


Non, je l'amène à inclure dans le reste du code-- J'ai réalisé que, au lieu de nid, il devrait être suivant! Va tester maintenant et rapportera.


Je reçois une erreur dès qu'elle ouvre le nouveau classeur (et le code cesse de fonctionner alors aussi); Erreur de temps d'exécution 9, indice hors de portée. Qu'est-ce qui pourrait causer ça?


Lorsque vous partagez des erreurs, vous devez indiquer exactement quelle ligne. Cette erreur pourrait être sur n'importe quelle ligne où vous vous référez à un objet de plage


J'ai corrigé l'erreur antérieure en faisant la ligne "si wb.worksheets (...". Maintenant, je reçois une autre erreur sur la ligne sous le j pour boucle: "WB.Sheets (J) ... L'erreur est Erreur d'exécution 438: L'objet ne prend pas en charge cette propriété ou cette méthode. (Merci pour toute votre aide)


Si cela aide, j'ai remarqué que l'erreur survient après la copie de la ligne de la première feuille. J'ai essayé de prendre la fonction de copie hors de la boucle et de le répéter manuellement pour les feuilles 1 à 4, et maintenant la ligne en surbrillance pour le même message d'erreur est la deuxième ligne. Il semble copier le premier plateau juste bien, mais il est bloqué lorsque vous essayez de copier la ligne de la deuxième feuille.


Je pense que je suis arrivé à la racine de la question! Lorsque le nouveau classeur est créé, il ajoute seulement une feuille. Lorsque vous essayez de copier la deuxième feuille, il ne peut pas trouver une "feuille (2)" dans la TEMPWB; Serait-il possible de créer 4 feuilles dans la ligne de travail)?


Pas sûr - vous pouvez simplement nier que dans la boucle j aussi



0
votes

Avec beaucoup d'aide de @turdearboy, a atteint cette solution:

Dim wb As Workbook, FileNm As String, LastRow As Long, wbTemp As Workbook, k As Long, z As Long

Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.SheetsInNewWorkbook = 4 'must add this line for the nested loop to work

Set wb = ThisWorkbook

    With wb
    LastRow = .Sheets(1).Cells(.Sheets(1).Rows.Count, 1).End(xlUp).Row

End With


For k = 1 To LastRow
    FileNm = wb.Path & "\" & "BOOK" & k & ".xlsx" 'adding the k to number every workbook from 1 to number of rows

    Set wbTemp = Workbooks.Add 'adding a new workbook, will add 4 sheets

        If wb.Worksheets("Master Sheet").Cells(k,2).Value = "Y" Then  'have to add "wb."

        For z = 1 To 4

        wb.Sheets(z).Rows(k).Copy Destination:=wbTemp.Sheets(z).Rows(k)

        Next z

End If
    wbTemp.SaveAs FileNm
    wbTemp.Close
    Set wbTemp = Nothing
Next k

Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True


0 commentaires