2
votes

Comment écrire deux instructions IF pour différentes plages dans une boucle, VBA

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:

  • La colonne C correspond aux noms
  • La colonne F correspond aux nombres.

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.


0 commentaires

4 Réponses :


1
votes

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?


1 commentaires

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.



1
votes

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


0 commentaires

1
votes

Deux Ifs dans une boucle

Version Union

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

0 commentaires

0
votes

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


0 commentaires