Excel VBA If Cells (x, J). Значение = значение - PullRequest
1 голос
/ 05 марта 2019

Я очень новичок в Excel vba, но я хочу использовать оператор if then для ввода значения.Ниже приведена функция, которую я пытаюсь использовать.Выдает ошибку компиляции по жирным линиям.В основном я пытаюсь заменить ячейку Jx на ячейку AXx, если Jx = N / A.Пожалуйста, помогите!

Public Function GetDivisionFromCustRef()

Sheet1.Select

Dim x As Integer

x = 1

Do Until x > 8

**If Cells(x, J).Value = "N/A"**
    **Then**
        Cells(x, J).Value = Cells(x, AX).Value
        x = x + 1        
    Else: Cells(x, J).Value = Cells(x, J)
End If
Loop
End Function 

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

J - допустимое имя переменной.В VBA, когда вы хотите, чтобы что-то было строковым литералом , вам нужно заключить его в двойные кавычки, поэтому "J" - точно так же, как вы это сделали с "N/A".

Есливаш модуль сказал Option Explicit вверху, что J вызвало бы ошибку компиляции за то, что она была необъявленной переменной - и это хорошо!Вы всегда должны указывать Option Explicit в верхней части каждого модуля, чтобы опечатки и необъявленные переменные не позволяли компилировать программу, которая не может дать правильный вывод.

В операторе If...Then должен быть Then токен в той же строке, что и ключевое слово If - существует два способа записи оператора If.

Inline:

If {condition} Then {statement}

Или блок:

If {condition} Then
    {statements}
{Else}
    {statements}
End If

Обратите внимание, что маркер-разделитель инструкций (:) является избыточным после Else.

Процедура a Function;функции обычно возвращают результат - что-то для потребителя, чтобы потреблять.Учитывая имя «get Division from cust ref», я ожидал бы, что функция вернет что-то вроде кода деления с учетом кода клиента или аналогичного.Вы можете заставить функцию возвращать свой результат, присваивая ее идентификатору:

GetDivisionFromCustRef = {result}

Функции обычно не имеют побочных эффектов, таких как выбор листа или замена значений ячеек;у вас есть Function процедура, но вы используете ее как Sub.Вместо этого сделайте Sub процедуру и назовите ее по назначению - ничего не получится.Примерно так:

Public Sub UpdateDivisionForCustomers()

Sheet1 не нужно выбирать или активировать.Вместо того, чтобы работать с неквалифицированными Cells вызовами членов, используйте этот Sheet1 объект в качестве квалификатора:

If Sheet1.Cells(...) ... Then
    Sheet1.Cells(...) = Sheet1.Cells(...)
End If

Если многократный ввод «sheet1» раздражает, вы можете использовать блок With:

With Sheet1
    If .Cells(...) ... Then
        .Cells(...) = .Cells(...)
    End If
End With

Наконец, строковый литерал "N/A" не является значением ошибки ячейки рабочего листа - это строковый литерал, который содержит символы N, / и A.Если вы хотите проверить, вернула ли формула ошибку #N/A, вам нужно использовать функцию IsError, потому что значение этой ячейки будет иметь тип данных Variant/Error, и пытаться сравнить этот тип данных с чем-либо, кромеError выдаст ошибку времени выполнения 13 / «несоответствие типов».


Включая все вышеперечисленное:

Option Explicit

Public Sub UpdateDivisionForCustomers()

    Dim x As Integer        
    x = 1

    Do Until x > 8       
        If IsError(Sheet1.Cells(x, "J").Value) Then
            Sheet1.Cells(x, "J").Value = Sheet1.Cells(x, "AX").Value
            x = x + 1
        Else
            Sheet1.Cells(x, "J").Value = Sheet1.Cells(x, "J").Value
        End If
    Loop

End Sub
1 голос
/ 05 марта 2019

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

On Error Resume Next 'needed here in case there are no formula cells with errors
Dim errors As Range
Set errors = Range("J1:J8").SpecialCells(xlCellTypeFormulas, xlErrors)
On Error GoTo 0 'be sure turn error catching back on 

If Not errors Is Nothing Then

    With errors
        .FormulaR1C1 = "=RC[40]"
        .Value = .Value
    End With

End If

И если вам нужно сгладить формулы и для правильных значений, вы можете добавить эту строку после выполнения другого кода:

With Range("J1:J8").SpecialCells(xlCellTypeFormulas)
   .Value = .Value
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...