2014-12-10 2 views
0

В последнее время я работаю над кодированием макроса Word в VBA, чтобы сэкономить время на определенных документах. Идея состоит в том, чтобы заполнить второй столбец таблицы процедурами, основанными на строке чисел из первого столбца. У меня есть одна функция, которая читает первый столбец, который работает нормально. Я передаю массив, содержащий эти данные, другой функции. Я проверял, что я проходил правильно. Моя проблема возникает, когда я пытаюсь заполнить массив для второго столбца на основе массива для первого столбца. У меня есть массив структур, действующих как своего рода «ключ»; каждый элемент «ключ» содержит строку чисел сравнить первый столбец в качестве одного из членов, и соответствующая процедуры, функции another.This выглядит примерно так:Заполнение массива в VBA условно

Sub myFunction(ByRef codesFromTable() As String, ByRef procedures() As String) 
    Dim key(3) As myType 
    Dim x As Integer 
    Dim y As Integer 
    key(0).code = "1234" 
    key(0).procedure = "Procedure 1" 
    key(1).code = "2345" 
    key(1).procedure = "Procedure 2" 
    key(2).code = "3456" 
    key(2).procedure = "Procedure 3" 
    For x = 0 To 5 
    For y = 0 To 2 
     If StrComp(codesFromTable(x), key(y).code = 0 Then 
      procedures(x) = key(y).procedure 
    Next y 
    Next x 

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

+0

Использование Следующие x и Следующие y – Whome

+0

@Whome Будет ли это действительно иметь значение? У меня создалось впечатление, что ключевое слово Next - это увеличение счетчика в цикле. Кроме того, кажется, что счетчик увеличивается и что данные из последней итерации назначаются всем элементам массива процедур. Независимо от того, спасибо за ваш вклад. Я проверю это завтра и последую. – MisterTophatJones

ответ

0

Я думаю, что существуют две проблемы в вашем коде:

(1) В строке "Если StrComp (codesFromTable (х), ключ (у) .code) Тогда"

"StrComp" возвращает 0 когда два аргумента равны. К сожалению, 0 означает FALSE в VBA. Ваш код устанавливает «процедура», когда первый столбец НЕ СМЯТСЯ на клавишу.

Эта строка должна быть исправлена ​​следующим образом.

If StrComp(codesFromTable(x), key(y).code) = 0 Then 

(2) О содержимом "codesFromTable (х)"

К задаче (1), если первый столбец равен ключу (0) .code или ключа (1) .code , процедура становится ключом (2) .процедура.

Это не объясняет, почему процедура становится ключом (2) .процедура, когда первый столбец равен ключу (2) .code.

Я подозреваю, что тип кодовFromTable (x) не является строкой, а целым.

Вы можете проверить тип кодаFromTable(), добавив тип к аргументам следующим образом.

Sub myFunction(ByRef codesFromTable() as String, ByRef procedures() as String) 

Если тип codesFromTable (х) Целое число, ошибка типа несоответствие произошло во время компиляции.

+0

Благодарим вас за ввод. Внутри функции, с которой я передаю кодыFromTable(), она объявляется как строка. Я передаю его ссылкой на эту функцию, которая, как я предполагала, сохранит ее как строку. Я попробую ваше предложение. Что касается вашего первого предложения, я понятия не имел, что функция StrComp возвращает 0, когда строки равны. Я предположил, что это вернет истину.Это многое объясняет! Я попробую оба предложения завтра и последую за ними. – MisterTophatJones

+0

Я думаю, что функция StrComp в VBA от excel (http://www.techonthenet.com/excel/formulas/strcomp.php) является sama для VBA слова. StrComp (str1, str2) возвращает 0, если str1 = str2, возвращает 1, если str1> str2 и возвращает -1, если str1

+0

После того, как вы попробуете это и предложите @ Whatever, сценарий по-прежнему ведет себя одинаково. – MisterTophatJones

0

Сейчас я чувствую себя очень глупо. Посмотрев содержимое массивов, я понял, что функция StrComp всегда возвращала 1 или -1, потому что строки, которые были введены из таблицы, имели ограничивающий символ, прикрепленный к концу. Мой код по-прежнему не работал бы должным образом, если @Fumu 7 не объяснил, как работает StrComp, поэтому я буду отмечать это как ответ.

Смежные вопросы