Инструкция if_elseif в VBA

Я застрял с выполнением If .. Else statement в течение нескольких недель. Я сталкиваюсь с такими проблемами, как «несоответствие типов», или когда я запускаю код, ничего не появляется в моих ячейках. Пожалуйста, помогите мне решить эту проблему.

 Sub ifstatement() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("SamplePO") Dim rg, rg1 As Range Set rg = ActiveSheet.Range("L17:L90") Set rg1 = ActiveSheet.Range("I17:I90") Dim pound As Double Dim nettwt As Double Dim grosswt As Double If rg < 130 Then grosswt = rg1 + 20 ElseIf rg = 131 And rg <= 200 Then grosswt = (rg1 * 0.15) + 15 ElseIf rg = 201 And rg <= 500 Then grosswt = rg1 * 0.11 ElseIf rg = 501 And rg <= 999 Then grosswt = rg1 * 0.7 ElseIf rg = 1000 And rg <= 2000 Then grosswt = rg1 * 0.5 ElseIf rg = 2001 And rg <= 4999 Then grosswt = rg1 * 0.5 ElseIf rg = 5000 And rg <= 8000 Then grosswt = rg1 * 0.5 ElseIf rg = 8001 And rg <= 10000 Then grosswt = rg1 * 0.5 End If End Sub 

Эти изменения исходного кода могут решить вашу проблему.
У вашего кода есть несколько проблем, некоторые из которых были упомянуты коллегами-кодовыми в комментариях.
Я предлагаю вам пойти и исследовать каждый, чтобы понять, почему ваш код не работает.

  Sub ifstatement() Dim rg As Range Dim cell As Range Set rg = ActiveSheet.Range("L17:L90") Dim grosswt As Double For Each cell In rg.Cells grosswt = 0 If cell <= 130 Then grosswt = cell.Offset(0, -3).Value + 20 ElseIf cell >= 131 And cell <= 200 Then grosswt = (cell.Offset(0, -3).Value * 0.15) + 15 ElseIf cell >= 201 And cell <= 500 Then grosswt = cell.Offset(0, -3).Value * 0.11 ElseIf cell >= 501 And cell <= 999 Then grosswt = cell.Offset(0, -3).Value * 0.7 ElseIf cell >= 1000 And cell <= 2000 Then grosswt = cell.Offset(0, -3).Value * 0.5 ElseIf cell >= 2001 And cell <= 4999 Then grosswt = cell.Offset(0, -3).Value * 0.5 ElseIf cell >= 5000 And cell <= 8000 Then grosswt = cell.Offset(0, -3).Value * 0.5 ElseIf cell >= 8001 And cell <= 10000 Then grosswt = cell.Offset(0, -3).Value * 0.5 End If cell.Offset(0, 1).Value = grosswt ' Will output the answer in column "M" from "M17:M90" Next cell End Sub 

Вы также можете (как упоминалось другими в комментариях) использовать свою собственную функцию.
Создайте эту функцию, затем в ячейках, где вы хотите получить ответы: =myfunc(I17,L17) затем перетащите его, пока не =myfunc(I90,L90) до =myfunc(I90,L90)

  Function myfunc(check As Range, use As Range) As Double Dim grosswt As Double If check.Value <= 130 Then grosswt = use.Value + 20 ElseIf check.Value >= 131 And check.Value <= 200 Then grosswt = (use.Value * 0.15) + 15 ElseIf check.Value >= 201 And check.Value <= 500 Then grosswt = use.Value * 0.11 ElseIf check.Value >= 501 And check.Value <= 999 Then grosswt = use.Value * 0.7 ElseIf check.Value >= 1000 And check.Value <= 2000 Then grosswt = use.Value * 0.5 ElseIf check.Value >= 2001 And check.Value <= 4999 Then grosswt = use.Value * 0.5 ElseIf check.Value >= 5000 And check.Value <= 8000 Then grosswt = use.Value * 0.5 ElseIf check.Value >= 8001 And check.Value <= 10000 Then grosswt = use.Value * 0.5 End If myfunc = grosswt End Function 
  1. «Вы не можете обрабатывать диапазоны с несколькими ячейками, как если бы они были отдельными ячейками. Вероятно, вам нужна какая-то петля». – Время Уильямса
  2. «что он сказал +, тот факт, что все ваши первые условия проверяют точное равенство. Вероятно, вы хотите проверить, является ли {один номер}> =, вместо того, чтобы проверять, является ли {диапазон переменных} =" – Банго
  3. Вы никогда не назначаете какую-либо ячейку для вычисленного значения.

Добавьте это ниже UDF и используйте его в виде встроенных формул.
например, в ячейке «Весовой вес» для строки 7, =GetGrossWeight(I7,L7) . Заполните формулы. Предполагая, что отрезанные фунты будут 130 200 500 1000.

 Function GetGrossWeight(LBS As Range, NetWeight As Range) As Double Dim GrossWeight As Double Select Case CDbl(LBS.Value) Case Is <= 130: GrossWeight = NetWeight.Value + 20 Case Is <= 200: GrossWeight = NetWeight.Value * 0.15 + 15 Case Is <= 500: GrossWeight = NetWeight.Value * 0.11 Case Is <= 1000: GrossWeight = NetWeight.Value * 0.7 Case Else: GrossWeight = NetWeight.Value * 0.5 End Select GetGrossWeight = GrossWeight End Function 

Попробуйте использовать функцию countif, как показано ниже, чтобы узнать, сколько ячеек в диапазоне соответствуют критериям.

  If application.worksheetfunction.countif(rg, "<130") >= 0 Then 

Вам понадобится использовать цикл для выполнения операции в диапазоне после выполнения условия. Попробуйте for loop следующим образом:

 for each cell in rng cell.value = cell.value + 20 'you can put whatever operation you want to execute on the range here next cell 

Затем вы можете перейти в следующий elseif том же формате, используя countif, чтобы определить, удовлетворено ли условие и for loop чтобы выполнить операцию в диапазоне ячеек.

Надеюсь, это поможет!

Interesting Posts

Переместить колонку влево

VBA Excel WebBrowser, как сбросить ReadyState до. Нажмите из кода?

Как повысить эффективность работы листа?

Сохранять изображения в заголовках Excel с использованием Apache POI

Как экспортировать сетку в столбец Excel и даты можно отфильтровать / сохранить как дату вместо строки в jQWidgets?

EXCEL, применить таблицу стилей к различным файлам excel

Проблема с использованием библиотеки excel XLNT

Предоставление значений массива в коде

Невозможно найти несоответствие типа VBA

Excel VBA Runtime Error 1004 при циклическом перемещении листов и извлечении данных

Как работать с дубликатами с помощью Excel / R?

Каков самый быстрый способ вставки большого количества CSV-данных в базу данных mysql с использованием C #?

Excel: Замораживание одновременно столбца и строки

Как вы ссылаетесь на DLP EPPlus?

Поиск последнего появления дублированного элемента в диапазоне (столбец)

Давайте будем гением компьютера.