Nano Hash - криптовалюты, майнинг, программирование

Как написать два оператора IF для разных диапазонов в цикле, VBA

Я работаю над документом Excel, используя VBA. Этот документ содержит базу данных с несколькими столбцами, но для простоты предположим, что у меня есть 2 столбца:

  • Столбец C соответствует именам
  • Колонка F соответствует числам.

Я пытаюсь создать макрос, который проверяет все числа в столбце F (с циклом). Если число больше 100, то проверьте соседнюю ячейку в столбце С. Если имя соответствует условию (скажем, соответствует Джону или Тому), то добавьте значение числа в другой лист. Если ни один из них не подходит, проверьте следующую ячейку.

Моя проблема в том, что я не могу найти способ определить ячейки в столбце C (создание переменной/объекта для вызова ячеек или прямой вызов соседней ячейки).

Мой код выглядит так:

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

Я попытался изменить строку:

'If Sheet2.Range("C2") = "John" Or Sheet2.Range("C2") = "Tom" Затем что-то вроде: 'newname.String = "John" '

Но я не могу найти способ определить newname. Другой идеей было бы увеличить оператор If для имен внутри цикла For.

Дополнительное примечание: я также не использую формулы непосредственно в Excel, поскольку мне не нужны пустые ячейки или нули, когда функции if имеют значение False.


Ответы:


1

Решает ли это вашу проблему - ссылка на соответствующую ячейку в столбце C? OFFSET обеспечивает относительную ссылку, в этом случае посмотрите на 3 столбца слева от 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

Рассматривали ли вы вместо этого СУММЕСЛИМН?

16.01.2019
  • Привет SJR, Спасибо! Использование смещения решило это. Нет, использование SUMIFS это не то, что я ищу в данный момент. 16.01.2019

  • 2

    Вы хотите что-то вроде этого?

    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
    
    16.01.2019

    3

    Два ЕСЛИ в цикле

    Версия Союза

    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
    
    16.01.2019

    4

    Обычно я работаю с массивами:

    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
    

    На самом деле я бы, наверное, тоже построил выходной массив, но мой большой палец устал...

    16.01.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..