2017-12-27 219 views
0

我有一個工作簿,其中包含客戶端信息。每個客戶都有一張工作表,每張工作表都標有客戶的唯一ID。我想要啓動一個UserForm,用戶將從cobo box中選擇一個客戶端。然後,來自相應工作表最後一行的數據填充UserForm。用戶窗體基於企業價值識別正確的工作表

在同一工作簿中的其他代碼中,我使用的是腳本字典,但這些字典都與特定工作表中的特定範圍相關聯。我不知道如何編寫UserForm以在所有工作表中搜索與cobo_ClientID字段中的值相同的名稱,然後從MAX行更新日期的行中引入正確的數據元素。

下面是我一直在使用在其他領域的腳本辭典的例子:

Set coboDict = CreateObject("Scripting.Dictionary") 
With coboDict 
    For Each cStatsClientID In ws1.Range("StatsClientID") 
     If Not .exists(cStatsClientID.Value) Then 
      .Add cStatsClientID.Value, cStatsClientID.Row 
     Else 
      If CLng(cStatsClientID.Offset(, -2).Value) > CLng(ws1.Range("B" & .Item(cStatsClientID.Value))) Then 
      .Item(cStatsClientID.Value) = cStatsClientID.Row 
      End If 
     End If 
    Next cStatsClientID 
    Me.cobo_ClientID.List = Application.Transpose(.keys) 
    End With 
+0

您是否可以不使用Worksheet.Name屬性來獲取正確的工作表,然後使用[lastRow](https://www.rondebruin.nl/win/s9/win005.htm)計算來檢索最後一行? – QHarr

+0

說實話,我不確定,因爲我對VBA還比較陌生,以前沒有使用過這個屬性。在查看時,我不確定它是如何讓我A - 根據cobo_ClientID或B的值識別正確的表格 - 能夠從正確的表格中找到值MAX更新日期。 – Rodger

+0

每個客戶工作表的名稱與客戶ID相同。因此,如果有3個客戶端的ID分別爲「RB1」,「RB2」和「QJ4」,則有3個客戶端工作表,分別命名爲「RB1」,「RB2」和「QJ4」。我已經能夠獲得代碼來識別正確的工作表,但仍然無法從最後一行獲取表單中的單元格中的數據。 – Rodger

回答

0

從另一個論壇時提供的LASTROW鏈接,以及一些建議之間,我覺得我有解決方案。這個問題似乎與我如何設置LastRow以及找到正確的表單有關。

Private Sub cobo_ClientID_Change() 

Dim Sht As String 
Dim LastRow As Long 

Sht = Me.cobo_ClientID 

With ActiveSheet 
LastRow = .Cells(.Rows.Count, "E").End(xlUp).Row 
End With 

txt_Name = Sheets(Sht).Range("E" & LastRow).Value 
txt_DPPymtAmt = Sheets(Sht).Range("H" & LastRow).Value 

End Sub 
0

此代碼將查看每個工作表名稱並在組合框中列出它們。當您選擇其中一張工作表時,它將採用最後一行的值並將它們放置在表格上的文本框中。

添加這些控件到窗體:

  • 組合框稱爲命名txtColAtxtColBtxtColCcmbSheets
  • 三個文本框。

-

Private Sub UserForm_Initialize() 

    Dim wrkSht As Worksheet 

    'Populate the combo-box with sheet names. 
    For Each wrkSht In ThisWorkbook.Worksheets 
     With Me.cmbSheets 
      .AddItem wrkSht.Name 
     End With 
    Next wrkSht 

End Sub 


'Will place the values from the last row columns A:C in textboxes on the form. 
Private Sub cmbSheets_Change() 
    Dim rLastCell As Range 
    Dim shtSelected As Worksheet 

    'Set a reference to the sheet selected by the combo box. 
    Set shtSelected = ThisWorkbook.Worksheets(cmbSheets.Value) 

    Set rLastCell = LastCell(shtSelected) 

    With shtSelected 
     Me.txtColA = .Cells(rLastCell.Row, 1) 
     Me.txtColB = .Cells(rLastCell.Row, 2) 
     Me.txtColC = .Cells(rLastCell.Row, 3) 
    End With 
End Sub 

'This function can be placed in a normal module. 
'Finds the last cell given a worksheet reference. 
Public Function LastCell(wrkSht As Worksheet) As Range 

    Dim lLastCol As Long, lLastRow As Long 

    On Error Resume Next 

    With wrkSht 
     lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column 
     lLastRow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row 

     If lLastCol = 0 Then lLastCol = 1 
     If lLastRow = 0 Then lLastRow = 1 

     Set LastCell = wrkSht.Cells(lLastRow, lLastCol) 
    End With 
    On Error GoTo 0 

End Function 

注 -如果任何一個值,需要特定的格式化然後應該複印時使用該命令FORMAT被添加。
E.g.如果一個單元格的日期爲2016年5月1日的01/05/2016,那麼它將在文本框中顯示爲5/1/2016(轉換爲美國日期格式)。
使用代碼Me.txtColC = Format(.Cells(rLastCell.Row, 3), "dd-mmm-yy")將在窗體上顯示日期爲01-May-16
同樣的貨幣應該被添加爲Me.txtColB = Format(.Cells(rLastCell.Row, 2), "Currency")否則£15將顯示爲。

如果你想排除某些表看看SELECT CASE...END SELECT代碼塊(或IF...ELSE...END IF

如果你想在片改變爲您在組合框中選擇不同的值,只是增加shtSelected.Select到的結束cmbSheets_Change()事件。