Ошибка компиляции левой функции: Аргумент не является обязательным (VBA) - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь сделать несколько вещей с этой подпрограммой. Сначала мне нужно вставить строку после каждой 18-й строки. Затем мне нужно вставить строку в столбце A на основе строки в приведенной выше строке (т. Е. 17-й строки в первой итерации). Наконец, мне нужно снова вставить строку в столбец B i-й строки на основе ранее установленной строки.

Итак, с точки зрения Layman, строка 17 скажет 120F_CASH, я хочу найти «_» и взять символы в строка слева от "_", затем в строке 18 я хочу поместить 120F & "_MULTI_STRAT" в столбец A в столбце B строки 18, я хочу вставить "SSELECT PERF.IMST.INDEX WITH ENTITY =" & "120F" & "AND WITH CATEGORY1 =" "01" ""

вот мой код:

Option Explicit

Sub InsertRowEveryXrows()
Dim r As Long, lr As Long
Dim code As String

lr = Range("A" & Rows.Count).End(xlUp).Row
    For r = 18 To lr Step 18
        Rows(r).Insert Shift:=xlDown
        Set code = Left(Range(Cells(r - 1, "A"), InStr(1, "_", Cells(r, "A")) - 1))
        Cells(r, "A") = code & "_MULTI_STRAT"
        Cells(r, "B") = "SSELECT PERF.IMST.INDEX WITH ENTITY = " & code & "AND WITH CATEGORY1 = ""01"""
    Next r
End Sub

Я получаю ошибку компиляции: неверное количество аргументов или неверное присвоение свойств в эта строка:

Установить код = влево (диапазон (ячейки (r - 1, «A»), InStr (1, «_», ячейки (r, «A»)) - 1) )

расположение строки находится в строке 17 (r-1) в столбце A, а количество символов определяется по запросу "_"

Что мне не хватает? * fyi Я должен был добавить пробел после подчеркивания, чтобы он правильно отображался здесь, однако, НЕ ДОЛЖЕН быть пробел после подчеркивания.

Ответы [ 2 ]

3 голосов
/ 18 февраля 2020
Set code = Left(Range(Cells(r - 1, "A"), InStr(1, "_", Cells(r, "A")) - 1))

Функция Left хочет получить строку и целое число, но вы не указали целое число. Вот то же выражение, без вызова внешней функции Left:

Set code = Range(Cells(r - 1, "A"), InStr(1, "_", Cells(r, "A")) - 1)

Заметили что-нибудь? Результат InStr передается в качестве 2-го аргумента свойству (101) * (неквалифицированному), и это не то, что вы хотели.

На самом деле вам не нужно Range позвони вообще. Это должно быть ближе к вашим намерениям:

Set code = Left(Cells(r - 1, "A"), InStr(1, "_", Cells(r, "A")) - 1)

Обратите внимание, что здесь происходит довольно много неявного кода; в явном виде читается так:

Set code = Left(ActiveSheet.Cells(r - 1, "A").Value, InStr(1, "_", ActiveSheet.Cells(r, "A").Value) - 1)

Вы действительно намереваетесь работать только с тем рабочим листом, который окажется активным? Скорее всего, нет, но если это так, рассмотрите возможность явного определения этих Cells вызовов с помощью ActiveSheet. Если вы хотите работать с указанным c листом, вместо этого используйте этот объект листа в качестве классификатора.

Теперь вы используете Set для этого назначения, но code не является объектом ссылка, и это еще одна проблема.

Строки не являются объектами в VBA, они назначаются с обычным синтаксисом присваивания значений. То есть без ключевого слова Set (вы могли бы иметь прежнее ключевое слово Let, если хотите, но это не нужно):

code = Left(ActiveSheet.Cells(r - 1, "A").Value, InStr(1, "_", ActiveSheet.Cells(r, "A").Value) - 1)

Теперь, Range.Value (здесь явно, неявно в Ваш код) будет Variant, а не String. В большинстве случаев это не имеет значения.

Пока одна ячейка не имеет подтипа Variant/Error (например, #N/A или #VALUE! ошибки листа); тогда все взрывается с ошибкой несоответствия типов . Чтобы избежать этого, вы можете использовать Text ячейки вместо Value, или вы можете перетащить это значение в собственную локальную переменную Variant и продолжать обрабатывать его как строку только тогда, когда IsError возвращает False за это.

0 голосов
/ 18 февраля 2020

Вы можете использовать что-то вроде этого

Function Pop_String(strInput As String, strDelim As String, Optional lngInstance = 1)

Dim aTemp() As String

aTemp = Split(strInput, strDelim, lngInstance + 1)

Pop_String = aTemp(lngInstance - 1)

End Function

Вызов, как так

Pop_String("a-b-c-d-e-f","-",4) возвращает d Pop_String("a-b-c-d-e-f","-",2) возвращает b

Я бы также добавил некоторые проверки ошибок по умолчанию (без третьего аргумента) первый раздел, поэтому

Pop_String("test-string","-") вернет test, а Pop_String("test-string","-",2) вернет строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...