允许在用户窗体在循环中打开时查看其他工作表

Allow viewing other sheets while Userform is open within a loop

我制作了一个工作簿,其中包含用于在新行中填写信息的用户表单,文本框中的信息应使用下一行中的信息进行预填充。这必须与输入框值重复多次。 到目前为止一切顺利,但现在我还需要用户能够在打开用户窗体时查看存储所需信息的同一工作簿中的其他工作表。

如果我显示用户窗体是无模式的,我可以查看其他工作表,但是代码会继续运行,而第二次用户窗体应该弹出时却不会。

我找到了一个解决方案:使用 DoEvent。 但现在信息没有(预先)正确填写

Private Sub CommandButton2_Click()

Dim myValue As String

myValue = InputBox("How many do you have?")

 If StrPtr(myValue) = 0 Then Exit Sub
 

For i = 1 To myValue
Range("A4").EntireRow.Insert

UserForm1.Show vbModeless

    Do While UserForm1.Visible
         DoEvents
      Loop


Next



End Sub

现在发生的情况是,无论用户进行任何更改,都会使用下面一行中的信息。

有人有解决办法吗?

编辑: 我认为不需要立即理解我的问题,但它可能会有所帮助.. 用户窗体的其余代码如下

Private Sub CommandButton1_Click()

Unload UserForm1


End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        Cancel = True
        
        Range("A4").EntireRow.delete
        End
    
    End If
End Sub



Private Sub TextBox1_Change()


Dim myValue As Variant
myValue = TextBox1
Range("A4").Value = myValue

End Sub

Private Sub UserForm_Initialize()

Me.TextBox1.Value = Format(Range("A2"), "dd/mm/yyyy")
Me.TextBox2.Value = Range("B5").Value
Me.TextBox3.Value = Range("C5").Value
Me.TextBox4.Value = Range("D5").Value
Me.TextBox5.Value = Range("E5").Value
Me.TextBox6.Value = Range("F5").Value
Me.TextBox7.Value = Range("G5").Value
Me.TextBox8.Value = Range("H5").Value
Me.TextBox9.Value = Range("J5").Value
Me.TextBox10.Value = Range("K5").Value



End Sub

Private Sub TextBox10_Change()

Dim myValue As Variant
myValue = TextBox10
Range("K4").Value = myValue
End Sub

Private Sub TextBox11_Change()

End Sub

Private Sub TextBox2_Change()

Dim myValue As Variant
myValue = TextBox2
Range("B4").Value = myValue
End Sub

Private Sub TextBox3_Change()

Dim myValue As Variant
myValue = TextBox3
Range("C4").Value = myValue
End Sub

Private Sub TextBox4_Change()

Dim myValue As Variant
myValue = TextBox4
Range("D4").Value = myValue
End Sub

Private Sub TextBox5_Change()

Dim myValue As Variant
myValue = TextBox5
Range("E4").Value = myValue
End Sub

Private Sub TextBox6_Change()

Dim myValue As Variant
myValue = TextBox6
Range("F4").Value = myValue
End Sub

Private Sub TextBox7_Change()

Dim myValue As Variant
myValue = TextBox7
Range("G4").Value = myValue
End Sub

Private Sub TextBox8_Change()

Dim myValue As Variant
myValue = TextBox8
Range("H4").Value = myValue
End Sub

Private Sub TextBox9_Change()

Dim myValue As Variant
myValue = TextBox9
Range("J4").Value = myValue
End Sub
~~

我找到了一个方法.. 我现在更改了文本框的子名称#_change subs 并在“userform unload”上调用它们。

Private Sub CommandButton1_Click() ' this is the command button on the userform

Call TX1


Unload UserForm1


End Sub

我认为这确实与您的初始代码没有按预期重新触发 TextBox#_Change 潜艇这一事实有关。我做了一些不同的事情,并在 CommandButton2_Click 中触发了它们。这样,您实际上不需要重新加载。但无论什么工作;只是分享比较。所以,我假设用户窗体是这样的:

我们将在 Confirm Input 上移动 row 4。在 Cancel,我们将清除它并退出。在 Confirm Input,将(连续)询问用户是否要提交另一个条目。如果没有,我们将清除 row 4 并退出。

所以,我重写了这些部分:

Private Sub CommandButton1_Click()

Range("A4").EntireRow.ClearContents

Unload UserForm1

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        Cancel = True
        
        Range("A4").EntireRow.ClearContents
        Range("A4").Resize(1, 11).Interior.Color = vbYellow
        End
    
    End If
End Sub

Private Sub CommandButton2_Click()

Range("A4").Resize(1, 11).Interior.Color = vbWhite
Range("A4").Resize(1, 11).Insert

Range("A4").Resize(1, 11).Interior.Color = vbYellow

For i = 1 To 10
    myValue = Me.Controls("TextBox" & i).Value
    Me.Controls("TextBox" & i).Value = ""
    Me.Controls("TextBox" & i).Value = myValue
Next i

answer = MsgBox("Do you wish to add another row?", vbYesNo)

If answer = vbYes Then

    Else

Range("A4").EntireRow.ClearContents

Unload UserForm1

End If

End Sub

Private Sub TextBox1_Change()

Dim myValue As Variant
myValue = TextBox1

If myValue = "" Then
Range("A4").Value = myValue
Else
Range("A4").Value = CDate(myValue)
End If

End Sub

您可能想要删除颜色(重新)设置位。但最好认识到一直 插入 行的做法可能会对格式化产生意想不到的影响。假设,无论出于何种原因,您希望第 6 行具有红色背景。照原样,代码每次都会将此格式向下推一行。当然,这可能是您想要的...除此之外,TextBox1_Change 的“更新”确保您导出实际的 Excel 日期,而不是字符串。

最后警告(因为我们正在使用 vbModeless):请注意(在您的代码和我的代码中)没有对作品的引用sheet。假设您的用户进入另一个 sheet 并在那里单击 Confirm Input,这将在错误的 sheet 中触发 Range("A4").Resize(1, 11).Insert!似乎非常建议解决这个问题。