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