如何用SQL每日从Microsoft Navision导出数据至Excel并保留手动列?
完全可以实现你的需求,以下是分步落地的方案:
1. 核心:通过SQL从Navision提取目标字段
Navision后台基于SQL Server,直接编写SQL查询即可获取所需的15个标准字段。需要注意Navision的表和字段名通常包含空格或特殊字符,需用双引号或方括号包裹。
示例SQL查询(适配Navision常见表结构)
SELECT sh."No_" AS "Order Number", sl."Line No_" AS "Order Line", sh."Your Reference" AS "Customer Reference", sh."Salesperson Code" AS "Account Manager", sh."Sell-to Customer No_" AS "Customer Code", sc."Name" AS "Customer Name", sc."Country/Region Code" AS "Country", sl."No_" AS "Sales Item Code", il."Item No_" AS "Item Code", il."Description" AS "Description", il."Cross-Reference No_" AS "Cross Reference", sh."Payment Terms Code" AS "Payment Terms" FROM [YourNavisionDBName].[dbo].[Sales Header] sh JOIN [YourNavisionDBName].[dbo].[Sales Line] sl ON sh."No_" = sl."Document No_" JOIN [YourNavisionDBName].[dbo].[Customer] sc ON sh."Sell-to Customer No_" = sc."No_" JOIN [YourNavisionDBName].[dbo].[Item] il ON sl."No_" = il."No_" -- 可根据需求添加过滤条件,比如只提取近30天的订单 WHERE sh."Document Date" >= DATEADD(day, -30, GETDATE())
2. 保留手动填写列的关键方案
不能直接覆盖整个工作表,需将自动提取数据与手动编辑数据分离:
- 新建两个工作表:
Navision_原始数据(仅存放SQL提取的字段,每日更新)、手动编辑区(存放DATE字段和3个YES/NO字段) - 再建一个
合并视图工作表,用XLOOKUP或VLOOKUP通过**唯一键(Order Number + Order Line)**关联两个表的内容,用户日常查看和使用合并视图即可 - 若必须在同一工作表,可先将手动列数据临时存入Excel隐藏工作表或名称管理器,更新完SQL数据后再写回对应列
3. 每日自动执行两次的实现方式
方案A:VBA宏 + Windows任务计划
- 编写VBA宏执行SQL查询并更新
Navision_原始数据工作表(示例代码如下) - 用Windows任务计划程序设置每日两次触发,命令行调用Excel并运行宏:
"C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" "C:\路径\你的文件.xlsm" /e"RefreshNavisionData"
示例VBA宏代码
Sub RefreshNavisionData() Dim conn As Object, rs As Object Dim sqlStr As String, ws As Worksheet Dim lastRow As Long Set conn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") Set ws = ThisWorkbook.Sheets("Navision_原始数据") ' 清空现有数据(保留表头) lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row If lastRow > 1 Then ws.Rows("2:" & lastRow).ClearContents ' 连接Navision SQL服务器,替换为你的实际连接信息 conn.Open "Provider=SQLOLEDB;Server=你的NavisionSQL服务器地址;Database=你的Navision数据库名;UID=有权限的账号;PWD=密码;" ' 替换为你的SQL查询语句 sqlStr = "SELECT sh.""No_"" AS ""Order Number"", sl.""Line No_"" AS ""Order Line"", sh.""Your Reference"" AS ""Customer Reference"", sh.""Salesperson Code"" AS ""Account Manager"", sh.""Sell-to Customer No_"" AS ""Customer Code"", sc.""Name"" AS ""Customer Name"", sc.""Country/Region Code"" AS ""Country"", sl.""No_"" AS ""Sales Item Code"", il.""Item No_"" AS ""Item Code"", il.""Description"" AS ""Description"", il.""Cross-Reference No_"" AS ""Cross Reference"", sh.""Payment Terms Code"" AS ""Payment Terms"" FROM [你的Navision数据库名].[dbo].[Sales Header] sh JOIN [你的Navision数据库名].[dbo].[Sales Line] sl ON sh.""No_"" = sl.""Document No_"" JOIN [你的Navision数据库名].[dbo].[Customer] sc ON sh.""Sell-to Customer No_"" = sc.""No_"" JOIN [你的Navision数据库名].[dbo].[Item] il ON sl.""No_"" = il.""No_""" rs.Open sqlStr, conn ws.Range("A2").CopyFromRecordset rs ' 清理资源并刷新合并视图公式 rs.Close: conn.Close Set rs = Nothing: Set conn = Nothing ThisWorkbook.Sheets("合并视图").Calculate End Sub
方案B:Power Query自动刷新
- 用Excel Power Query连接Navision SQL数据库,导入查询结果
- 在Power Query设置中配置自动刷新计划,或用PowerShell脚本配合任务计划触发刷新,无需启用宏
4. 共享文件被使用时的更新处理
- 不要直接更新共享文件的原始数据,而是将SQL提取的原始数据存放在服务器上的一个独立中间文件(如
Navision_数据缓存.xlsx) - 共享文件通过Power Query或VBA从中间文件读取数据,手动列直接保存在共享文件内,这样即使共享文件被打开,中间文件的更新也不会冲突
- 若使用Power Query,开启后台刷新选项,避免占用用户操作资源
内容的提问来源于stack exchange,提问作者Divad
相关产品推荐
相关产品推荐

