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.
3 Réponses :
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
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.
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
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.
Ce serait un travail code> autofilter code>, mais voici un modifier pour ajouter un et où il est supposé qu'une correspondance est toujours trouvée p> p> possible () code> soultion: Autofilter Code> Solution basée sur la base: p>
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?
If Range ("B: B"). Cells.Value = "RM"doit-il êtreif cell.value = "RM"?Je ne pense pas que vous puissiez coller
Range ("BM: BM"). ValuedansCells (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