Excel 使用Userform从工作表中获取数据
我不是一个编码专家,我已经有点迷失在我试图做的事情中。我有一个电子表格,其中有许多列需要完成。这变得有点不便于用户使用,因为您经常需要在电子表格中滚动以添加数据 我已经创建了一个用户表单,它将使电子表格更容易更新。这说起来容易做起来难。我有一个文本框,用户在其中声明了检索数据的行,但代码似乎失败了,我无法找出原因 另一件我似乎找不到的事情是如何使用这个值从电子表格中检索数据。当前代码如下所示:Excel 使用Userform从工作表中获取数据,excel,vba,validation,userform,insert-update,Excel,Vba,Validation,Userform,Insert Update,我不是一个编码专家,我已经有点迷失在我试图做的事情中。我有一个电子表格,其中有许多列需要完成。这变得有点不便于用户使用,因为您经常需要在电子表格中滚动以添加数据 我已经创建了一个用户表单,它将使电子表格更容易更新。这说起来容易做起来难。我有一个文本框,用户在其中声明了检索数据的行,但代码似乎失败了,我无法找出原因 另一件我似乎找不到的事情是如何使用这个值从电子表格中检索数据。当前代码如下所示: Private Sub UserForm_Initialize() Dim xGateway As
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值,我也不确定是否输入正确
下一阶段将根据需要修改数值,并将数值推回到sreadsheet。我还不确定如何做到这一点,通过命令按钮等是否更好。这里有两个问题:
a) 正如BigBen所写,您混淆了两种符号,它们都是有效的,但参数是不同的——在您的情况下,使用哪种符号只是口味的问题:
使用Range
时,参数是一个范围名称,就像您在Excel公式中使用它一样:A1
表示单元格A1,或MIC
表示命名范围。假设xLine
保存行号10
,则可以将列K
和变量xLine
连接起来,从而得到一个字符串K10
使用
单元格时
,必须将行和列作为单独的参数传递,因此可以编写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
这里有两个问题:
a) 正如BigBen所写,您混淆了两种符号,它们都是有效的,但参数是不同的——在您的情况下,使用哪种符号只是口味的问题:
使用Range
时,参数是一个范围名称,就像您在Excel公式中使用它一样:A1
表示单元格A1,或MIC
表示命名范围。假设xLine
保存行号10
,则可以将列K
和变量xLine
连接起来,从而得到一个字符串K10
使用
单元格时
,必须将行和列作为单独的参数传递,因此可以编写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
您正在尝试使用
单元格
表示法,而不是范围
表示法。。。使用xComp.Range(“K”&xLine)
。感谢您的回复。从你最初答案的内容来看,我几乎已经成功了。使用trigger.Range(“K”&xLine)。因为xLine是一个用户输入,所以我有一个新的AfterUpdate Sub,它正在工作。虽然xLine的初始值为,但应返回活动行。有什么建议吗?您正在尝试使用单元格
表示法,而不是范围
表示法。。。使用xComp.Range(“K”&xLine)
。感谢您的回复。从你最初答案的内容来看,我几乎已经成功了。使用trigger.Range(“K”&xLine)。因为xLine是一个用户输入,所以我有一个新的AfterUpdate Sub,它正在工作。虽然xLine的初始值为,但应返回活动行。有什么建议吗?