2015-11-06 5 views
0

Множество ячеек сотовой ячейки R1 для косвенного поиска одного из четырех других листов. Листы называются неделями1, неделя2, неделя3 и неделя4. Что я хочу сделать, это когда я нажимаю кнопку X, моя эталонная ячейка меняется с недели1 на неделю2. и каждый раз, когда я нажимаю, он должен продвигаться в той мере, в какой неделя4 возвращается к неделе1.excel vba cell step step loop

Мой текущий сломанный код гласит:

'Change the week number in cell R1 
week = Range("R1") 
If week = week1 Then 
    Range("R1").Value = week2 
Else 
    If week = week2 Then 
     Range("R1").Value = week3 
    Else 
     If week = week3 Then 
      Range("R1").Value = week4 
     Else 
      If week = week4 Then 
       Range("R1").Value = week1 
      End If 
     End If 
    End If 
End If 
Application.ScreenUpdating = True 'Turns viewing function back on so the spreadsheet is usable. 
End Sub 
+0

у меня есть previ ously в коде Dim week1 as Sting week1 = "week1" и т. д. – GeoHoward

+0

ваш код в порядке, просто заключите 'week1' и т. д. в кавычки (т. '" week1 "'), однако для более эффективного кода см. Jeeped short answer .. – EEM

ответ

0
Select Case week 
    Case Is = week1: vValue = week2 
    Case Is = week2: vValue = week3 
    Case Is = week3: vValue = week4 
    Case Is = week4: vValue = week1 
End Select 

Range("R1").Value = vValue 
Application.ScreenUpdating = True 
+1

Пояснения - разница между хорошими ответами и субоптимальными ответами ... –

0

Вы должны быть в состоянии сделать это в одной строке кода.

Range("R1") = Format(InStr(1, "4123", Right(Range("R1").Value, 1)), "\W\e\ek0") 

Это будет цикл через Week1, Week2, Week3, Week4, Week1, .... Я опустил ссылку на родительский листок для R1, но это никогда не будет плохой идеей включить это.

+1

Вы протестировали это ... как-то его не работает для меня; он возвращает 'Xeek0', где X - число от 1 до 4. Предложите изменить его на:« Диапазон («R1») = «неделя» и «InStr» (1, «4123», «Вправо» (диапазон («R1»). , 1)) 'или ' Диапазон («R1») = «неделя» и выберите (справа (диапазон («R1»). Значение, 1), 2, 3, 4, 1) ' – EEM

+0

Да, я протестировал это в Worksheet_BeforeDoubleClick, чтобы я мог просто дважды щелкнуть по R1 и посмотреть, как он проходит через недели. Возможно, R1 должен был быть «посеян» числом от 1 до 4, прежде чем он начнет идти ...? – Jeeped

+1

Попробуйте посеять его с помощью '1' и любого из ожидаемых значений (т. Е.' Week1' и т. Д.) И по-прежнему возвращая 'Xeek0', это число будет отформатировано как' W' ... – EEM

0

Существует простой способ решить:

Range("R1") = Left(Range("R1"), 4) & Right(Range("R1"), 1) Mod 4 + 1 
'number after Mod = max week 

Mod x только устанавливает счетчик в 0, если она находится на макс (в + 1 наборы тогда 1 снова) Однако, вы можете использовать этот к югу, чтобы избежать странного поведения:

Sub NewWeekMax() 
    Dim str As String, i As Byte 
    str = "Week1" 
    For i = 2 To 4 'last num = max weeks 
    str = str & ",week" & i 
    Next 
    With Range("R4").Validation 
    .Delete 
    .Add 3, 1, 1, str 
    .InCellDropdown = True 
    .ShowInput = True 
    .ShowError = True 
    End With 
End Sub 

Эта подпрограмма просто задает проверку данных отключить неправильный ввод в R1