我想用Excel宏编写代码来对SQL数据库进行连接和操作,请教详细的步骤或方法,重分!!!!一定加分
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我想用Excel宏编写代码来对SQL数据库进行连接和操作,请教详细的步骤或方法,重分!!!!一定加分相关的知识,希望对你有一定的参考价值。
如题
参考技术A 参考网上资料:http://www.access-cn.com/offspace/html/32/n-532.html
一、加载ODBC宏(OFFICE2000光盘有提供)后您就可以使用该函数了。语法及示例详参《OFFICE2000帮助文档》,全篇如下:Office中国社区门户4q_Sz y0[ Z!g
连接到外部数据源并运行工作表中的查询。然后,函数 SQL.REQUEST 以数组形式返回结果,而不必运行宏。如果该函数不存在,就必须安装 Microsoft Excel 的 QDBC 加载宏(XLODBC.XLA)。Office中国社区门户(m1n:jj(alT3^
语法Office中国社区门户o%p&I"ev"b
SQL.REQUEST(connection_string,output_ref,driver_prompt,query_text,col_names_logical)
.I3ow0FKh,]*S'A5V:Eq0
Connection_string 提供信息,如数据源名称、用户标识和口令等。这些信息对于连接数据源的驱动程序是必需的,同时它们必须满足驱动程序的格式要求。下表给出用于 3 个不同驱动程序的 3 个连接串的示例。
#RT"~6e7h&? M!`'J0
oT f'j%o)M0 驱动器 连接串
dBASE DSN=NWind;PWD=test
SQL Server DSN=MyServer;UID=dbayer; PWD=123;Database=Pubs
ORACLE DNS=My Oracle Data Source;DBQ=MYSER VER;UID=JohnS;PWD=Sesame
Office中国社区门户r;??X7||
7V2\O e&S I;mIT8N0
在试图连接到数据源之前,必须定义在 connection_string 中使用的数据源名称(DSN)。Office中国社区门户p.D98]k
Z0k0X/@ Q6|#rAP~0 可以以数组或字符串的形式输入 connection_string。但如果 connection_string 超过 250 个字符,必须按数组的形式输入。
4_0M+Hb&At3^0Office中国社区门户b-Q0iI9p)Y
如果函数 SQL.REQUEST 不能使用 connection_string 访问数据源,则返回错误值 #N/A。 Output_ref 对用于存放完整的连接字符串的单元格的引用。如果在工作表中输入函数 SQL.REQUEST,可以忽略 output_ref。
当需要函数 SQL.REQUEST 返回完整的连接串时,可以使用 output_ref(此种情况下,必须在宏表中输入函数 SQL.REQUEST)。Office中国社区门户#^;a#C/b9r~&d
Office中国社区门户K$M'FCJXb
如果省略 output_ref,函数 SQL.REQUEST 不能返回完整的连接串。 Driver_prompt 指定驱动程序对话框的显示时机以及可用的选项。可以使用下表中所描述的数字来描述 driver_prompt。如果省略 driver_prompt,函数 SQL.REQUEST 默认为 2 。
2cX!c0~e5Rl&RT6U0 Office中国社区门户X9d7G _n
Driver_prompt 说明
1 一直显示驱动程序对话框。
2 只有在连接串和数据源说明提供的信息不够充分,以致不能完成连接时,才显示驱动程序对话框。所有对话框选项都可使用。
3 只有在连接串和数据源说明提供的信息不够充分,以致不能完成连接时,才显示驱动程序对话框。如果未指明对话框选项是必需的,这些选项是暗的,不能使用。
4 不显示对话框。如果连接不成功,则返回错误值。
|1@Pi)L0Office中国社区门户8_E8q4L9x]6X4J"_/C
Query_text 需要在数据源中执行的 SQL 语句。
如果函数 SQL.REQUEST 不能在指定的数据源中执行 query_text,则返回错误值 #N/A 。Office中国社区门户*`%S Hr+C7e6A1h3f
Office中国社区门户Eg.\*_H)yB
可以将引用连接到 query_text 上来更新查询。在下面的例子中,每次 $A$3 改变,函数 SQL.REQUEST 使用新的数值来更新查询。
"SELECT Name FROM Customers WHERE Balance > "&$A$3&"".
Microsoft Excel 将串长度限制在 255 个字符内。如果 query_text 超过此长度,请在垂直单元格区域中输入查询并使用整个区域作为 query_text。所有单元格的值连接在一起,形成完整的 SQL 语句。 Office中国社区门户 S,m/u(k]
Column_names_logical 指明是否将列名作为结果的第一行返回。如果要将列名作为结果的第一行返回,请将该参数设置为 TRUE。如果不需要将列名返回,则用 FALSE。如果省略 column_names_logical,则函数 SQL.REQUEST 不返回列名。
/q#H@B#Y:ji_0
返回值
如果此函数完成了它的所有功能,则返回查询结果数组或受查询影响的行数。Office中国社区门户WRBy h&O@Pll
Office中国社区门户)z*WnpE1J'E$?.@
如果函数 SQL.REQUEST 不能使用 connection_string 访问数据源,则返回错误值 #N/A。
3u'sr+~9~/yFTfmS0说明
函数 SQL.REQUEST 可以以数组的形式输入。如果以数组形式输入函数 SQL.REQUEST,该函数将返回一个恰好填充选定区域的数组。Office中国社区门户 cq8Xq ]NS
Office中国社区门户(^T%b7@ ]y
如果单元格区域大于结果集,函数 SQL.REQUEST 向返回的数组添加空单元格,直至增加到所需要的大小。
;Y"X;FA,kW0
+Lu"l5@?0 如果结果集大于以数组形式选定的输入区域,函数 SQL.REQUEST 返回整个数组。Office中国社区门户]/y) Q sIX
Office中国社区门户1c#ZY8`7n$YRp&x
函数 SQL.REQUEST 参数的次序与 Visual Basic for Application 中函数 SQLRequest 的参数次序不同。
Office中国社区门户"C!pK p9O6BnlPj
示例
6c!s3F^-TzT_0
假设需要对名为 DBASE4 的 DBASE 数据库进行查询。如果在单元格中输入下列公式,将会返回查询结果数组,其中第一行是列名:Office中国社区门户B9]4[RqK_wc
SQL.REQUEST("DSN=NWind;DBQ=c:\msquery;FIL=dBASE4", c15, 2,
"Select Custmr_ID, Due_Date from Orders WHERE order_Amt>100", TRUE)二、用“数据”菜单上的“获取外部数据”-“新建数据库查询”向导获取数据库数据。用该向导取得数据后,以后该工作表的数据以后会随数据动态更新(在不移动数据源文件的前提下)。注意:请仔细设置外部数据表的属性,会有更多收获。
以上答案供参考
想用C#做一个类似于excel里的公式库以及公式的运算模块,可以自定义函数,并可以解析公式并运算
主要包括数学计算函数、逻辑判断函数、文本函数、时间日期函数等,应用场合是模型平台,表达模型中不同参数之间的关系,存储介质是数据库,不是应用于类似于excel的表格。不知有没有类似的开源代码,或者有什么好的建议。谢谢!
参考技术A 1.工具--宏-录制新宏-确定。2.在宏窗口上“停止录制”
3.工具-宏-宏,点击macro1-编辑,进入一个窗口,把里面的内容全部删除,粘贴下面代码:
Function GetNum(b)
Dim i As Integer
Dim Al As String
For i = 1 To Len(b)
Al = Mid(b, i, 1)
If IsNumeric(Al) Or Al = "." Then
GetNum = GetNum & Al
End If
Next
End Function
选中一个单元格后,输入: =getnum(a1)
如果提取不是数字的,就改成:
Function Getstr(b)
Dim i As Integer
Dim Al As String
For i = 1 To Len(b)
Al = Mid(b, i, 1)
If not IsNumeric(Al) Then
Getstr= Getstr & Al
End If
Next
End Function
选中一个单元格后,输入: =getstr(a1)
参考技术B 直接增加这几个宏就好了
#define MK_FP( seg,ofs )( (void _seg * )( seg ) +( void near * )( ofs ))
#define FP_SEG( fp )( (unsigned )( void _seg * )( void far * )( fp ))
#define FP_OFF( fp )( (unsigned )( fp ))本回答被提问者采纳 参考技术C
也许他们没懂你什么意思,但是我差不多懂了你的意思,因为我最近也在做这些,我在做套版,客户自定义公式,获取自己想要的结果,像EXCEL一样输入公式就获得值。
我是建议你不要做什么反射,用什么js反编译,会降低你的软件性能,不参与什么编译,字符串转代码的事情,简单的循环一般的CPU还是应付得了的。
做这个事情首先你要内置函数,像EXCEL一样,他其实内置了封装函数,然后判断字符串去转义,我简单举例,看对你由帮助没有:
using System;using System.Linq;
using System.Windows.Forms;
namespace mutua
public class anys
//year函数
public string year(string datestr)
return Convert.ToString(Convert.ToDateTime(datestr.Replace("\\"", "")).Year);
//left函数
public string left(string str, int len)
try
return str.Substring(0, len);
catch
return "#N/A";
//公式解析
public string gs(string gsstr)
//用一个数组去记录公式里的连接符嵌套函数体
string[] gst = null;
if (gsstr != "")
//用等于号开始
if (gsstr.Substring(0, 1) == "=")
//等于号去掉,用&符号分割,空格忽略加入数组
string[] ar = gsstr.Substring(1, gsstr.Length - 1).Trim().Split('&');
gst = ar;
else
gst = null;
else
gst = null;
//如果公式有效
if (gst != null)
string arf = "";//寄存嵌套函数体计算结果
foreach (string la in gst)//遍历数组
string game = "";//寄存单个嵌套函数体的值
#region
string laf = "";//处理单引号,双引号
laf = la.Replace("\\"", "").Replace("'", "");
int kar = 0;//计算单个嵌套整体有几个函数
for (int i = 0; i < laf.Length; i++)
if (laf.Substring(i, 1) == "(")
kar++;
//从最深层函数开始运算,依次计算出函数体结果
for (int j = kar; j > 0; j--)
//获取最深层函数体( 位置
int jar = 0;
for (int i = 0; i < laf.Length; i++)
if (laf.Substring(i, 1) == "(")
jar = i + 1;
//获取函数体前面标志位置,截取函数体
int ga = 0, y = 0;
for (int i = laf.Length - 1; i > 0; i--)
if (laf.Substring(i, 1) == "(")
y++;
if (y == 2)
ga = i + 1;
//如果只找到一个(,那么他前面就没有函数嵌套
if (y < 2)
ga = 0;
//字符串深层第一个)
int tur = 0;
for (int i = 0; i < laf.Length; i++)
if (laf.Substring(i, 1) == ")")
tur = i + 1;
break;
string fx = laf.Substring(ga, jar - ga - 1).ToLower();//获取深层函数名称
string value = "";//寄存深层函数参数
//内置函数转义
switch (fx)
case "year":
value = year(laf.Substring(jar, tur - jar - 1));//转义year函数
break;
case "left":
value = left(laf.Substring(jar, tur - jar - 1), Convert.ToInt32(laf.Substring(jar, tur - jar - 1).Split(',')[1]));//转义left函数
break;
//重新组织函数体
laf = laf.Substring(0, ga) + value + laf.Substring(tur, laf.Length - tur);
//得到函数体值
game = laf;
#endregion
//累计公式的值
arf += game;
//获取公式结果
return arf;
else
//公式不成立就返回自身
return gsstr;
以上是公式模块,现在我们调用拖一个窗体,一个文本框一个按钮,输入公式测试
代码调用模块方法
效果如下
是你要的效果吗?
我的方法是每一个公式你都定义好,然后按自己的方法分解函数体,从深层到外层转义成值,最后再拼接函数体获得的值
参考技术D 这个不会有开源的代码,只能自己写。以上是关于我想用Excel宏编写代码来对SQL数据库进行连接和操作,请教详细的步骤或方法,重分!!!!一定加分的主要内容,如果未能解决你的问题,请参考以下文章
Excel VBA 宏,用于过滤从连接的 SQL 表中提取的时间戳数据