Страницы: 1
RSS
Почему запись цикла "For Each ... In ..." в одну строку не работает?
 
Есть, к примеру, два варианта программы сброса всех фильтров на всех листах активной книги с разными организациями цикла.  
Sub Reset_All_Filters_v1_1()   ' стандартная запись цикла "For ... To ... [Step ...]" РАБОТАЕТ
  Dim i%  
  On Error Resume Next  
  For i = 1 To Sheets.Count  
     Sheets(i).ShowAllData  
  Next  
End Sub  
 
Sub Reset_All_Filters_v2_1() ' стандартная запись цикла "For Each ... In ..." РАБОТАЕТ  
  Dim wsSh As Worksheet  
  On Error Resume Next  
  For Each wsSh In Sheets  
     If wsSh.AutoFilterMode Then wsSh.ShowAllData  
  Next  
End Sub  
' Пытаюсь перейти к записи циклов в одну строку :  
Sub Reset_All_Filters_v1_2()   ' запись цикла "For ... To ... [Step ...]" в одну строку - РАБОТАЕТ
  Dim i%  
  On Error Resume Next  
  For i = 1 To Sheets.Count: Sheets(i).ShowAllData: Next  
End Sub  
 
Sub Reset_All_Filters_v2_2()   ' запись цикла "For Each ... In ..." в одну строку НЕ РАБОТАЕТ. Компилятор ругается на Next без For.  
  Dim wsSh As Worksheet  
  On Error Resume Next  
  For Each wsSh In Sheets: If wsSh.AutoFilterMode Then wsSh.ShowAllData: Next  
End Sub  
 
Ничего не понимаю!
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
где-то прочитал  
что лучше избегать писать в одну строчку  
много работает быстрее
 
Да уж больно простой цикл-то, да и время его работы - доли секунды.  
Хотелось просто сделать генеральную уборку в своём Personal.xls (комментарии, переносы длинных строк для "обозримости", сокращение лишних строк, ...).  
А в сокращенном виде такие простые циклы и мало строк занимают и код вполне понятен.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=тухачевский}{date=01.04.2010 01:04}{thema=}{post}где-то прочитал  
что лучше избегать писать в одну строчку  
много работает быстрее{/post}{/quote}  
не понятно, почему так может быть?    
Какая компилятору разница при обработке кодов возврата каретки и двоеточия?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
а вот так работает:  
 
Dim wsSh As Worksheet  
On Error Resume Next  
For Each wsSh In Sheets:  wsSh.ShowAllData: Next
Живи и дай жить..
 
Так работает, вероятно иф тхен мешает:  
 
Sub Reset_All_Filters_v2_2()    
Dim wsSh As Worksheet  
On Error Resume Next  
For Each wsSh In Sheets: wsSh.ShowAllData: Next  
End Sub
 
Точно!  
Однострочная запись "If...Then..." внутри однострочной же "For Each ... In ..." работать не хочет...  
К счастью, в приведенном примере проверку If wsSh.AutoFilterMode вполне можно убрать, т.к. перед циклом стоит On Error Resume Next  
 
Буду иметь ввиду такую особенность...  
Спасибо за подсказку.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Это было первое, что я попробовал сделать, когда моё внимание обратили на то, что компилятору мешает однострочный If внутри цикла.  
Естественно, когда из однострочного If двоеточиями сделал полный аналог стандартного (многострочного), то заработало.    
Но потом я понял, что If там вообще не нужен, т.к. есть On Error Resume Next  
 
Просто интересно, почему компилятору не нравится вроде бы вполне корректное выражение  
For Each wsSh In Sheets: If wsSh.AutoFilterMode Then wsSh.ShowAllData: Next  
 
хотя точно такое же выражение  
For Each wsSh In Sheets  
If wsSh.AutoFilterMode Then wsSh.ShowAllData  
Next  
 
Значит, двоеточие - не абсолютный аналог переносу строки?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Просто про это надо запомнить...    
Уж лучше поставить два лишних двоеточия и End If, чем натыкаться на такие "грабли".  
Или может просто взять за правило не использовать однострочную форму If ... Then ... в циклах.  
 
К стати, про If ... Then ...:  
в VBE очень удобно устроена автозамена вводимого слитно endif на End If.  
А какая-нибудь надстройка позволяет расширить список автозамены? Ну, типа заменять также и endwith на End With, endsub на End Sub, exitsub на Exit Sub и т.д.?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
> А какая-нибудь надстройка позволяет расширить список автозамены? Ну, типа заменять также и endwith на End With, endsub на End Sub, exitsub на Exit Sub и т.д.?  
 
Я для этих целей использую Punto Switcher.  
Например, у меня Punto Switcher выполняет автозамену строки    
dimsh  
 
на строку  
Dim sh As Worksheet: Set sh = ActiveSheet
 
вот ещё примеры, что может делать Punto Switcher:  
 
http://programmersforum.ru/showpost.php?p=408502&postcount=2
 
Я Punto Switcher в VB вообще работать не даю - постоянно переводит на русский что-нибудь, что просто так и должно быть написано латиницей (имена переменных - самый частый пример)...  
А вводить для каждой новой переменной новое правило-исключение, так Punto Switcher загнётся скоро, да и муторно это.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=02.04.2010 01:00}{thema=}{post}Я Punto Switcher в VB вообще работать не даю {/post}{/quote}Зря.  
Я прислушался (давно уже) к советам EducatedFool и не жалею.  
Просто нужно смотреть на экран во время ввода - тогда нажатие Break отменяет неправильный ввод.  
Ну а если уже поздно, то выделить неверный кусок и Shift+Break.  
 
 
Даже при выключенном Punto Switcher автозамена по Tab работает.
Bite my shiny metal ass!      
 
Послушался вас, гуру, и разрешил Punto Switcher работать в VB.  
Поигрался с его настройками. Может, действительно будет удобно. Попробую.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1
Читают тему
Наверх
Loading...