【问题标题】:Excel: opening workbookExcel:打开工作簿
【发布时间】:2014-09-12 11:47:30
【问题描述】:
Private Sub CommandButton1_Click()
        ...
        Set wb = Workbooks.Open(Filename:="C:\book1.xls")
        If MsgBox("Please Review the Transmittal sheet, if satisfied click Yes to send,  No to cancel." & vbCrLf & "Transmittal Number: " & Transm, vbYesNo) = vbNo Then
        ...
End Sub

问题是这样的,我试图从另一个工作簿中打开一个工作簿。第二个工作簿打开,但只到了某个点 - 屏幕是白色的,好像在等待某事完成。

我的代码移动到带有 msgbox 提示符的下一行,一旦我选择是或否并且子例程完成,第二个工作簿然后打开完全显示其数据。在子程序内调用时不能正常打开,在子程序下没有被完全执行

有什么想法吗?

总的来说,我正在尝试为以下场景找出解决方案。用户打开 Excel 工作簿,单击工作表上打开用户表单的按钮。用户在组合框中选择一些信息,并根据这些选择在 Excel 表中填写相关数据。填写完成后,用户单击按钮以根据 excel 工作簿中的信息生成报告。在发送之前,用户必须检查并确认 excel 工作簿上的数据是否正确,因此会收到一个 msgbox 提示他们执行此操作 - 如果数据正确,请单击“是”,否则请单击“否”。但是使用 msgbox 和用户表单,他们无法访问 excel 工作簿。我对此的想法是打开一个新工作簿并从当前工作簿中复制数据,允许用户以这种方式查看它。也许你有更好的方法来做到这一点。

请注意,原始代码不是我的,所以我只是在修复错误,这个特殊的错误是由于用户表单和 msgbox,用户无法专注于 excel 工作表。

吉姆

【问题讨论】:

  • 我不确定我是否理解问题所在.. 你能改述一下吗?
  • 我认为您的意思是“直到”,而不是“下”。
  • Doug,Sifu - 我已经编辑了问题以澄清我的意思。谢谢

标签: vba excel worksheet


【解决方案1】:

不确定您的确切问题是什么,但如果您想在“阅读”工作表后提示是/否:

宏 #1(位于 VB 编辑器的“Thisworkbook”中):

Private Sub Workbook_Open()
Sheets("Transmittal sheet").Activate 'or whatever the sheet's name
End Sub

这将强制用户在打开工作簿时在屏幕上显示此工作表。 接下来,宏#2(位于“传输表”(Sheet X)中)'同样是任何表名称/编号:

Private Sub Worksheet_Deactivate()
    Set wb = Workbooks.Open(Filename:="C:\book1.xls")
    If MsgBox("Please Review the Transmittal sheet, if satisfied click Yes to send,  No to cancel." & vbCrLf & "Transmittal Number: " & Transm, vbYesNo) = vbNo Then
End Sub

当用户试图离开工作表时,这将提示。另一种方法是将第二个宏放在 workbook_beforeClose 下,具体取决于情况如何。同样,如果您能明确您想要实现的目标,那就更好了。

【讨论】:

  • 嗨,这对我不起作用,因为在现实生活中,新工作表应该在代码中创建并且没有任何宏。我已经编辑了这个问题,更好地解释了我的要求。感谢您的帮助。
  • 基于已编辑的部分,我假设您希望在显示工作表时保持用户窗体打开。我建议将其分为 3 个部分 - 第一部分包括显示表单和保存数据。第二段是关闭表单并调出报表工作表,第三段是用msgbox / inputbox确认,如果数据需要更改,再次调出用户表单(第一段)
  • 不幸的是,Alex,这需要进行重大重写,因为我说过我没有进行初始编码。我希望能够在自己打开的新添加工作簿中显示当前工作簿,但我尝试打开的任何工作簿 - 新的或现有的 - 在子例程完成之前不会显示。
  • 您只能在用户窗体之间设置焦点,而不能在工作表之间设置焦点。您可以加载工作表,但用户表单将始终妨碍您。就是不行。另一种方法是在另一个用户窗体上显示您的整个报告。
  • 嗨,亚历克斯,我想了很多,所以基本上将工作表加载到用户表单中,然后从那里开始。可能是我唯一的解决方案,因为原始编码我非常受限于我能做什么或不能做什么。
【解决方案2】:

我找不到合适的解决方案,msgbox 似乎完全锁定了 excel,我也无法查看新的工作表。

所以我想出的解决方法是将当前工作表导出为 PDF 并显示。

   Dim pdfFile As String
    pdfFile = Get_Temp_File_Name(sExtensao:="pdf")

    ThisWorkbook.ExportAsFixedFormat _
    Type:=xlTypePDF, _
    Filename:=pdfFile, _
    Quality:=xlQualityStandard, _
    IncludeDocProperties:=True, _
    IgnorePrintAreas:=False, _
    OpenAfterPublish:=True
    ' Allow time for PDF to be created and loaded
    Application.Wait (Now + TimeValue("0:00:10"))
GoTo PreviewSkip

TrapPreview:
    MsgBox Err.Description

PreviewSkip:

If MsgBox(...

我还使用Excel Tilte Set 中的代码生成带有 pdf 扩展名的临时文件名。

感谢大家的意见。 吉姆

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多