2015-01-20 2 views
0

Я работаю над пользовательской формой в excel-VBA. Я пытаюсь использовать следующую и предыдущую кнопку, чтобы перебирать предыдущие записи в таблице. Предыдущая кнопка должна выбрать предыдущую строку и загрузить ее в пользовательскую форму. Следующая кнопка должна выбрать следующую строку и загрузить ее в пользовательскую форму. Таблица данных не имеет установленной длины. Ниже моя попытка. Я знаю, что у меня есть разрыв между двумя функциями кнопок, и я не уверен, как их подключить. Любая помощь была бы очень полезной. Я отвечу так быстро, как смогу.Использование следующих и предыдущих кнопок в VBA для загрузки пользовательской формы данных в Excel

Public PrevRow1 As Long 
Public cnt1 As Long 
Public cnt2 As Long 

'Prev Button 
Private Sub CommandButton4_Click() 
cnt1 = cnt1 + 1 


Sheet4.Activate 
PrevRow1 = WorksheetFunction.CountA(Range("A:A")) + 1 - cnt1 + cnt2 
ComboBox1.Value = Cells(PrevRow1, 1) 
ComboBox10.Value = Cells(PrevRow1, 2) 
ComboBox2.Value = Cells(PrevRow1, 3) 
ComboBox3.Value = Cells(PrevRow1, 4) 
ComboBox4.Value = Cells(PrevRow1, 5) 
TextBox6.Value = Cells(PrevRow1, 6) 
TextBox2.Value = Cells(PrevRow1, 7) 
TextBox3.Value = Cells(PrevRow1, 8) 
TextBox4.Value = Cells(PrevRow1, 10) 
ComboBox6.Value = Cells(PrevRow1, 11) 
ComboBox7.Value = Cells(PrevRow1, 12) 
ComboBox8.Value = Cells(PrevRow1, 13) 
ComboBox9.Value = Cells(PrevRow1, 14) 
TextBox5.Value = Cells(PrevRow1, 15) 

If PrevRow1 = 1 Then 
MsgBox "This is the last entry.", , "Alert!" 

CommandButton4.Enabled = False 
End If 




Me.Label15.Caption = PrevRow1 - 1 & " " & "of" & " " & WorksheetFunction.CountA(Range("A:A")) - 1 

End Sub 


'Next button 
Private Sub CommandButton5_Click() 
Dim i As Long 

cnt2 = cnt2 + 1 


Dim NextRow1 As Long 
Sheet4.Activate 
NextRow1 = PrevRow1 - (cnt1 - cnt2) + 3 


ComboBox1.Value = Cells(NextRow1, 1) 
ComboBox10.Value = Cells(NextRow1, 2) 
ComboBox2.Value = Cells(NextRow1, 3) 
ComboBox3.Value = Cells(NextRow1, 4) 
ComboBox4.Value = Cells(NextRow1, 5) 
TextBox6.Value = Cells(NextRow1, 6) 
TextBox2.Value = Cells(NextRow1, 7) 
TextBox3.Value = Cells(NextRow1, 8) 
TextBox4.Value = Cells(NextRow1, 10) 
ComboBox6.Value = Cells(NextRow1, 11) 
ComboBox7.Value = Cells(NextRow1, 12) 
ComboBox8.Value = Cells(NextRow1, 13) 
ComboBox9.Value = Cells(NextRow1, 14) 
TextBox5.Value = Cells(NextRow1, 15) 



Me.Label15.Caption = NextRow1 - 1 & " " & "of" & " " & WorksheetFunction.CountA(Range("A:A")) - 1 
End Sub 

Новый код

Public nCurrentRow As Long 

Sub UserForm_Initialize() 
nCurrentRow = Sheets(4).Cells(Rows.Count, 1).End(xlUp).Row 
TraverseData (nCurrentRow) 
end sub 

'Prev button 
Private Sub CommandButton14_Click() 
Do 
    nCurrentRow = nCurrentRow - 1 
    TraverseData (nCurrentRow) 
Loop Until nCurrentRow = 1 Or Sheets(4).Cells(nCurrentRow, 1).Value = Me.ComboBox12.Value 
End Sub 

'Next Button 
Private Sub CommandButton15_Click() 

Do 
    nCurrentRow = nCurrentRow + 1 
    TraverseData (nCurrentRow) 
Loop Until Sheets(4).Cells(nCurrentRow, 1).Value = "" Or Sheets(4).Cells(nCurrentRow, 1).Value = Me.ComboBox12.Value 
End Sub 

Private Sub TraverseData(nRow As Long) 
Me.ComboBox1.Value = Sheets(4).Cells(nRow, 1) 
Me.ComboBox10.Value = Sheets(4).Cells(nRow, 2) 
Me.ComboBox2.Value = Sheets(4).Cells(nRow, 3) 
Me.ComboBox3.Value = Sheets(4).Cells(nRow, 4) 
Me.ComboBox4.Value = Sheets(4).Cells(nRow, 5) 
Me.TextBox6.Text = Sheets(4).Cells(nRow, 6) 
Me.TextBox2.Text = Sheets(4).Cells(nRow, 7) 
Me.TextBox3.Value = Sheets(4).Cells(nRow, 8) 
Me.TextBox4.Value = Sheets(4).Cells(nRow, 10) 
Me.ComboBox6.Value = Sheets(4).Cells(nRow, 11) 
Me.ComboBox7.Value = Sheets(4).Cells(nRow, 12) 
Me.ComboBox8.Value = Sheets(4).Cells(nRow, 13) 
Me.ComboBox9.Value = Sheets(4).Cells(nRow, 14) 
Me.TextBox5.Value = Sheets(4).Cells(nRow, 15) 
End Sub 

ответ

1

У меня трудное время определения того, что cnt1 and cnt2 см.

На мой взгляд, вам нужна только одна публично объявленная переменная, используемая для ссылки на строку данных, загружаемую в таблицу. Эта переменная должна быть установлена ​​после загрузки пользовательской формы на основе желаемого поведения. Например, пользовательская форма загружается с данными из последней строки.

Проверьте код ниже в качестве основы и дайте мне знать, если это помогает на всех:

Public nCurrentRow As Long 

Private Sub cmdNext_Click() 
    Do 
     nCurrentRow = nCurrentRow + 1 
     TraverseData (nCurrentRow) 
    Loop Until Sheet1.Cells(nCurrentRow, 1).Value = "" Or Sheet1.Cells(nCurrentRow, 1).Value = Me.ComboBox1.Value 
End Sub 

Private Sub cmdPrev_Click() 
    Do 
     nCurrentRow = nCurrentRow - 1 
     TraverseData (nCurrentRow) 
    Loop Until nCurrentRow = 1 Or Sheet1.Cells(nCurrentRow, 1).Value = Me.ComboBox1.Value 
End Sub  
    Private Sub UserForm_Initialize() 
     nCurrentRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row 
     TraverseData (nCurrentRow) 
    End Sub 

    Private Sub TraverseData(nRow As Long) 
     Me.TextBox1.Value = Sheet1.Cells(nRow, 1) 
     Me.TextBox2.Value = Sheet1.Cells(nRow, 2) 
     Me.TextBox3.Value = Sheet1.Cells(nRow, 3) 
    End Sub 

Само собой разумеется, он должен быть изменен для обработки каждого из отдельных элементов управления UserForm. Кроме того, повторите проверку ошибок, чтобы подтвердить, что она не пересекается с отрицательными строками (вы уже сделали это в своей версии кода).

Уведомление Я инкапсулировал `TraverseData в свой собственный SubRoutine, поэтому вам не нужно переписывать его для каждой кнопки. Он действительно очищает данные.

+0

Я пытался использовать переменные cnt для добавления счетчиков к кнопкам, но я попробую ваш метод и посмотрю, сотрудничает ли он со мной, ха-ха. Я дам вам знать, есть ли у меня какие-либо проблемы или если это работает, сначала попробуйте. – Tyler

+0

Прохладный. Держать нас в курсе. Мне кажется, что счетчики, прикрепленные к кнопке, не нужны. – user3561813

+0

Ваше решение работает очень хорошо. Осквернительно снял излишества, которые я сделал. Спасибо огромное! – Tyler

0
Public ViewRow as long 

'Prev Button 
Private Sub CommandButton5_Click() 

if ViewRow > 1 then 'assumes row 1 is the first row 
    ViewRow = ViewRow - 1 
    CommandButton5.Enabled = True 
    if ViewRow = 1 then 
     MsgBox "This is the first entry.", , "Alert!" 
     CommandButton4.Enabled = False 
    end if 
end if 


Sheet4.Activate 

ComboBox1.Value = Cells(ViewRow, 1) 
... 
TextBox5.Value = Cells(ViewRow, 15) 


Me.Label15.Caption = ViewRow & " " & "of" & " " & WorksheetFunction.CountA(Range("A:A")) 

End Sub 


'Next button 
Private Sub CommandButton5_Click() 
if ViewRow < WorksheetFunction.CountA(Range("A:A")) then 
    ViewRow = ViewRow + 1 
    CommandButton4.Enabled = True 
    if ViewRow = 1 then 
     MsgBox "This is the last entry.", , "Alert!" 
     CommandButton5.Enabled = False 
    end if 
end if 

Sheet4.Activate 

ComboBox1.Value = Cells(NextRow1, 1) 
... 
TextBox5.Value = Cells(NextRow1, 15) 


Me.Label15.Caption = ViewRow & " " & "of" & " " & WorksheetFunction.CountA(Range("A:A")) 
End Sub 

ИЛИ

Public ViewRow as long 

'Prev Button 
Private Sub CommandButton5_Click() 

if ViewRow > 1 then 'assumes row 1 is the first row 
    ViewRow = ViewRow - 1 
    CommandButton5.Enabled = True 
    if ViewRow = 1 then 
     MsgBox "This is the first entry.", , "Alert!" 
     CommandButton4.Enabled = False 
    end if 
end if 

call populate_row(ViewRow) 

End Sub 


    'Next button 
    Private Sub CommandButton5_Click() 
    if ViewRow < WorksheetFunction.CountA(Range("A:A")) then 
     ViewRow = ViewRow + 1 
     CommandButton4.Enabled = True 
     if ViewRow = 1 then 
      MsgBox "This is the last entry.", , "Alert!" 
      CommandButton5.Enabled = False 
     end if 
    end if 

call populate_row(ViewRow) 
End Sub 

Sub populate_row(thisrow as long) 
Sheet4.Activate 

ComboBox1.Value = Cells(NextRow1, 1) 
... 
TextBox5.Value = Cells(NextRow1, 15) 


    Me.Label15.Caption = ViewRow & " " & "of" & " " &  WorksheetFunction.CountA(Range("A:A")) 
End Sub 

Второй вариант позволяет вносить изменения в том, как данные добавляются в форму, не меняя обе функции.

+0

Благодарим вас за ответ, и ваш код помог мне в другой области, с которой я боролся. – Tyler