使用用户窗体从工作表中获取数据

Getting Data from Worksheet Using Userform

我不是编码专家,并且对我正在尝试做的事情有点迷茫。我有一个电子表格,其中有许多列需要完成。这对用户来说有点不友好,因为您经常需要滚动电子表格来添加数据。

我创建了一个用户表单,它可以使电子表格更易于更新。这说起来容易做起来难。我有一个文本框,用户声明在哪一行检索数据,但代码似乎失败了,我不知道为什么。

我似乎无法找到的另一件事是如何使用此值从电子表格中检索数据。当前代码如下:

Private Sub UserForm_Initialize()

Dim xGateway As Range
Dim xCCode As Range
Dim xMIC As Range
Dim xCreator As Range
Dim xComplete As Range
Dim xData As Worksheet
Dim xComp As Worksheet
Dim xLine As String

   Set xData = Worksheets("Data")
   Set xComp = Worksheets("Tracker")

   xLine = TB_LineNo.Value

   For Each xGateway In xData.Range("Gateway")
   Me.CB_Gateway.AddItem xGateway.Value
   Next xGateway

   For Each xMIC In xData.Range("MIC")
   Me.CB_VGW.AddItem xMIC.Value
   Next xMIC

   For Each xCCode In xData.Range("Code")
   Me.CB_CCode.AddItem xCCode.Value
   Next xCCode

   For Each xCreator In xData.Range("Creator")
   Me.CB_Creator.AddItem xCreator.Value
   Next xCreator

   For Each xMIC In xData.Range("MIC")
   Me.CB_CBy.AddItem xMIC.Value
   Next xMIC

   For Each xMIC In xData.Range("MIC")
   Me.CB_ABy.AddItem xMIC.Value
   Next xMIC

   For Each xMIC In xData.Range("MIC")
   Me.CB_UpBy.AddItem xMIC.Value
   Next xMIC

   For Each xMIC In xData.Range("MIC")
   Me.CB_PubBy.AddItem xMIC.Value
   Next xMIC

   For Each xComplete In xData.Range("YN")
   Me.CB_Comp.AddItem xComplete.Value
   Next xComplete

   CB_Gateway.Value = xComp.Range(xLine, "k")
End Sub

最后一行是我遇到问题的地方,因为它失败了,我不确定为什么。 xLine 值,我又不确定我输入的是否正确。

下一阶段将根据需要修改值并将值推回电子表格。我还不确定如何执行此操作,从命令按钮等执行此操作是否更好

这里有两个问题:

a) 正如 BigBen 所写,您混淆了两种表示法,两者都有效,但参数不同 - 在您的情况下,使用哪种只是个人喜好问题:

当使用 Range 时,参数是一个区域名称,就像您在 Excel 公式中使用它一样:A1 用于单元格 A1,或 MIC 用于命名范围。假设 xLine 包含行号 10,您可以连接列 K 和变量 xLine 得到一个字符串 K10.
使用 Cells 时,您必须将行和列作为单独的参数传递,因此您可以编写 xComp.Cells(xLine, "K")xComp.Cells(xLine, 11)。列号或列字符均作为第二个参数有效。

b) 你应该确保 xLine 是一个数字,并且这个数字是有效的,否则你将面临运行时错误。我建议您将 xLine 声明为 Long,将文本框的内容转换为数字并检查数字是否大于 0:

Dim xLine as long
xLine = Val(TB_LineNo.Value)
If xLine > 0 Then 
    CB_Gateway.Value = xComp.Cells(xLine, "K")
Else
    CB_Gateway.Value = "(invalid line)"
End If