Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA用户表单发布数据两次…有时_Excel_Vba - Fatal编程技术网

Excel VBA用户表单发布数据两次…有时

Excel VBA用户表单发布数据两次…有时,excel,vba,Excel,Vba,我有一个用户表单,在“PostHistory”表上有一个组合框,它从“Staff”表中提取数据。当您在用户窗体上按Add时,假定在员工工作表上找到姓名,并替换姓名旁边的日期。有时,它会替换日期及其下名称旁边的日期。使用Excel 2016 Private Sub CommandButton7_Click() Application.ScreenUpdating = False Sheets("Staff").Visible = True Sheets("Engin

我有一个用户表单,在“PostHistory”表上有一个组合框,它从“Staff”表中提取数据。当您在用户窗体上按Add时,假定在员工工作表上找到姓名,并替换姓名旁边的日期。有时,它会替换日期及其下名称旁边的日期。使用Excel 2016

Private Sub CommandButton7_Click()

Application.ScreenUpdating = False
Sheets("Staff").Visible = True
Sheets("Engine").Visible = True

Dim TargetRow As Integer
Dim nameRange As Range

Set nameRange = Sheets("Staff").Range("C3:C200")
TargetRow = Sheets("Engine").Range("D3").Value

Sheets("PostHistory").Range("B3").EntireRow.Insert Shift:=xlDown
Sheets("PostHistory").Range("B3").Value = txt_date
Sheets("PostHistory").Range("C3").Value = cb_staff
Sheets("PostHistory").Range("D3").Value = txt_post
Sheets("PostHistory").Range("E3").Value = txt_notes


If (Augment.txt_date.Text) = "" Then
GoTo Skip1
ElseIf IsNull(Augment.txt_date.Value) = False Then
End If

For Each cell In nameRange.Cells
If cell.Text = [cb_staff] Then
    cell.Offset(0, -1).Value = txt_date
End If

Next

Skip1:

Unload Augment

Sheets("Staff").Visible = False
Sheets("Engine").Visible = False
Sheets("List").Visible = False

Application.ScreenUpdating = True

Augment.Show

End Sub

首先:我没有找到代码应该多次编写的原因。但是我相信下面的代码不会写任何东西两次

Private Sub CommandButton7_Click()
    ' 209
    
    Dim nameRange   As Range
    Dim Fnd         As Range
    Dim Ctls()      As String
    Dim i           As Integer

    Ctls = Split("txt_Date,cb_Staff,txt_Post,txt_Notes", ",")
    If Len(txt_Date) Then
        With Worksheets("Staff")
            Set nameRange = .Range(.Cells(3, 3), .Cells(.Rows.Count, 3).End(xlUp))
        End With
        Set Fnd = nameRange.Find(cb_Staff.Value, , xlValues, xlWhole)
        If Not Fnd Is Nothing Then Fnd.Offset(0, -1).Value = txt_Date.Value
    End If
    
    With Worksheets("PostHistory")
        .Rows(3).EntireRow.Insert Shift:=xlDown
        With .Rows(3)
            For i = 0 To UBound(Ctls)
                .Cells(3 + i).Value = Me.Controls(Ctls(i)).Value
                Me.Controls(Ctls(i)).Value = ""
            Next i
        End With
    End With
End Sub
原则上,不需要为了读取或写入而取消隐藏工作表。此外,如果您写入的工作表是隐藏的,那么停止屏幕更新是没有意义的。最后,我确实喜欢您清除所有控件的方式,但我相信这会干扰您对组合框中列表的管理。因此,我向你们展示了上面的另一种方法


哦,是的。我创建了一个名为
Augment
的用户表单,其中包含一个组合框、3个文本框和一个CommandButton7。我希望你也有这样的衣服。

哇,这衣服干净多了。我今天要尝试一下,让你知道它是如何工作的。非常感谢你,工作得像做梦一样!非常感谢你!