Ваш код ColorSheetFive
работает без проблем?!
Option Explicit
Sub ColorSheet5()
Dim RelevantRange As Range
Dim RangeStr As String
'vbGreen = 65280
'rgb(0,255,0) = 65280
Set RelevantRange = Range("B2:BJ26")
For Each actCell In RelevantRange
RangeStr = actCell.Address
'Debug.Print Sheets("Sheet" & iCt).Range(RangeStr).Address
If Check4Sheets(RangeStr, vbGreen) Then
actCell.Interior.Color = vbGreen
End If
Next actCell
End Sub
Function Check4Sheets(CheckRange As String, RGB_Color As Long) As Boolean
Check4Sheets = True
If Check_Intertior_Color(1, CheckRange, RGB_Color) = False Then _
Check4Sheets = False
If Check_Intertior_Color(2, CheckRange, RGB_Color) = False Then _
Check4Sheets = False
If Check_Intertior_Color(3, CheckRange, RGB_Color) = False Then _
Check4Sheets = False
If Check_Intertior_Color(4, CheckRange, RGB_Color) = False Then _
Check4Sheets = False
End Function
Function Check_Intertior_Color(SheetNr As Integer, CheckRange As String, RGB_Color As Long) As Boolean
Check_Intertior_Color = False
With Worksheets(SheetNr).Range(CheckRange)
If .Interior.Color = RGB_Color Then
Check_Intertior_Color = True
End If
End With
End Function
break выходит из одного цикла, но вы можете добавить проверку во внешний цикл, который прерывается при разрыве внутреннего.
bool dobreak = false;
for ( ..; !dobreak && ..; .. ) {
for ( ... ) {
if (...) {
dobreak = true;
break;
}
}
}
Если использование goto упрощает код, то это было бы целесообразно.
for (;;)
{
for (;;)
{
break; /* breaks inner loop */
}
for (;;)
{
goto outer; /* breaks outer loop */
}
}
outer:;
Оператор break
только выводит вас из самый внутренний цикл. Если вам не нужны дополнительные накладные расходы на код, память и производительность выделенной переменной состояния, я рекомендую преобразовать код в отдельную функцию или метод и использовать return
, чтобы избавиться от всего. циклы:
void do_lots_of_work(void)
{
int i, j;
for(i=0; i<10 ; i++)
{
for(j=0;j< 10; j++)
{
..
..
if(disaster_struck())
return; /* Gets us out of the loops, and the function too. */
}
}
}
Кроме уже упомянутой флаговой переменной или goto, вы можете вызвать исключение Objective-C:
@try {
for() {
for() {
@throw ...
}
}
}
@catch{
...
}
Изменить счетчик верхнего цикла перед остановкой
for(i=0; i<10 ; i++)
for(j=0;j< 10; j++){
..
..
i = 10;
break;
}
Другие упоминали, как вы можете установить флаг или использовать goto
, но я бы рекомендовал провести рефакторинг вашего кода, чтобы внутренний цикл был превращен в отдельный метод. Затем этот метод может вернуть некоторый флаг, указывающий, что внешний цикл должен прервать
. Если вы правильно назовете свои методы, они будут более читабельны.
for (int i = 0; i < 10; i++) {
if (timeToStop(i)) break;
}
-(bool) timeToStop: (int) i {
for (int j = 0; j < 10; j++) {
if (somethingBadHappens) return true;
}
return false;
}
Псевдокод, не тестировался, но вы поняли.
Оператор break только выйдет из цикла в области видимости, который является родительским циклом. Если вы хотите выйти из второго цикла, вы можете использовать логическую переменную, которая находится в пределах обоих циклов
bool isTerminated = false;
for (...)
{
if (!isTerminated)
{
for(...)
{
...
isTerminated = true;
break;
}
}
else
{
break;
}
}
Вероятно, самый простой способ - использовать переменная «флаг»
for(i=0; i<10 && (done==false); i++)
for(j=0;j< 10; j++){
..
..
if(...){done=true; break;}
}
Оператор break прерывается из самого внутреннего цикла. Для выхода из внешнего цикла потребуется дополнительный оператор test и break.
Если разрыв выполняется из набора вложенных циклов, только самый внутренний цикл, в котором выполняется разрыв, завершается. (Как и в стандарте C)