Страницы: 1
RSS
Ошибка Duplicate declaration in current scope
 
Добрый день, подсвечивает - , i As Long  и  выдает ошибку Duplicate declaration in current scope

Код
  For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row

        If Cells(i, 9) < 300 Then Cells(i, 10) = 0

Columns("R:R").Select
    
  Dim arr, i As Long
  arr = Array("темно-синий", "синий", _
  "ярко-синий", "синий", _
  "темно-синий", "синий")
                                                                                                                                                                                                                                    
  For i = 0 To UBound(arr) Step 2
    Selection.Replace What:=arr(i), Replacement:=arr(i + 1), LookAt:= _
      xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
      ReplaceFormat:=False
  Next

можно ли без проблем перенести строку "Dim arr, i As Long" вверх, над строкой "For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row" ?

Код
   Dim arr, i As Long

   For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row

        If Cells(i, 9) < 300 Then Cells(i, 10) = 0

Columns("R:R").Select
    

  arr = Array("темно-синий", "синий", _
  "ярко-синий", "синий", _
  "темно-синий", "синий")
                                                                                                                                                                                                                                    
  For i = 0 To UBound(arr) Step 2
    Selection.Replace What:=arr(i), Replacement:=arr(i + 1), LookAt:= _
      xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
      ReplaceFormat:=False
  Next
 
И что это даст?
Во первых, все рано останется 2 dim i, а во вторых, одну  переменную для вложенных циклов использовать нельзя.
И в третьих, переменные лучше объявлять cразу после Sub().
 
RAN, как исправить код ?
 
удалите повторное обьявление переменной с тем же именем
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, уточните пож-ста какой конкретно код удалить
 
я вижу фрагмент кода, в котором все нормально
Код
Dim i
i = 1
правильно
Код
Dim i
Dim i
i = 1
не правильно, переменная i обьявлена 2 раза
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
RAN написал:
переменные лучше объявлять cразу после Sub
спорное утверждение. Когда-то да, когда-то нет. Зависит от величины кода. Иногда удобнее для определенных блоков переменные объявлять непосредственно перед блоком, в котором они используются. Хотя сам так делаю в основном на стадии тестирования и разработки кода - потом все равно переношу все в начало и разбиваю по типам. Но это исключительно для своего удобства, чтобы видеть какие переменные уже использовались.
nicex, Вам бы хоть основы основ почитать. Переменная во вложенном цикле это как спичка: если достали одну, то зажечь её два раза не получится, надо вторую доставать :)
Код
Dim arr, i As Long,i2 as Long
'используем переменную i - это внешний цикл
   For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row
 
        If Cells(i, 9) < 300 Then Cells(i, 10) = 0
 
Columns("R:R").Select
  arr = Array("темно-синий", "синий", _
  "ярко-синий", "синий", _
  "темно-синий", "синий")
'переменную i здесь нельзя уже использовать, т.к. она применяется в родительском цикле: For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row                                                                                                                                                                                                 
  For i2 = 0 To UBound(arr) Step 2
    Selection.Replace What:=arr(i2), Replacement:=arr(i2 + 1), LookAt:= _
      xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
      ReplaceFormat:=False
  Next

К слову, чтобы не поняли неверно: одну и ту же переменную можно использовать сколько угодно раз, но нельзя использовать одну и ту же для всех циклов, вложенных друг в друга. Вот простой пример. По сути это то, что написано у Вас сейчас:
Код
For i = 1 to 10
for i = 12 to 18
msgbox i 'какое же значение выводить VBA здесь, если i у нас при первом же проходе по такой логике может быть и 1 и 12?
next
next

Вы могли бы подумать, что при таком подходе VBA должен использовать только переменную из последнего цикла. Но...Ситуация 2:
Код
For i = 1 to 10 'цикл по строкам листа
for i = 12 to 18 'цикл по столбцам листа
msgbox Cells(i,i).Value 'какое же значение выводить VBA здесь, если мы не даем однозначно понять какая из i куда должна попасть?
next
next

Вот и весь сказ.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, кстати, некоторые программисты думают, что пока они не указали Dim в коде, то и память под эту переменную ещё не выделилась. Поэтому стараются не объявлять все переменные в самом верху, а уже по коду пишут Dim. Но на самом деле, при запуске процедуры сразу выделяется память под все указанные в коде Dim, и не важно где они стоят в коде (ниже или выше). Просто сами переменные ещё не инициализированы, но память под них уже выделена

Код
Sub Test()
    Dim i As Long
    i = 5
    'k = 3 'variable not difined
    Dim k As Long
    k = 3
End Sub

при запуске Sub Test - уже k =0 и память под неё уже выделена, но она ещё не инициализирована до строки Dim k As Long.
Поэтому писать Dim внутри кода только ради того, чтобы экономить память компьютера - бессмысленно.

Изменено: New - 26.09.2022 22:13:34
 
Цитата
New написал:
при запуске процедуры сразу выделяется память под все указанные Dim
именно так. Все это происходит на стадии можно сказать "прекомпиляции" - когда VBA проверяет "жизнеспособность" кода перед его выполнением.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Развели тут по простому вопросу.😀
nicex как вы только использовали i так сразу определили её. Соотв. Второй раз уже определить не даст. Использовать можно но не определить.
По вопросам из тем форума, личку не читаю.
 
Дмитрий(The_Prist) Щербаков, ясно спасибо

В том же макросе ниже есть код


Код
    Dim lLastRow As Long
    lLastRow = Cells(Rows.Count, 1).End(xlUp).Row 
    Range("D1:D" & lLastRow).FormulaR1C1 = "=VLOOKUP(RC[-3],Лист2!C[-3]:C[3],7,0)"

   Dim lLastRow As Long и не выдает ошибку, а если   Dim lLastRow As Long  выше чем Dim arr, i As Long, то выдает, в чем разница между ними тоже не понятно

Можно ли в коде сверху оставить только Dim lLastRow As Long, а ниже Dim arr, i As Long удалить и последующие Dim lLastRow As Long удалить, корректно все будет работать ? При поверхностном осмотре вроде работает, но чем черевато неизвестно
Изменено: nicex - 26.09.2022 23:55:46
 
пишите все что угодно
компилятор сьел, макрос работает - значит все нормально
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, ясно спасибо
Страницы: 1
Наверх