VBA 打印報表

本文介绍如何使用VBA连接SQL Server数据库,并通过Excel进行数据查询与报表打印。主要内容包括:VBA简介、宏录制技巧、ADODB连接对象使用、SQL查询执行等。

因公司有大量的數據需要打印報表,老大讓我思考下可否通過VBA來進行打印,因在大學期間學習過vb課程,對于vba接觸起來還是比較快的,只是其中的一些細節和宏定義瞭解不深.現在把學習的心得總結一下.

vba的全文名稱是visual basic for application . 它是visual basic(vb) 的應用程序版本.但是它和vb用很大的不同,vb是運行在獨立的平臺上,而vba是借助在Excel的運行環境中,通過它可以讓Excel的操作變得越來越簡單.要全面掌握vba是一件很讓人糾結的事情,它擁用龐大的宏,但是實際上我們用到的比較少.如果你對于宏瞭解不深 最好的方法是錄製宏. 它在Excel工具欄中---工具----宏---錄製宏.說了這麼多貼代碼了!

 

'
'windowxp excel2007;
' SQL Server 2008
'@Autor MichaelYang
'
'
Public Function WorkBook_Open()
Dim Conn As New ADODB.Connection '定義ADODB連接對象
Dim ConnStr As String '定義連接字符串
'注意 如果是通過IP連接SQL server2008的話 需要開啟 SQL Server Browser服務
ConnStr = "Provider=SQLOLEDB.1;DATA SOURCE=10.1.xxx.xxxx;Password=test;User ID=test;Initial Catalog =vbaTest;"


Dim Records As New ADODB.Recordset
Dim Sheet As Worksheet

Set Sheet = ThisWorkbook.Worksheets(2)

If Sheet.Name = "" Then
Sheet.Name = "use_table"
Else
MsgBox "已經命名好了"
End If

Sheet.Cells.Clear '刪除原有的所有信息

If Conn.State = 1 Then
MsgBox "已經連接"
Else
Conn.Open ConnStr
End If

Dim SQLStr As String
SQLStr = "select * from use_table"

Records.Open SQLStr, Conn, adOpenStatic, adLockBatchOptimistic

Dim i, j, TotalRows, TotalColumns As Integer

j = 0

TotalRows = Records.RecordCount
TotalColunms = Records.Fields.Count
' Sheet.ClearArrows
' 用於插入列名
' For i = 0 To TotalColunms - 1
' Sheet.Cells(1, i + 1) = Records.Fields(i).Name
' Next

Do While Not Records.EOF '記錄集的
For i = 0 To TotalColunms - 1
Sheet.Cells(j + 3, i + 1) = Records.Fields(i).Value '從第三行開始輸入數據
Next
Records.MoveNext
j = j + 1

Loop

Records.Close
Conn.Close

Set Records = Nothing
Set Conn = Nothing

End Function
錄製宏test
Sub test()
'
' test Macro
' michaelyang  2011/3/28 魁籹エ栋
'
'
Range("A1:C1").Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With
Range("A1:C1").Select
ActiveCell.FormulaR1C1 = "用戶密碼管理"
With ActiveCell.Characters(Start:=1, Length:=6).Font
.Name = "新細明體"
.FontStyle = "粗體"
.Size = 18
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Columns("C:C").Select
Range("C2").Activate
Selection.ColumnWidth = 8.75
Range("A1:C1").Select
Columns("C:C").ColumnWidth = 27
Columns("C:C").ColumnWidth = 8.38
Columns("A:C").Select
Range("A2").Activate
Selection.ColumnWidth = 26.5
Range("A1:C1").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With
Range("A2").Select
ActiveCell.FormulaR1C1 = "主鍵"
Range("B2").Select
ActiveCell.FormulaR1C1 = "用戶名"
Range("C2").Select
ActiveCell.FormulaR1C1 = "密碼"
Range("A2:C2").Select
Range("C2").Activate
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
With Selection.Interior
.ColorIndex = 47
.Pattern = xlSolid
End With
Range("A3").Select

WorkBook_Open

End Sub
 
提供了基于BP(Back Propagation)神经网络结合PID(比例-积分-微分)控制策略的Simulink仿真模型。该模型旨在实现对杨艺所著论文《基于S函数的BP神经网络PID控制器及Simulink仿真》中的理论进行实践验证。在Matlab 2016b环境下开发,经过测试,确保能够正常运行,适合学习和研究神经网络在控制系统中的应用。 特点 集成BP神经网络:模型中集成了BP神经网络用于提升PID控制器的性能,使之能更好地适应复杂控制环境。 PID控制优化:利用神经网络的自学习能力,对传统的PID控制算法进行了智能调整,提高控制精度和稳定性。 S函数应用:展示了如何在Simulink中通过S函数嵌入MATLAB代码,实现BP神经网络的定制化逻辑。 兼容性说明:虽然开发于Matlab 2016b,但理论上兼容后续版本,可能会需要调整少量配置以适配不同版本的Matlab。 使用指南 环境要求:确保你的电脑上安装有Matlab 2016b或更高版本。 模型加载: 下载本仓库到本地。 在Matlab中打开.slx文件。 运行仿真: 调整模型参数前,请先熟悉各模块功能和输入输出设置。 运行整个模型,观察控制效果。 参数调整: 用户可以自由调节神经网络的层数、节点数以及PID控制器的参数,探索不同的控制性能。 学习和修改: 通过阅读模型中的注释和查阅相关文献,加深对BP神经网络与PID控制结合的理解。 如需修改S函数内的MATLAB代码,建议有一定的MATLAB编程基础。
<think>嗯,用户这次问的是在VBA中调用水晶报表进行打印的方法。看来用户正在处理VB相关的打印功能开发,之前我们讨论过PrintDocument的错误处理和Excel打印机指定,现在转向了第三方报表工具集成。 从用户提供的引用来看,用户似乎已经有一定的VB开发经验,特别是处理打印任务和外部应用调用。水晶报表是个比较老的报表工具,现在用的人不多了,用户可能是维护旧系统时需要这个功能。 需要重点解决几个技术点:首先要确认水晶报表的自动化接口如何使用,然后是如何在VBA中创建报表对象并设置打印参数。考虑到用户之前研究过打印机指定问题,应该也需要支持动态打印机设置的功能。 用户可能遇到的具体难点包括:水晶报表运行时组件的引用问题、报表参数的传递方式、打印时的错误处理。特别是64位Office兼容性问题要特别提醒,这是水晶报表常见的坑。 准备在回复时给出完整的代码示例,包括初始化、参数设置、打印执行三个关键步骤。因为用户之前看过Excel打印机设置的代码,可以借鉴类似的打印机指定逻辑。还要补充说明界面元素加载的问题,很多开发者会忽略ReportSource的必需性。 考虑到这是企业级应用场景,应该提醒用户注意错误处理和日志记录。水晶报表在无人值守打印时容易出权限问题,这点要着重强调。 </think>在VBA中调用水晶报表(Crystal Reports)进行打印,需通过其自动化接口(`Crystal Reports Runtime`)实现。以下是详细步骤和代码示例: --- ### **步骤与代码实现** 1. **添加类型库引用** VBA编辑器 → 工具 → 引用 → 勾选 `Crystal Reports ActiveX Designer Runtime Library`(如`CRAXDRT`或版本号如`Crystal Reports 13 Runtime`) 2. **核心代码示例** ```vba Sub PrintCrystalReport() Dim crApp As Object ' CRAXDRT.Application Dim crReport As Object ' CRAXDRT.Report Dim printerName As String On Error GoTo ErrorHandler Set crApp = CreateObject("CrystalRuntime.Application") ' 创建报表应用对象 ' 打开报表文件(.rpt路径) Set crReport = crApp.OpenReport("C:\Reports\YourReport.rpt") ' 设置打印机(可选) printerName = "Your Printer Name on Port" ' 格式如 "HP LaserJet on Ne00:" If printerName <> "" Then crReport.PrintOptions.PrinterName = printerName End If ' 执行打印(静默模式) crReport.PrintOut True ' True表示不显示打印对话框 MsgBox "打印任务已发送!" Exit Sub ErrorHandler: MsgBox "打印失败: " & Err.Description, vbCritical End Sub ``` --- ### **关键参数说明** 1. **打印机名称格式** 必须包含端口信息(如 `"HP LaserJet P2035 on Ne00:"`),可通过以下代码获取打印机列表: ```vba Sub ListPrinters() Dim p As Printer For Each p In Printers Debug.Print p.DeviceName & " on " & p.Port Next End Sub ``` 2. **传递参数到报表** 在调用打印前设置参数字段: ```vba crReport.ParameterFields(1).SetCurrentValue "2023" ' 设置第一个参数值 ``` 3. **导出替代方案** 若需导出PDF而非直接打印: ```vba crReport.ExportOptions.FormatType = crEFTPortableDocFormat ' PDF格式 crReport.ExportOptions.DestinationType = crEDTDiskFile crReport.ExportOptions.DiskFileName = "C:\Output.pdf" crReport.Export False ' 执行导出 ``` --- ### **常见问题处理** - **错误`429`: ActiveX组件无法创建对象** 安装对应版本的[Crystal Reports Runtime](https://www.sap.com/cmp/td/sap-crystal-reports-visual-studio-trial.html)(需与报表设计版本一致)。 - **报表数据源连接失败** 在`.rpt`文件中使用ODBC连接字符串,或通过代码动态重置连接: ```vba crReport.Database.Tables(1).ConnectionProperties("Connection String") = "DSN=YourDataSource;" ``` - **静默打印失效** 检查系统默认打印机权限,或显式指定打印机名称(参考步骤2)。 --- ### **注意事项** 1. **版本兼容性** 32位VBA需匹配32位Runtime,64位环境需使用`Crystal Reports 64位 Runtime`并调整API声明。 2. **界面元素依赖** 首次运行时若报错,尝试在报表加载后添加短暂延迟: ```vba crReport.ReportTitle ' 触发界面初始化 Application.Wait Now + TimeValue("00:00:01") ' 等待1秒 ``` > 提示:对于新项目,建议评估替代方案(如SQL Server Reporting Services或Power BI),水晶报表官方支持已逐步收缩[^1][^2]。 --- ### 相关问题 1. 如何动态绑定水晶报表的数据源(如ADO记录集)? 2. 水晶报表在64位Office环境下调用失败如何解决? 3. 如何实现VBA批量打印多个水晶报表文件? 4. 水晶报表导出PDF时如何设置页面方向和分辨率? [^1]: 打印功能的错误处理与稳定性优化 [^2]: VBA调用外部应用时的设备指定机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值