2013-12-16 3 views
0

Я создал UserForm в Excel VBA, который я буду использовать для просмотра и обновления некоторых записей из листа у меня есть:Перемещение по записям на UserForm Excel VBA

UserForm1 http://im35.gulfup.com/Ay43Z.png

То, что я не могу чтобы выяснить, как это сделать. Перемещение между записями в Листе, которые имеют «Y» в столбце «Состояние».

Sheet1 http://im36.gulfup.com/cq6CN.png

Мне нужно, чтобы пользователь имел возможность редактировать колонку Комментарии через UserForm для записей он просматривает таким образом, что изменения будут сохранены в листе. Остальные текстовые поля в пользовательской форме настроены на блокировку, чтобы они могли отображать только данные.

Проблема, с которой я столкнулся сейчас, заключается в том, что я могу только представить, что можно перебирать все записи. Мне нужно перемещаться между теми, у которых «Y» является их «статусом». Кроме того, я не могу понять, как изменения, внесенные в поле «Комментарии» в форме, сохраняются на листе.

Любая помощь была бы действительно оценена!

EDIT:

Ниже приведен код, у меня есть для предыдущей кнопки:

If CurRecord = 0 Then CurRecord = 1 

    With ws 
     For i = 1 To (CurRecord - 1) 
      If Not .Range("G" & i).Value = "X" Then 
       TextBox1.Text = .Range("A" & i).Value 
       TextBox2.Text = .Range("B" & i).Value 
       ' 
       '~~> And So on load the rest 
       ' 

       CurRecord = i 
       Exit Sub 
      End If 
     Next i 

     If (i - 1) = lRow Then 
      MsgBox "End of record reached" 
     End If 
    End With 

Когда я использую это он держит прыгать на первую запись.

Я также попытался:

For i = 1 To (CurRecord - 1)

Но это дает мне «вне диапазона» ошибка, когда она достигнет первой записи.

Чудо, где я иду не так?

+1

Я могу помочь вам в этом, если вы загружаете образец файла на www.wikisend.com и делитесь ссылкой здесь. Я чувствую себя очень ленив, чтобы создать образец самостоятельно: p –

+0

@SiddharthRout Извините за поздний ответ, я действительно был вне города для праздников! Во всяком случае, я загрузил файл в соответствии с запросом: http://wikisend.com/download/461380/Book1.xlsm – CaptainABC

+0

@SiddharthRout Любые предложения? – CaptainABC

ответ

2

Вот очень простой пример кнопки Next. Теперь я уверен, что вы будете иметь возможность кодировать Previous кнопку Аналогично :)

Dim ws As Worksheet 
Dim lRow As Long 
Dim CurRecord As Long 

'~~> Load the first record 
Private Sub UserForm_Initialize() 
    Set ws = ThisWorkbook.Sheets("Sheet1") 

    With ws 
     lRow = .Range("G" & .Rows.Count).End(xlUp).Row 

     For i = 2 To lRow 
      If .Range("G" & i).Value = "Y" Then 
       TextBox1.Text = .Range("A" & i).Value 
       TextBox2.Text = .Range("B" & i).Value 
       ' 
       '~~> And So on load the rest 
       ' 

       CurRecord = i 
       Exit For 
      End If 
     Next i 
    End With 
End Sub 

'~~> Next Button 
Private Sub CommandButton3_Click() 
    If CurRecord = 0 Then CurRecord = 1 

    With ws 
     For i = (CurRecord + 1) To lRow 
      If .Range("G" & i).Value = "Y" Then 
       TextBox1.Text = .Range("A" & i).Value 
       TextBox2.Text = .Range("B" & i).Value 
       ' 
       '~~> And So on load the rest 
       ' 

       CurRecord = i 
       Exit Sub 
      End If 
     Next i 

     If (i - 1) = lRow Then 
      MsgBox "End of record reached" 
     End If 
    End With 
End Sub 

Followup от комментариев

Попробуйте это (непроверенные)

'~~> Previous Button 
Private Sub CommandButton2_Click() 
    If CurRecord = 2 Then 
     MsgBox "Begining of record reached" 
     Exit Sub 
    ElseIf CurRecord = 0 Then 
     CurRecord = 3 
    End If 

    With ws 
     For i = (CurRecord - 1) To 2 Step -1 
      If .Range("G" & i).Value = "Y" Then 
       TextBox1.Text = .Range("A" & i).Value 
       TextBox2.Text = .Range("B" & i).Value 
       ' 
       '~~> And So on load the rest 
       ' 

       CurRecord = i 
       Exit Sub 
      End If 
     Next i 

     If i = 2 Then 
      MsgBox "Begining of record reached" 
     End If 
    End With 
End Sub 
+0

Спасибо большое! У меня был шанс попробовать, и он отлично работает. Единственное, что по какой-то причине я испытываю трудное время, заставляя кнопку «Предыдущая» работать. Я попробовал «For i = (CurRecord - 1)« lRow »и« For i = lRow To (CurRecord + 1) »и« lRow To (CurRecord - 1) », но он, похоже, не работает. Интересно, где я ошибаюсь? – CaptainABC

+0

К сожалению, все еще борясь с кодированием «Предыдущая» buttun, очень понравится ваша помощь! – CaptainABC

+0

Теперь я попробовал 'i = 1 To (CurRecord - 1)', но это просто продолжает прыгать назад в первую строку. Также попробовал «For i - (CurRecord - 1) To (CurRecord - 1)», но при этом он застревает, отображая одну запись. Помоги пожалуйста! – CaptainABC

0

Если вы автоматически фильтруете по «Y», тогда навигация будет посещать только видимые строки (в них есть «Y»). Просто:

ActiveSheet.Range("$A1:$G$1").AutoFilter Field:=7, Criteria1:="Y" 
Смежные вопросы