【问题标题】:Find un-open workbook and print from specified sheet查找打开的工作簿并从特定工作表打印
【发布时间】:2014-11-26 03:16:19
【问题描述】:

我正在创建一个电子表格,将我的客户与他们的常规订单联系起来。 例如:John Smith 有八个不同的订单。所以我有一本约翰史密斯的工作簿和工作簿中的八张纸(每个订单一张)。它需要这样,因为订单很长并且需要简单的编辑。

构建中的电子表格有一个客户下拉列表 (B3)、一个订单下拉列表 (F3) 和一个打印按钮 (Button10)。因此,您选择一个客户,选择一个订单并点击打印。我希望它进入目录(C:\Users\Julian\Documents\Customers),找到正确的工作簿和工作表,然后进入正确顺序的打印预览模式。

我的 VBA 知识非常一般(我知道如何让按钮打印预览当前工作表,但仅此而已)。我已经有一个单元格,它会自动以正确的格式显示工作簿名称 (T6),并根据下拉选择自动以正确的格式显示工作表名称 (T7)。

我想知道是否有人可以帮助我使用一些代码来根据下拉选择从正确的工作簿中打印正确的工作表。如果它找不到工作簿或工作表,我想要一条弹出消息,显示“在此搜索条件下没有工作簿或工作表”或类似的内容,而不是一般的编码错误。

任何帮助将不胜感激!谢谢!

朱利安。

【问题讨论】:

  • 嗨,朱利安。您的问题并未表明您已尝试自己解决问题,并且 StackOverflow 不是免费的代码编写服务。您说您对 VBA 有基本的了解,那么为什么不尝试自己解决问题,然后就遇到的任何问题提出问题。请参阅Help Center,了解有关如何在此处提出好问题的更多信息。
  • 嗨@Aiken,我问这个问题的原因是因为我尝试在这个网站上阅读其他类似的问题,但找不到任何对我有足够帮助的东西。我显然首先尝试了自己,但是这种级别的 VBA 超出了我的能力范围,我很想学习和应用它。我尝试了很多很多其他方法,但似乎没有任何效果,因此发布了这篇文章。不是我懒惰,也不是试图让其他人为我做这项工作。
  • 我了解有时很难解决您不完全理解的问题,但通过包括您的尝试回答者可以帮助您了解为什么它没有按您希望的那样工作,然后解释什么会代替。这样你就可以学到一些东西得到你的答案。了解 Stack Overflow 的工作原理有助于我们所有人以一种有意义且互利共赢的方式参与其中,如果您提出好的问题,他们会获得支持和答案,每个人都会获得代表,您也会获得答案。双赢:)

标签: excel vba printing worksheet


【解决方案1】:

这是我在 Stack Overflow 上的第一个答案,请多多包涵。

我以使用数据库为生,我相信总有办法让事情变得更简单,尤其是当您使用 Excel 时,尤其是当您愿意使用 VBA 时更是如此。我建议您上传一个示例 John Smith 文件,我可以向您展示如何为您正在尝试做的事情设置更有效的方法。

如果您只需要快速解答,请尝试以下建议。

  1. 工作簿不存在时的错误捕获

    'Open the VBA Editor (Alt+F11) and create a new Module and paste the following code in: 
    
    Sub PrintOrder()  
    
        Application.ScreenUpdating = False  
        Application.DisplayAlerts = False  
    
        '-----------'
        ' VARIABLES '  
        '-----------'
        Dim wb As Workbook, _  
            ws As Worksheet, _  
            wb_Client As Workbook, _
            ws_Order As Worksheet, _  
            blOrder As Boolean, _  
            filDir As String, _  
            client As String, _  
            order As String, _ 
            sht As Worksheet, _ 
            xtsn As String
    
        Set wb = ThisWorkbook  
        Set ws = wb.Worksheets("Sheet1")  
        'Insert your actual sheet name in place of "Sheet1" or use the worksheet number such as wb.Worksheets(1)  
    
        filDir = "C:\Users\Julian\Documents\Customers\"
    
        ChDrive "C"
        ChDir filDir
    
        client = Trim(LTrim(ws.Range("T6").Value))  
        order = Trim(LTrim(ws.Range("T7").Value))
        xtsn = ".xlsx" 'Replace the extension below with whatever format your file is in or simply use xtsn = "" if you've already included the file extension in the T6 cell  
    
        '---------------------------------'
        ' CHECK IF CLIENT WORKBOOK EXISTS '
        '---------------------------------'
        If Dir(client & xtsn) <> "" Then 'the workbook exists so open it 
            Workbooks.Open Filename:=filDir & client & xtsn 
    
            Set wb_Client = ActiveWorkbook  
    
            '---------------------------------'
            ' CHECK IS ORDER WORKSHEET EXISTS '
            '---------------------------------'
                blOrder = False
                For Each sht In Worksheets
                    If sht.Name = order Then
                        blOrder = True
                        Exit For
                    End If
                Next
    
                If blOrder Then 'worksheet exists so open its print preview window  
                    'EDIT// I originally set ws_Order to wb.Worksheets(order) but the proper workbook should be the customer workbook that just opened
                    Set ws_Order = wb_Client.Worksheets(order)  
                    ws_Order.PrintPreview
                Else 'worksheet does not exist so throw into error  
                    '//EDIT// I forgot the ampersand before the 'customer' string variable, which ruined the concatenation
                    Call MsgBox(prompt:="Order No. " & order & " has not been created for " & customer & "." & _  
                        Chr(13) & "Please create a new order worksheet before continuing." & _  
                        Chr(13) & Chr(13) & "     Error Code: A002", _  
                        Buttons:=vbOkOnly, Title:="ERROR: Missing Order Worksheet")
                    GoTo endProc
                End If   
        Else 'workbook does not exist so throw into error  
            Call MsgBox(prompt:="No client workbook was found for " & customer & "." & _  
                Chr(13) & "Please create a new client workbook before continuing." & _  
                Chr(13) & Chr(13) & "     Error Code: A001", _  
                Buttons:=vbOkOnly, Title:="ERROR: Missing Client Workbook")  
            GoTo endProc  
        End If  
    endProc:
        Application.ScreenUpdating = True  
        Application.DisplayAlerts = True  
    End Sub
    

【讨论】:

  • 感谢您的回复。我尝试应用该代码并进行所需的更改,但是出现了很多错误。绝对不是说它错了,但我更担心我应用它的方式是错误的!如何为您上传示例文件?只是让您知道有大约 100 个客户,每个客户每个有大约 5-6 个订单。所以它必须找到正确的工作簿,找到正确的工作表并打印预览。我已经研究了一段时间,并相信这是唯一有效的方法(允许不断变化),每个订单也有很多独特的图像。谢谢!
  • 嘿,没问题。在 Excel 中运行代码后,我发现了两个主要错误。我在一个 MsgBox 调用中遗漏了一个 & 符号,所以我连接的错误消息都搞砸了。常见错误,如果我刚刚将代码粘贴到 VBA 编辑器中,我应该会发现它;我的错!
  • 另一个错误是由于工作簿引用不正确,我基本上将订单工作表链接到原始工作簿(带有 T6 和 T7 单元格),显然该文件中不存在订单表。无论如何,我希望它现在有效。我假设您阅读了注释掉的代码,我在其中说明了您应该在自己的信息中放入的位置。您使用的是 .xlsx 文件吗?如果不确保更改 xtsn 变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 2013-08-16
相关资源
最近更新 更多