单元格内容作为Excel中“WHERE”语句的一部分

我一直在寻找几个星期,但在寻找对以下问题的答案方面还没有取得太大的成功…

我可以在Excel中创build文本框(在开发人员选项中),然后将用户input的文本框内容作为SQL(T-SQL)中的WHERE语句的一部分吗? 理想情况下,我希望用户能够input一个3位数的ID号码,然后点击searchbutton,在相同或不同的工作表上显示结果列表。 如果一个文本框不是那么简单,那么我会解决一个单元格的内容,而不是文本框内容的引用。

像这样的东西:

SELECT T.CustomerName, T.NetAmount, T.TransactionType FROM TheDatabase.dbo.TransactionsTable T WHERE T.ScheduledDate > '2016-01-01' AND (T.Status = 'InProcess' OR T.Status = 'Completed') AND T.CustomerID = [textbox1.contents / cell(A1).. something] 

我知道SQL不是这样devise的,但我希望它能说明我正在努力完成什么。

一些背景:

我正在向同事传递一些责任,因为我正在转向不同的angular色。 我有一个定期运行的报告,提供了关于应付账款交易的统计信息。 我不得不在一夜之间学习一些基本的SQL,并且在deviseSELECT语句和学习中一直很成功。 问题是,当我需要添加一个新的客户(基本上是一个3位数字)到我的账户清单来审查,我不得不修改查询。 这对我来说没什么大不了的,我只是打开PowerQuery,select高级视图,然后编辑代码。 我不能为下一个人修复这个工具,所以我需要一种方法来search他们想要的客户。

我可以加载所有的客户,但是主表中有超过360万个事务,有超过30个字段。 PLUS在3个数据库中至less有6个表,我将它们连接在一起来计算所有的信息。 上一次我试图检索所有的交易数据,因为我的系统内存不足,使我停止生产。 我成功地查询了这么多的数据,花了近10分钟。 老实说,这对我来说不是问题,但是这个人必须一直运行这个,我需要加快速度。 正如我所看到的,消除这个问题的唯一方法就是仅仅拉取我需要的交易。 当我现在这样做,它需要3秒钟。

我一直在使用的查询是在Microsoft SQL Server Management Studio中创build的,我基本上复制查询并在Excel中创build查询时将其粘贴到“高级”框中。

任何有关这方面的build议都会对现在和将来的项目都有所帮助!

在Excel VBA中,您可以打开一个SQL连接到您的数据库。 但是你需要正确的权限和密码才能做到这一点。 也许你公司的技术人员可以帮忙。

然后你需要build立你的SQL代码并发送它。 然后检索结果。 您可以用多种方式显示结果。

下面是一些让你开始的代码:

  Set objMyConn = New ADODB.Connection Set objMyRecordset = New ADODB.Recordset Dim strSQLText As String ' Declare a string to build your SQL in 'Open your connection objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=TheDatabase;User ID=xyz;Password=xyz;" objMyConn.Open strSQLText = "SELECT T.CustomerName, T.NetAmount, T.TransactionType " & _ "FROM TheDatabase.dbo.TransactionsTable T " & _ "WHERE T.ScheduledDate > '2016-01-01' AND " & _ "(T.Status = 'InProcess' OR T.Status = 'Completed') AND " & _ "T.CustomerID = '" & _ Me.textbox1.Value & "';" Set objMyRecordset.ActiveConnection = objMyConn objMyRecordset.Open strSQLText ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

此代码假定您的T.CustomerID是一个varchar。 如果它是一个整数(或其他数据types),则需要从围绕textbox1.Value的SQLText中删除单引号

您可能还想将结果保存在单元格“A1”以外的其他位置。 有很多方法/地方来显示结果。

此外,此代码假定textbox1.Value中只有一个ID。 获取这个SQL只能使用1个客户代码。 如果您需要为多个客户返回数据,您可以稍后再做一点工作。

希望能让你开始。