【问题标题】:Userform to populate worksheet用于填充工作表的用户表单
【发布时间】:2014-02-15 23:12:31
【问题描述】:

我对使用 VBA 还是很陌生,所以如果我不知道所有首选术语,我深表歉意。

我正在尝试编写一个用户表单来填充电子表格,以便我跟踪使用的员工 PTO。此电子表格的 X 轴(第 1 行)表示日期,Y 轴(A 列)表示员工姓名。

我创建的用户表单有 5 个条件:

1)  Employee Name (ComboBox1; this is a drop down of multiple rows)
2)  Date of PTO (ComboBox2; this is supposed to be a drop down of multiple columns)
3)  Duration of PTO (OptionButton1 is 1 Day, OptionButton2 is 0.5 Day)
4)  Enter Data (CommandButton1)
5)  Cancel (CommandButton2)

通过在电子表格上选择并标记菜单,我已完成标准 1。

剩下的就是让我兴奋的地方。

我似乎无法让日期(标准 2)以行格式显示在 ComboBox2 下拉列表中。如果我将这些项目转换为单个列,我就能够标记组并创建下拉菜单。这是有问题的,因为我将无法形成要填充的网格。

我的 OptionButton1 和 OptionButton2 项目旨在成为输入值(1 和 0.5)。在这个时候,我一直无法给他们价值,只是名字。这个输入是我无法让网格格式工作的主要问题的次要问题(上面的段落)。

第三个问题是标准 4 和 5 的组合。我的脚本无法执行 CommandButton1,尽管我相信这是由于我的代码非常基本:

Private Sub CommandButton1_Click()
    cmdOK
End Sub

CommandButton2 似乎可以使用此代码工作:

Private Sub CommandButton2_Click()
    cmdCancel
End Sub

在描述了我的问题之后,我的所有问题都是“我的最终目标可能吗?”我只打算为此使用 Excel,因为很多人已经可以使用它。如果这是可能的,那么我会要求帮助识别我的错误点并进行更正,或者提供指向编码手册的链接,我可以在其中尝试了解有关功能的更多信息(这更多的是长期情况,这不会对这个问题没有太大帮助,但我会觉得很好)。

提前感谢您的回复。

编辑:

@赛斯

我已经完成了 ComboBox2(日期)选择。我无法使用下面建议的循环来访问值(1 行,365 列)。

我尝试修改 Seth 的代码,但我真的对循环一无所知;我觉得我很可能没有正确填写一个部分(我正在查看 .Value ""):

私有子 ComboBox2_Change() 暗我一样长

i = 1

Do While ThisWorkbook.ActiveSheet("Breakdown").Cells("A1:NC1", i).Value <> ""

Me.ComboBox1.AddItem (ThisWorkbook.ActiveSheet("Breakdown").Cells("A1:NC1", i).Value)
i = i + 1

Loop

End Sub

使用此代码,我收到错误“运行时错误'438':对象不支持此属性或方法”

我正在尝试找到理解编写循环的一般指南,尽管我没有找到对上述某些陈述的参考,所以我不肯定如何纠正我的问题。我相信它也可能与盒子的属性有关。我可以在 RowSource 下输入“日期”(我对该范围的通用术语,通过突出显示和标记来定义),尽管这不会循环行。

@亚历克斯D

我也在尝试我收到的第二个帖子的路径;当我尝试使用时出现运行时错误:

Private Sub UserForm_Initialize()
    For i = 2 To Sheets("Breakdown").UsedRange.Columns.Count
         comboDate.AddItem (Cells(1, i))
        comboDate.List(comboDate.ListCount - 1, 1) = i
    Next
End Sub

可能移动定义该数据的位置会使其工作吗?一般来说,我在工作表中有一个按钮(也就是选择一个单元格并弹出用户窗体),所以可能不需要初始化?

西里尔 20140127 (1700 UTC)

【问题讨论】:

    标签: excel vba populate


    【解决方案1】:

    好的,让我们以相反的顺序进行。对于您的最后一个问题,“我的最终目标可能吗?”,答案是“确定”。我不太理解你的推理,但如果你更喜欢使用 Excel,那就这样吧。不过,我确实认为这将是记录 PTO 的一种痛苦方式。例如,如果我休假一周怎么办?我必须每天填写一次此表格吗?

    要继续反向移动,您的按钮需要执行一些操作。从您发布的内容中不清楚cmdCancelcmdOK 是否是您在其他地方定义的subs,所以让我们假装它们不是。在您的取消按钮中,您需要做一件基本的事情,关闭表单。应该就这么简单,Unload Me

    确定按钮是宏的关键部分。这是您将用户输入的值拼接在一起的地方。这也是您使用选项按钮执行操作的地方。您实际上并没有为选项按钮分配值,而是检查它们的 Value 属性。因此,当您的用户单击“确定”时,运行的代码将包含如下内容:

    If OptionButton1.Value = True Then
         'Put 1 in the cell.
    Else
         'Put .5 in the cell.
    End if
    

    请注意,不需要显式检查 OptionButton2,因为您只有两个选择。

    最后,日期。听起来日期已经在您的电子表格中,在某个特定的行中。您需要在这里做的是遍历该行中的单元格并将值拉到组合框的列表中。这应该让你开始。把它放在UserForm_Activate 表单事件中:

    Dim i As Long
    
    i = 1
    
    Do While ThisWorkbook.ActiveSheet.Cells(DateRow, i).Value <> ""
    
        Me.ComboBox1.AddItem (ThisWorkbook.ActiveSheet.Cells(DateRow, i).Value)
        i = i + 1
    
    Loop
    

    现在我们返回确定按钮。您需要获取在日期组合框中所做的选择。为此,您需要阅读组合框的ListIndex 属性并向其添加一个。 (加 1 说明组合框中的列表从 0 开始,而不是 1。)返回的数字将是您插入数据的列。

    OK 按钮的完整代码如下:

    Dim Col As Long
    Dim Row As Long
    Dim PTOValue As Long
    
    Col = DateComboBox.ListIndex + 1
    Row = EmployeeNameComboBox.ListIndex + 1
    
    If FullDayComboBox.Value = True Then
         PTOValue = 1
    Else
         PTOValue = .5
    End if
    
    ThisWorkbook.ActiveSheet.Cells(DateRow, i).Value = PTOValue
    

    希望这能让你开始。

    【讨论】:

    • 非常感谢!你在其中的一些方面给了我更多的先机。我不是一个强大的编码员,所以我很感谢你抽出时间来帮助我。为了详细说明目的,这是针对合同工的,因为他们直接向公司输入时间。大多数人没有延长假期,所以这个电子表格具有输入 1 天的“简单”功能,希望不会成为问题。感谢您提醒我延长假期,因为我没有想到人们一年有超过 5 天的假期。
    • 已删除评论,发帖因为我不能发段落。
    【解决方案2】:

    符合您的标准,应该可以理解。假设名称以单元格 (2,1) 开头,日期以单元格 (1,2) 开头。您可能必须根据您拥有的内容更改某些元素的名称。但是我完全构建了您所描述的东西,并且效果很好。

    它确实需要一些数据验证来防止错误,但你应该能够处理它。

    'Ok button which sets the values
    Private Sub CommandButton1_Click()
        Columns("A:A").Select
        If OptionButton1.Value = True Then
            Cells(Get_Name_Row(comboName.Text), Get_Date_Column(comboDate.Text)).Value = 1
        Else
            Cells(Get_Name_Row(comboName.Text), Get_Date_Column(comboDate.Text)).Value = 0.5
        End If
    End Sub
    
    'Cancel Button
    Private Sub CommandButton2_Click()
        Unload Me
    End Sub
    
    'This loads the dates into your comboBox, make sure to update its name
    'I assume you use RowSource for your names, so those should be fine
    Private Sub UserForm_Initialize()
        For i = 2 To Sheets("Sheet1").UsedRange.Columns.Count
            comboDate.AddItem (Cells(1, i))
            comboDate.List(comboDate.ListCount - 1, 1) = i
        Next
    End Sub
    
    'Gets what row the name is from
    Public Function Get_Name_Row(SearchString As String) As Integer
        Dim Rng As Range
        If Trim(SearchString) <> "" Then
            With Sheets("Sheet1").Range("A:A")
                Set Rng = .Find(What:=SearchString, _
                                After:=.Cells(.Cells.Count), _
                                LookIn:=xlValues, _
                                LookAt:=xlWhole, _
                                SearchOrder:=xlByRows, _
                                SearchDirection:=xlNext, _
                                MatchCase:=False)
                If Not Rng Is Nothing Then
                    Get_Name_Row = CInt(Rng.Row)
                End If
            End With
        End If
    End Function
    
    'Gets what column the date is from
    Public Function Get_Date_Column(SearchString As String) As Integer
        Dim Rng As Range
        If Trim(SearchString) <> "" Then
            With Sheets("Sheet1").Range("A1").EntireRow
                Set Rng = .Find(What:=SearchString, _
                                After:=.Cells(.Cells.Count), _
                                LookIn:=xlValues, _
                                LookAt:=xlWhole, _
                                SearchOrder:=xlByRows, _
                                SearchDirection:=xlNext, _
                                MatchCase:=False)
                If Not Rng Is Nothing Then
                    Get_Date_Column = (Rng.Column)
                End If
            End With
        End If
    End Function
    

    【讨论】:

    • 没什么好说的了。感谢您花在这方面的时间。我希望它没有花费你太多的努力。我花了大约 3 个小时才达到我的目标,尽管我的编码很糟糕。
    • 我遇到了“确定”按钮问题,导致“应用程序定义或对象定义错误”错误。当它进入代码时,如果我选择了 OptionButton1,它会突出显示 [Cells... = 1],如果我选择了 OptionButton2,它会突出显示 [Cells... = 0.5]。在将相应项目的括号更改为“ComboBox1.text”之后,我无法弄清楚为什么会发生这种情况。
    猜你喜欢
    • 2021-01-21
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2019-01-24
    相关资源
    最近更新 更多