На всякий случай (гуру VB(A) наверняка меня поправят / дополнят):
Переменные, объявленные с помощью Dim внутри функции / процедуры, видны только внутри нее. В случае совпадения с глобальными именами локальные имеют более высокий приоритет и делают "невидимыми" значения глобальных переменных.
Переменные, объявленные с помощью Dim вне процедур (внутри модуля / формы) примерно таким образом:
Option Explicit
Dim Var1 As Long
Dim Var2 As String
видимы только внутри модуля, в котором они описаны.
Модификаторы доступа (Private / Public / Global) меняют доступность процедур / функций и переменных. Процедура / функция, объявленная с модификатором Private, доступна и видна только внутри того модуля, где она описана. Public применяется как для процедур / функций, так и для переменных и делает их доступными для всех модулей и форм проекта; правила видимости для процедур / функций аналогичны правилам для переменных). Global, как правило, относят только к константам. Поведение аналогично Public.
По умолчанию (при отсутствии явного модификатора) для процедур / функций применяется Public.
То есть (теоретически) вполне допустимым будет такая конструкция (теоретически - потому, что я такого стараюсь избегать и полного тестирования не проводил):
' Module mdlMain
Dim lCounter As Long ' *
Sub TestSub()
Dim lCounter As Integer ' **
lCounter=-15 ' Работаем с переменной **
End Sub
Private Sub TestSub1()
MsgBox "Private"
lCounter=10 ' Работаем с переменной *
End Sub
'Module mdlTestingModule
Sub TestSub1()
lCounter = 20 ' Работаем с переменной *
MsgBox "Public"
End Sub