Je travaille sur un document Excel en utilisant VBA. Ce document contient une base de données avec plusieurs colonnes, mais pour simplifier, disons que j'ai 2 colonnes:
J'essaye de créer une macro qui vérifie tous les nombres de la colonne F (avec une boucle). Si le nombre est supérieur à 100, vérifiez la cellule adjacente dans la colonne C. Si le nom correspond à une condition (disons correspond à John ou Tom), ajoutez la valeur du nombre dans une autre feuille. Si aucune de celles-ci ne s'applique, vérifiez la cellule suivante.
Mon problème est que je ne trouve pas de moyen de définir les cellules de la colonne C (Créer une variable / objet pour appeler les cellules ou appeler directement le cellule adjacente).
Mon code ressemble à ceci:
Sub Test1() Dim rngnumbers, rngnames, MultipleRange As Range Set rngnumbers = Sheet2.Range("F2:F999") Set rngnames = Sheet2.Range("C2:C999") Set MultipleRange = Union(rngnumbers, rngnames) For Each numb In rngnumbers If numb.Value >= 100 Then If Sheet2.Range("C2") = "John" Or Sheet2.Range("C2") = "Tom" Then '''The problem here is that it only looks at the cell C2 and not the adjacent cell Sheet1.Range("I999").End(xlUp).Offset(1, 0).Value = numb.Value Else End If End If Next numb End Sub
J'ai essayé de modifier la ligne:
'Si Sheet2.Range ("C2") = "John" Or Sheet2.Range ("C2") = "Tom"
Then '
à quelque chose comme:
'newname.String = "John"'
Mais je ne trouve pas de moyen de définir newname
.
Une autre idée serait d'incrémenter l'instruction If pour les noms dans la boucle For.
Remarque supplémentaire: Je n'utilise pas non plus de formules directement dans Excel car je ne veux pas de cellules vides ou de zéros lorsque les fonctions if sont False.
4 Réponses :
Est-ce que cela résout votre problème - référencer la cellule appropriée dans la colonne C? OFFSET fournit une référence relative, dans ce cas, regardez 3 colonnes à gauche de F.
Sub Test1() Dim rngnumbers As Range, rngnames As Range, MultipleRange As Range, numb As Range Set rngnumbers = Sheet2.Range("F2:F999") Set rngnames = Sheet2.Range("C2:C999") Set MultipleRange = Union(rngnumbers, rngnames) For Each numb In rngnumbers If numb.Value >= 100 Then If numb.Offset(, -3) = "John" Or numb.Offset(, -3) = "Tom" Then Sheet1.Range("I999").End(xlUp).Offset(1, 0).Value = numb.Value End If End If Next numb End Sub
Avez-vous plutôt envisagé SUMIFS?
Salut SJR, merci! L'utilisation du décalage l'a résolu. Non, utiliser SUMIFS n'est pas ce que je recherche pour le moment.
Vous voulez quelque chose comme ça?
Sub Test1() Dim lRow As Long, r As Long lRow = 1000 'last row in your data Dim ws As Worksheet Set ws = Worksheets("List with your data") For i = 2 To lRow If ws.Range("F" & i) > 100 Then If ws.Range("C" & i).Value = "John" Or ws.Range("C" & i).Value = "Tom" Then Worksheets("Another sheet sheet").Range("A" & r) = Range("C" & i).Value ' r - Row, where we want to enter uor text r = r + 1 'if you want to put next name on the next row End If End If Next End Sub
Option Explicit Sub Test1() Const cFirst As Integer = 2 Const cLast As Integer = 999 Const cCol1 As Variant = "F" Const cCol2 As Variant = "C" Const cCol3 As Variant = "I" Dim i As Integer Dim rngU As Range With Sheet2 For i = cFirst To cLast If IsNumeric(.Cells(i, cCol1)) And .Cells(i, cCol1) >= 100 Then If .Cells(i, cCol2) = "John" _ Or .Cells(i, cCol2) = "Tom" Then If Not rngU Is Nothing Then Set rngU = Union(rngU, .Cells(i, cCol1)) Else Set rngU = .Cells(i, cCol1) End If End If End If Next End With If Not rngU Is Nothing Then rngU.Copy Sheet1.Cells(cLast, cCol3).End(xlUp).Offset(1, 0) Set rngU = Nothing End If End Sub
Je travaille normalement avec des tableaux:
Sub Test1() Dim rngnumbers As Excel.Range Dim arrVals As variant Dim lngRow As long Arrvals = Sheet2.Range("C2:F999").value For Lngrow = lbound(arrvals,1) to ubound(arrvals,1) If arrvals(lngrow,4) >= 100 Then If arrvals(lngrow,1)= "John" Or arrvals(lngrow,1) = "Tom" Then '''The problem here is that it only looks at the cell C2 and not the adjacent cell Sheet1.Range("I999").End(xlUp).Offset(1, 0).Value = arrvals(lngrow,4) Else End If End If Next lngrow End Sub
En fait, je construirais probablement aussi un tableau de sortie, mais mon pouce est fatigué ...