0
votes

Rechercher / évaluer la plage 2 dans la feuille de calcul A avant de coller la valeur dans la feuille de calcul B

Je reçois:

Erreur d'incompatibilité, runtime 13

Sub Lookup()

For Each Cell In Workbooks("ID.xlsx").Worksheets("ID").Range("B:B")

If Range("B:B").Cells.Value = "RM" Then

End If

Next

For Each Cell In Workbooks("ID.xlsx").Worksheets("ID")

If Range("C:C").Cells.Value = "Sales $" Then

Workbooks("ABC_Actuals and Targets.xlsm").Worksheets("ID").Cells(9, 7).Value = Workbooks("ID.xlsx").Worksheets("ID").Range("BM:BM").Value

End If

Next

End Sub

J'ai l'intention de faire une boucle Excel à travers les cellules dans les plages de B: B de Ws Source, si True, alors boucle à travers les cellules dans les plages C: C de Ws Source, si True alors Copiez la valeur de cette ligne, dans la colonne BL de Ws Source Paste Value dans la cellule de destination Ws désignée (9,7).

Il y a de nombreuses colonnes dans Ws Source. Exemple : Avec Ws Source: Recherchez RM dans la colonne B, puis recherchez Sales $ dans la colonne C, si ces 2 sont vrais, copiez la valeur dans la colonne BL de cette ligne et PasteValue to Cells (9, 7) dans Ws Destination.

Dans Ws Source, il y a 43 "RM" (s) colonne B et 58 "Ventes $" dans la colonne C. Une ligne est unique lorsque "RM" dans la colonne B et "Sales $" dans Ws Source se produit.

Ce que j'ai l'intention de définir la valeur de Destination Wbk.Cell (9,7) sur la colonne BL de cet unique Ws Source mentionnée ci-dessus.


7 commentaires

If Range ("B: B"). Cells.Value = "RM" doit-il être if cell.value = "RM" ?


Je ne pense pas que vous puissiez coller Range ("BM: BM"). Value dans Cells (9, 7) . Essayez Copier, puis Coller dans la ligne suivante. Et pourquoi parcourez-vous toutes les cellules de la feuille, examinez-vous chacune d'elles si c'est "RM" et ensuite ne faites rien, quel que soit le résultat de cet examen?


@Variatus modifiée de la question pour une meilleure clarté


@Nathan_Sav édité pour une meilleure clarté


Doit "Ventes $" dans la colonne C soit trouvée dans la même ligne où "RM" a été trouvé dans la colonne B?


@HTH Oui, ils doivent


@ Eric1234, d'accord. Ensuite, vous voudrez peut-être voir ma réponse


3 Réponses :


0
votes

Le code ci-dessous est une interprétation juste de ce que vous avez expliqué ci-dessus. Essayez-le. Prenez également note des commentaires. Ils vous aideront à comprendre comment la logique est construite dans VBA.

Option Explicit

Sub Lookup_DoSomething()            ' "Lookup" is the name of an Excel function

    ' always declare all your variables, especially the objects!
    '   Use Option Explicit to help you

    Dim WsS As Worksheet            ' Source sheet
    Dim WsD As Worksheet            ' Destination sheet
    Dim Cell As Range

    ' Note: both workbooks must be open or an error will occur
    Set WsS = Workbooks("ID.xlsx").Worksheets("ID")
    Set WsD = Workbooks("ABC_Actuals and Targets.xlsm").Worksheets("ID")

    ' use proper indenting to help you read your code
    '   and better understand its logic
    For Each Cell In Ws.Range("B:B")
        ' 'Cell.Offset(0, 1)' is in column C
        If Cell.Value = "RM" And Cell.Offset(0, 1).Value = "Sales $" Then
            WsD.Cells(9, 7).Value = WsS.Cells(Cell.Row, "BL").Value
            ' I think you need to end the loop when the value was found
            ' if you don't do that the loop will continue writing to
            ' the same cell and you get to see only the last one found.
            Exit For
        End If
    Next Cell                       ' always specify which "Next"
End Sub


7 commentaires

Merci beaucoup. Je suis un débutant en codes, pardonnez-moi s'il vous plaît: quelle partie de cela ferait alors défiler C: C pour rechercher le critère "Ventes $"? Je vois qu'après RM, il faut immédiatement passer à la colonne C via 0,1 mais il y a 20 RM (s) et il est nécessaire de passer à C: C et de trouver "Sales $" avant d'arriver à la bonne cellule pour définir la valeur?


Imaginez que vous trouviez "RM" dans B8. Ensuite, vous parcourez C: C et trouvez "Sales $" dans la ligne 24. Je n'ai pas trouvé le sens. Par conséquent, j'ai supposé que Sales $ serait dans la même ligne 8 mais dans la colonne C. Pas besoin de boucler car la ligne est déjà trouvée. Si cette présomption est erronée, vous devez mieux expliquer la configuration de vos données. Si vous supprimez Exit For , la boucle peut trouver toutes les instances de "RM" mais vous n'avez fourni qu'une seule cellule dans laquelle écrire, Cells (9, 7). Où devraient aller les autres valeurs?


Il y a 43 RM (S) dans la colonne B et 58 "Ventes $" dans la colonne C La droite se trouve que lorsque "Ventes $" est en C: C et "RM" dans B: B coïncide. La valeur à appliquer sur les cellules WSD (9,7) est dans la colonne WSS BL de cette ligne.


D'ACCORD. Entendu. (1) Quelle valeur doit être transférée? B = "RM" et C = "Ventes $". Alors, de quelle colonne souhaitez-vous transférer la valeur? (2) Vous avez 43 valeurs à transférer mais une seule cellule dans laquelle les coller. Si 43 valeurs sont collées dans la même cellule, chaque nouveau collage effacera la précédente. Donc, vous ne voyez que le dernier.


(1) Il n'y a qu'une seule ligne dans le fichier où B = "RM" et C = "Ventes". La colonne BL est la colonne de cette 1 ligne où la valeur est située dans WsS. Ce que le code fait maintenant, c'est identifier RM mais c'est un tableau de 43 lignes. Ce n'est qu'après avoir appliqué le 2ème critère si C = "Ventes" qu'il s'agirait d'une ligne, la n colonne BL de cette ligne contient la valeur à partir de laquelle le transfert est effectué. (2) Si la ligne ci-dessus est 8, la colonne BL doit être 64.


J'ai modifié le cas pour mieux refléter la configuration des données.


BTW, une fonction SUMIFS () dans WsD.Cells (9, 7) extraire la valeur plus rapidement et plus facilement que le Sub sur lequel nous travaillons. Nous ne savons toujours pas quoi faire si la valeur n'est pas trouvée, mais à moins que le sous-marin ne soit lié à un projet d'automatisation plus vaste nécessitant vraiment des capacités VBA, vous devriez être mieux avec une fonction de feuille de calcul. Et si vous avez besoin de VBA pour d'autres raisons, vous devez utiliser la même fonction, mais appelée à partir de VBA à la place de la boucle que nous avons essayé de construire.



0
votes

Vous pouvez essayer:

Option Explicit

Sub test()

    Dim wsS As Worksheet, wsD As Worksheet
    Dim LastRow As Long, i As Long
    Dim arr As Variant

    'Set the workbooks
    Set wsS = Workbooks("ID.xlsx").Worksheets("ID")
    Set wsD = Workbooks("ABC_Actuals and Targets.xlsm").Worksheets("ID")

    With wsS
        'Find the last row of column B to avoid looping all column
        LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
        'Import the values in an array to be more fast
        arr = .Range("A1:C" & LastRow)
        'Loop array
        For i = LBound(arr) To UBound(arr)
            'If both conditions met
            If arr(i, 1) = "RM" And arr(i, 2) = "Sales $" Then
                'Import in the destination workbook the value of column C
                With wsD
                    .Cells(9, 7).Value = arr(i, 3)
                End With

            End If

        Next i

    End With

End Sub


2 commentaires

Bien qu'il n'y ait aucune erreur / débogage, aucune valeur n'est mise à jour dans la cellule 9,7.


Parcourez le code et vérifiez les valeurs, les conditions et les plages. Si vous avez d'autres questions, veuillez m'en informer.



0
votes

Ce serait un travail autofilter , mais voici un possible () soultion: xxx

modifier pour ajouter un Autofilter Solution basée sur la base: xxx

et où il est supposé qu'une correspondance est toujours trouvée


2 commentaires

J'ai essayé, jusqu'à présent son "No such match!". Je vais relooker s'il y a des références qui sont erronées de mon côté. Merci beaucoup!


Je vous en prie. Avez-vous également essayé le deuxième code?