等待用户输入 - DoEvents是个好主意吗?

时间:2015-10-09 20:51:42

标签: excel-vba vba excel

我的宏将把一张纸与另一张纸进行比较。第二张表需要用户将数据粘贴到那里。 (注意:正在复制的数据不在Excel中。)

一种方法是运行宏,并通过提示用户粘贴数据来结束宏,然后运行“Macro2”。但是,我想将它全部保存在一个宏中,所以在继续之前找到了等待用户输入的方法。这似乎对我有用,所以我的主要问题是:

这样做有多稳定?

...macro stuff above here

MsgBox ("[Please copy the data into the new sheet, after clicking 'OK']")

Do While WorksheetFunction.CountA(newWS.Cells(1, 7)) < 1
    DoEvents
Loop

...then after the user pastes info, continue on, using the data that's been pasted.

我的想法是DoEvents只是在我的工作表空白时运行并运行。在用户将数据粘贴到newWS之后,宏继续(因为它将在第7列中看到数据)...

这是一个好方法,还是这样使用是个坏主意?我从来没有真正使用DoEvents,所以不知道它是否在后台做了可能导致问题的事情。

编辑:数据在Lotus Notes中,我可以将其导出到Excel。但是,这需要更多的步骤(我宁愿不创建一些新的临时excel文件),因此复制/粘贴是我首选的方法。这个问题半实用,半理论。抱歉有任何困惑!

2 个答案:

答案 0 :(得分:2)

可能不是最好的主意。相反,允许他们通过VBA选择数据并执行复制:

MsgBox ("[Please select data to copy into the new sheet, then press 'OK']")

newWs.Cells(1,1).PasteSpecial  '### Modify to your specific location to paste the data

'Here you can add logic to validate that they have pasted enough data, 
' and use control statement to prompt them to paste more data, etc., 
' if necessary, or exit sub early

'For example:
If WorksheetFunction.CountA(newWS.Cells(1, 7)) < 1 Then
    MsgBox "Try again!"
    Exit Sub
End If

或者,您可以使用DataObject

Dim dataObj As New MSForms.DataObject


dataObj.GetFromClipboard

newWs.Cells(1,7).Value = dataObj.GetText

答案 1 :(得分:2)

您可以重新构建代码,使其位于user ShowModal设置为false(在属性中)的用户窗体内。您希望用户收集数据之前的代码可以放入useform的initialize事件中。然后userfrom显示(带有简单的标签标题和okay按钮)。由于它是无模式的,因此用户可以从外部程序复制数据并将其粘贴。然后其余代码在用户点击之后运行。在此阶段,表单本身可以隐藏。作为概念证明,我创建了以下形式:

enter image description here

使用以下代码:

Private Sub CommandButton1_Click()
    Me.Hide
    MsgBox Range("A1").Value
    Unload Me
End Sub

Private Sub UserForm_Initialize()
    'macro code can go here
    'it runs before the form shows
    'e.g.
    MsgBox "Initializing"
End Sub

我在空白纸上发布表单。首先在代码之前出现一个消息框(确认代码可以在表单初始化时但在可见之前运行),然后表单显示:

enter image description here

我转到一个包含句子的记事本的打开实例,当表单仍然打开时 - 将其粘贴到A1:

enter image description here

最后我按okay然后用户窗体隐藏自己,但继续运行代码(现在可以访问复制的数据):

enter image description here

请记得在最后卸载表单。