2013-11-27 5 views
2

При компиляции некоторого кода (объявления, показанные ниже) я получаю сообщение об ошибке «Ошибка компиляции: обнаружено неоднозначное имя. SixTables. Я смотрел здесь и в другом месте, но не могу найти ничего, что бы соответствовало моей проблеме. То, что кажется наиболее распространенными причинами этой ошибки, объявляет две переменные с одинаковыми именами или дает одно и то же имя функции, а суб, из которой она вызвана, не применяется. И да, я знаю, что я мог просто изменить имя на то, что система была довольна, но (1) я не узнал бы, что я делаю неправильно, и (2) я выбрал это имя по какой-то причине - он соответствует его цель точно :-)Почему VBA говорит, что он нашел «неоднозначное имя»?

Option Explicit 

Dim ArmOfService As Byte 
Dim CharacterNumber As Long 
Dim CurrentTerm As Byte 
Dim DecorationRollMade As Byte 
Dim DecorationRollNeeded As Byte 
Dim DiceSize As Byte 
Dim GenAssignment 
Dim GenAssignmentSwitchInt As Byte 
Dim GenAssignmentSwitchOff As Byte 
Dim iLoopControl 
Dim jLoopControl 
Dim kLoopControl 
Dim LineIncrement As Integer 
Dim lLoopControl 
Dim Merc(100) 
Dim NoOfDice As Byte 
Dim OfficerPromotion(63 To 78) As Byte 
Dim PromotionRollMade As Byte 
Dim PromotionRollNeeded As Byte 
Dim Roll As Byte 
Dim SkillColumn 
Dim SixTables 
Dim SpecAssignmentSwitchEnd As Byte 
Dim SurvivalRollMade As Byte 
Dim SurvivalRollNeeded As Byte 
Dim TechLevel As Byte 
Dim Temp As Integer 
Dim Term As Byte 
Dim TestCount 
Dim UnitAssignment 
Dim WhichTable 
Dim Year As Byte 

EDIT: Я так смутился, что я с трудом могу заставить себя объяснить, в чем проблема. Я знал, что не дублировал имя, так как я использовал его только один раз - как функция! Спасибо всем за вашу помощь, я сейчас пойду и скрыть свое лицо от стыда ...

+0

Я предполагаю, что изменение имени действительно решает проблему за ваш пост? – Kairan

+0

У вас есть модуль кода с таким именем? –

+0

Кайран. Да. –

ответ

2

Из MSDN:

  1. более одного объекта в том же объеме, могут иметь элементы с же имя.

Module-level identifiers and project-level identifiers (module names and referenced project names) may be reused in a procedure, although it makes programs harder to maintain and debug. However, if you want to refer to both items in the same procedure, the item having wider scope must be qualified. For example, if MyID is declared at the module level of MyModule , and then a procedure-levelvariable is declared with the same name in the module, references to the module-level variable must be appropriately qualified:

Dim MyID As String 
Sub MySub 
MyModule.MyID = "This is module-level variable" 
Dim MyID As String 
MyID = "This is the procedure-level variable" 
Debug.Print MyID 
Debug.Print MyModule.MyID 
End Sub 
  1. Идентификатор, объявленный в конфликтах уровня модуля с именем процедуры.

For example, this error occurs if the variable MyID is declared at module level, and then a procedure is defined with the same name:

Public MyID 
Sub MyID 
. . . 
End Sub 
+0

Keiran. Но у меня нет ничего другого с тем же именем. –

+0

Можете ли вы дублировать проблему с новым проектом? – Kairan

1

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

Переменная, объявленная в sub(), не объявлена ​​(присвоена память) до тех пор, пока не будет выполнена операция sub(). И когда выполнение этого sub() завершено, память освобождается. До сих пор я думал, что общественные переменные действуют аналогичным образом; доступный любому модулю, который использовал его, - только те, которые существовали до тех пор, пока модуль, в котором они были объявлены, все еще выполнялся.

Однако для любой строки декларации Public variable, которая находится в любом модуле в книге, эта переменная объявляется и доступна при выполнении любого модуля в рабочей книге, , даже если модуль, в котором существует общедоступное объявление, никогда не вызывается или выполненный.

Таким образом, если у вас есть объявление переменной Public в одном модуле, а затем снова в отдельном модуле, который вы планируете запускать независимо от первого, Excel по-прежнему видит 2 объявления для одной и той же переменной и, следовательно, является неоднозначным.

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


Public VariableX в качестве струнного

общественной переменной у, как Integer


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

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

+0

2 года спустя это решение действительно помогло мне. Спасибо за это время. – Rivers31334

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