我的宏将把一张纸与另一张纸进行比较。第二张表需要用户将数据粘贴到那里。 (注意:正在复制的数据不在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文件),因此复制/粘贴是我首选的方法。这个问题半实用,半理论。抱歉有任何困惑!
答案 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
按钮)。由于它是无模式的,因此用户可以从外部程序复制数据并将其粘贴。然后其余代码在用户点击之后运行。在此阶段,表单本身可以隐藏。作为概念证明,我创建了以下形式:
使用以下代码:
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
我在空白纸上发布表单。首先在代码之前出现一个消息框(确认代码可以在表单初始化时但在可见之前运行),然后表单显示:
我转到一个包含句子的记事本的打开实例,当表单仍然打开时 - 将其粘贴到A1:
最后我按okay
然后用户窗体隐藏自己,但继续运行代码(现在可以访问复制的数据):
请记得在最后卸载表单。