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é ...