﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-cyberfan's blog-文章分类-oa</title><link>http://www.cnitblog.com/cyberfan/category/563.html</link><description>正其谊不谋其利，明其道不计其功</description><language>zh-cn</language><lastBuildDate>Fri, 30 Sep 2011 13:21:43 GMT</lastBuildDate><pubDate>Fri, 30 Sep 2011 13:21:43 GMT</pubDate><ttl>60</ttl><item><title>VBA中使用用户和组的方法</title><link>http://www.cnitblog.com/cyberfan/articles/1505.html</link><dc:creator>cyberfan</dc:creator><author>cyberfan</author><pubDate>Fri, 12 Aug 2005 04:53:00 GMT</pubDate><guid>http://www.cnitblog.com/cyberfan/articles/1505.html</guid><wfw:comment>http://www.cnitblog.com/cyberfan/comments/1505.html</wfw:comment><comments>http://www.cnitblog.com/cyberfan/articles/1505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cyberfan/comments/commentRss/1505.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cyberfan/services/trackbacks/1505.html</trackback:ping><description><![CDATA[为数据库设置了安全性后，可能需要使用用户和组。以下展示了其中的一些技巧。<BR>在使用以下各节介绍的过程之前，可能需要设置对 Microsoft ADO Ext 2.5 for DDL and Security 库的引用（如果尚未设置）： <BR>在 Visual Basic 编辑器中，指向"工具"菜单中的"引用"。将显示"引用"对话框。 <BR><BR>选中 Microsoft ADO Ext 2.5 for DDL and Security 复选框。<BR><BR><BR>一．添加和删除用户<BR><BR>以下过程将创建一个新的用户帐户，然后将其追加到用于当前数据库的工作组信息文件中的默认 Users 组。<BR>注意：要在 Access 中使用下面的示例，您需要作为 Admins 组的成员登录并打开一个数据库。在下面的过程中，您要确保工作组信息文件不包含在 strUser 中指定了其名称的用户。例如，您可以先调用 DeleteUser 子例程来确保这一点。<BR>请看以下代码：<BR>Private Function AddUser(ByVal strUser As String, _<BR>ByVal strPID As String, _<BR>Optional ByVal strPwd As String) As Boolean<BR>Dim catDB As ADOX.Catalog<BR><BR>On Error GoTo AddUser_Err<BR><BR>' 实例化 Catalog 对象。<BR>Set catDB = New ADOX.Catalog<BR>With catDB<BR>' 使用到当前数据库的连接打开<BR>' Catalog 对象。<BR>.ActiveConnection = CurrentProject.Connection<BR>' 创建新的用户帐户。<BR>.Users.Append strUser, strPwd, strPID<BR>' 向默认 Users 组追加新的用户帐户。<BR>.Groups("Users").Users.Append strUser<BR>End With<BR><BR>' 关闭 Catalog 对象。<BR>Set catDB = Nothing<BR><BR>AddUser = True<BR><BR>AddUser_Err:<BR>Msgbox Err.Number &amp; ":" &amp; Err.Description<BR>AddUser = False <BR>End Function<BR>该过程首先为 Catalog 对象声明一个变量，然后实例化该对象。<BR>注意：Catalog 对象是 Access 数据库文件中所有对象的容器。<BR>然后，该过程打开到当前数据库的连接，并使用来自调用过程的参数，将新用户追加到 Catalog 对象的 Users 集合中。然后新用户被追加到默认的 Users 组。Users 集合包含了在工作组信息文件中定义的数据库的所有用户。<BR>要删除现有用户，可以使用以下过程：<BR>Private Function DeleteUser(ByVal strUser As String) As Boolean<BR>Dim catDB As ADOX.Catalog<BR><BR>On Error GoTo DeleteUser<BR>' 实例化 Catalog 对象。<BR>Set catDB = New ADOX.Catalog<BR>With catDB<BR>' 在当前数据库中打开 Catalog 对象。<BR>.ActiveConnection = CurrentProject.Connection<BR>' 删除 strUser。<BR>.Users.Delete strUser<BR>End With<BR><BR>' 关闭 Catalog 对象。<BR>Set catDB = Nothing<BR><BR>DeleteUser = True<BR><BR>DeleteUser_Err:<BR>Msgbox Err.Number &amp; ":" &amp; Err.Description<BR>DeleteUser = False<BR>End Function<BR>此过程与前面的过程类似，只是使用了 Catalog 对象的 Delete 方法删除了在 strUser String 参数中指定的用户。<BR><BR>二．添加和删除组<BR><BR>添加组的过程与添加用户的过程类似。<BR>Private Function AddGroup(ByVal strGroup As String, _<BR>ByVal strPID As String) As Boolean<BR>Dim catDB As ADOX.Catalog<BR><BR>On Error GoTo AddGroup_Err<BR><BR>Set catDB = New ADOX.Catalog<BR>With catDB<BR>' 在当前数据库中打开 Catalog 对象。<BR>.ActiveConnection = CurrentProject.Connection<BR>' 创建新的组。<BR>&amp;160; .Groups.Append strGroup, strPID<BR>End With<BR><BR>' 关闭 Catalog 对象。<BR>Set catDB = Nothing<BR><BR>AddGroup = True<BR><BR>AddGroup_Err:<BR>Msgbox Err.Number &amp; ":" &amp; Err.Description<BR>AddGroup = False<BR>End Function<BR>此过程首先实例化 Catalog 对象，然后打开一个到当前数据库的连接。接下来，通过使用来自调用过程的参数，将新组追加到 Catalog 对象的 Groups 集合。<BR>要删除现有组，可以使用以下过程：<BR>Private Function DeleteGroup(ByVal strGroup As String) As Boolean<BR>Dim catDB As ADOX.Catalog<BR><BR>On Error GoTo DeleteGroup_Err<BR><BR>Set catDB = New ADOX.Catalog<BR>With catDB<BR>' 在当前数据库中打开 Catalog 对象。<BR>.ActiveConnection = CurrentProject.Connection<BR>' 删除 strGroup。<BR>.Groups.Delete strGroup<BR>End With<BR><BR>' 关闭 Catalog 对象。<BR>Set catDB = Nothing<BR><BR>DeleteGroup = True<BR><BR>DeleteGroup_Err:<BR>Msgbox Err.Number &amp; ":" &amp; Err.Description<BR>DeleteGroup = False<BR>End Function<BR>此过程与前面的过程类似，只是使用了 Catalog 对象的 Delete 方法删除了在 strGroup String 参数中指定的组。<BR><BR>下面我们来看看如何通过编程设置对数据库对象的权限。<BR><BR>三．通过编程设置权限<BR><BR>要对数据库中的各种对象设置权限，可以使用 Group 或 User 对象的 SetPermissions 方法。在下面的过程中，我们首先撤消组的所有权限，然后再赋予组特定的权限。这样可以确保该组只具有我们指定的权限：<BR>Private Function SetGroupPermissions(ByVal strGroup As String, _<BR>ByVal strTable As String, ByVal strObjectType As String, _<BR>ByVal strAction As String, _<BR>ByVal strRevokeEnum As String) As Boolean<BR>Dim catDB As ADOX.Catalog<BR><BR>On Error GoTo SetGroupPermissions_Err<BR><BR>Set catDB = New ADOX.Catalog<BR>With catDB<BR>' 在当前数据库中打开 Catalog 对象。<BR>.ActiveConnection = CurrentProject.Connection<BR>' 撤消组的所有权限。<BR>.Groups(strGroup).SetPermissions tblTable, _<BR>strObjectType, strAction, strRevokeEnum<BR><BR>' 赋予组特定的权限。<BR>.Groups(strGroup).SetPermissions tblTable, _<BR>strObjectType, strAction, _ <BR>adRightRead Or adRightInsert Or adRightUpdate<BR>End With<BR><BR>' 关闭 Catalog 对象。<BR>Set catDB = Nothing<BR><BR>SetGroupPermissions = True<BR><BR>SetGroupPermissions_Err:<BR>Msgbox Err.Number &amp; ":" &amp; Err.Description<BR>SetGroupPermissions = False <BR>End Function<BR>在当前数据库中打开一个 Catalog 对象后，我们使用了 Groups 集合的 SetPermissions 方法，撤消了该组对 Employees 表的所有权限。第一个参数是表的名称，第二个参数显示了对象的类型，这里是表。第三个参数指定了在设置权限时要执行的操作的类型，第四个参数是一个权限常数，指定了该组没有任何权限。我们已经撤消了该组对 Employees 表的所有权限，现在可以赋予其所希望的权限。<BR>下一个语句的前三个参数与前一个语句中的相同。第四个参数是通过使用 Or 运算符，组合不同的权限常数所创建的一个值。这里，我们赋予了读取、插入和更新该表的权限。<BR>要对指定类型（例如上述示例中的表）的所有新对象设置权限，请将用于赋予权限的语句中的第一个参数更改为 NULL 关键字。例如：<BR>...<BR>catDB.Groups(strGroup).SetPermissions NULL, adPermObjTable<BR>... <img src ="http://www.cnitblog.com/cyberfan/aggbug/1505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cyberfan/" target="_blank">cyberfan</a> 2005-08-12 12:53 <a href="http://www.cnitblog.com/cyberfan/articles/1505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在模块中创建、修改、查找、替换代码</title><link>http://www.cnitblog.com/cyberfan/articles/1503.html</link><dc:creator>cyberfan</dc:creator><author>cyberfan</author><pubDate>Fri, 12 Aug 2005 04:52:00 GMT</pubDate><guid>http://www.cnitblog.com/cyberfan/articles/1503.html</guid><wfw:comment>http://www.cnitblog.com/cyberfan/comments/1503.html</wfw:comment><comments>http://www.cnitblog.com/cyberfan/articles/1503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cyberfan/comments/commentRss/1503.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cyberfan/services/trackbacks/1503.html</trackback:ping><description><![CDATA[简 介：如何在模块中创建、修改、查找、替换代码<BR><BR>正 文：<BR><BR>第一步：在一个新mdb文件中，手动建立一模块，命名为：Create Code，复制下面的代码到模块中：<BR>Sub TestOpenDatabase()<BR>Dim DB As DAO.Database<BR>Set DB = CurrentDb<BR>MsgBox "The Database " &amp; DB.Name &amp; " opened successfully!"<BR>DB.Close<BR>End Sub<BR><BR>第二步：手动建立另一模块，命名为：CodeMaker，复制下面的代码到模块中：<BR>注意：必须引用DAO3.6<BR>Option Explicit<BR>Dim MyModule As Module<BR><BR>Sub MakeCode()<BR><BR>Dim strIndent As String, strText As String<BR><BR>' Create 4 spaces for code indent.<BR>strIndent = " "<BR><BR>' Build a string variable with the code to be written<BR>' to the new module.<BR>strText = "Sub TestOpenDatabase()" &amp; vbCrLf<BR>strText = strText &amp; strIndent &amp; "Dim DB As DAO.Database" &amp; vbCrLf<BR>strText = strText &amp; strIndent &amp; "Set DB = CurrentDB" &amp; vbCrLf<BR>strText = strText &amp; strIndent &amp; "MsgBox ""The Database "" &amp; " &amp; _<BR>"DB.Name &amp; "<BR>strText = strText &amp; strIndent &amp; strIndent &amp; """ opened " &amp; _<BR>"successfully!""" &amp; vbCrLf<BR>strText = strText &amp; strIndent &amp; "DB.Close" &amp; vbCrLf<BR>strText = strText &amp; "End Sub"<BR><BR>' Create a new Module.<BR>Application.RunCommand acCmdNewObjectModule<BR><BR>' Set MyModule to be the new Module Object.<BR>Set MyModule = Application.Modules.Item(Application.Modules.Count - 1)<BR>' Insert the code string into the new module.<BR>MyModule.InsertText strText<BR><BR>' Save, close, and rename the new Module as "Created Code."<BR><BR>DoCmd.Save acModule, MyModule<BR><BR>DoCmd.Close acModule, MyModule, acSaveYes<BR><BR>DoCmd.Rename "Created Code", acModule, MyModule<BR><BR>End Sub<BR><BR>第三步：保存模块代码<BR><BR>第四步：运行MakeCode子程序，将创建一个新模块Created Code,其代码与第一步的Create Code模块是一样的.<BR><BR>以上实现的是创建一个已有的模块。<BR><BR>同理，用下面的三个子程序实现搜索、替换、修改模块代码：<BR>Sub SearchCode()<BR>'搜索模块中的代码<BR>Dim StartLine As Long, StartColumn As Long<BR>Dim EndLine As Long, EndColumn As Long<BR><BR>' Open the Module you want to modify.<BR>DoCmd.OpenModule "Created Code"<BR><BR>' Set the Created Code Modules as the Object.<BR>Set MyModule = Application.Modules("Created Code")<BR><BR>' Search for string "DB.Close".<BR>If MyModule.Find("DB.Close", StartLine, StartColumn, _<BR>EndLine, EndColumn) Then<BR><BR>' If string is found, insert new line of code using the same<BR>' column indent.<BR>MyModule.InsertLines StartLine + 1, _<BR>String(StartColumn - 1, " ") &amp; "Set DB = Nothing"<BR>Else<BR>MsgBox "Text not found."<BR>End If<BR><BR>' Save and close the module.<BR>DoCmd.Save acModule, MyModule<BR>DoCmd.Close acModule, MyModule<BR><BR>End Sub<BR><BR>Sub ReplaceCode()<BR>'替换模块中的代码<BR>Dim StartLine As Long, StartColumn As Long<BR>Dim EndLine As Long, EndColumn As Long<BR><BR>' Open the Module you want to modify.<BR>DoCmd.OpenModule "Created Code"<BR><BR>' Set the Created Code Modules as the Object.<BR>Set MyModule = Application.Modules("Created Code")<BR><BR>' Search for string "Set DB =".<BR>If MyModule.Find("Set DB =", StartLine, StartColumn, EndLine, _<BR>EndColumn) Then<BR><BR>' If string is found, insert new line of code using the same<BR>' column indent.<BR>MyModule.ReplaceLine StartLine, String(StartColumn - 1, " ") &amp; _<BR>"Set DB = DBEngine.OpenDatabase(""C:\Program Files\" &amp; _<BR>"Microsoft Office\"" &amp; _" _<BR>&amp; vbCrLf &amp; " ""Office\Samples\Inventry.mdb"")"<BR><BR>Else<BR>MsgBox "Text not found."<BR>End If<BR><BR>' Save and close the module.<BR>DoCmd.Save acModule, MyModule<BR>DoCmd.Close acModule, MyModule, acSaveYes<BR><BR>End Sub<BR><BR>Sub ModifyCode()<BR>'修改模块中的代码<BR>Dim StartLine As Long, StartColumn As Long<BR>Dim EndLine As Long, EndColumn As Long<BR>Dim strLine As String, strNewLine As String<BR>Dim intChr As Integer, intBefore As Integer, intAfter As Integer<BR>Dim strLeft As String, strRight As String<BR>Dim strSearchText As String, strNewText<BR><BR>' The string you are searching for is:<BR>strSearchText = "Inventry.mdb"<BR><BR>' The replacement string is:<BR>strNewText = "Northwind.mdb"<BR><BR>' Open the Module you want to modify.<BR>DoCmd.OpenModule "Created Code"<BR><BR>' Set the Created Code Modules as the Object.<BR>Set MyModule = Application.Modules("Created Code")<BR><BR>' Search for string.<BR>If MyModule.Find(strSearchText, StartLine, StartColumn, EndLine, _<BR>EndColumn) Then<BR><BR>' Store text of line containing string.<BR>strLine = MyModule.Lines(StartLine, Abs(EndLine - StartLine) + 1)<BR><BR>' Determine length of line.<BR>intChr = Len(strLine)<BR><BR>' Determine number of characters preceding search text.<BR>intBefore = StartColumn - 1<BR><BR>' Determine number of characters following search text.<BR>intAfter = intChr - CInt(EndColumn - 1)<BR><BR>' Store characters to left of search text.<BR>strLeft = Left$(strLine, intBefore)<BR><BR>' Store characters to right of search text.<BR>strRight = Right$(strLine, intAfter)<BR><BR>' Construct string with replacement text.<BR>strNewLine = strLeft &amp; strNewText &amp; strRight<BR><BR>' Replace the original line.<BR>MyModule.ReplaceLine StartLine, strNewLine<BR><BR>Else<BR>MsgBox "Text not found."<BR>End If<BR><BR>' Save and close the module.<BR>DoCmd.Save acModule, MyModule<BR>DoCmd.Close acModule, MyModule, acSaveYes<BR><BR>End Sub <img src ="http://www.cnitblog.com/cyberfan/aggbug/1503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cyberfan/" target="_blank">cyberfan</a> 2005-08-12 12:52 <a href="http://www.cnitblog.com/cyberfan/articles/1503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在ACCESS2000中用ADO给组合框赋数据源</title><link>http://www.cnitblog.com/cyberfan/articles/1504.html</link><dc:creator>cyberfan</dc:creator><author>cyberfan</author><pubDate>Fri, 12 Aug 2005 04:52:00 GMT</pubDate><guid>http://www.cnitblog.com/cyberfan/articles/1504.html</guid><wfw:comment>http://www.cnitblog.com/cyberfan/comments/1504.html</wfw:comment><comments>http://www.cnitblog.com/cyberfan/articles/1504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cyberfan/comments/commentRss/1504.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cyberfan/services/trackbacks/1504.html</trackback:ping><description><![CDATA[一、问题重现：<BR>在ACCESS2003中，通过ADO打开一个远程表,用下面的代码给窗体的组合框赋上数据源：<BR>'前面代码省略<BR>........<BR>strSQL = "select * from tblTest"<BR>Set rst = New ADODB.Recordset<BR>rst.CursorLocation = adUseClient '本地游标<BR>rst.Open strSQL, strConn, adOpenDynamic, adLockOptimistic<BR>set me.组合框名称.Recordset = rst<BR><BR>在Access2000版中一试，发现不支持set me.组合框名称.Recordset = rst<BR><BR>二、解决方法：<BR>1、直接定义值列表<BR>这种方式如果行数过多，则不可行，最大长度为备注字段大小。<BR><BR>2、不使用组合框，而使用其他窗体进行录入，然后将选择结果回传到文本框<BR>这种方式将耗费大的编程时间，不合算<BR><BR>3、将查询结果生成为mdb中的临时表。<BR>这种方式相对于第2种方式更好一些，保存为临时表后，将组合框的数据源用临时表来赋上，当操作员关闭窗体时，将临时表删除。<BR><BR><BR><BR><BR><BR>4、用GetString方法解决，这是上述解决方法中的最佳解决方法(由zhuyiwen提供)，分隔符用分号";"。 <img src ="http://www.cnitblog.com/cyberfan/aggbug/1504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cyberfan/" target="_blank">cyberfan</a> 2005-08-12 12:52 <a href="http://www.cnitblog.com/cyberfan/articles/1504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>保持“原版格式” 创建便携式Word文档</title><link>http://www.cnitblog.com/cyberfan/articles/1501.html</link><dc:creator>cyberfan</dc:creator><author>cyberfan</author><pubDate>Fri, 12 Aug 2005 04:51:00 GMT</pubDate><guid>http://www.cnitblog.com/cyberfan/articles/1501.html</guid><wfw:comment>http://www.cnitblog.com/cyberfan/comments/1501.html</wfw:comment><comments>http://www.cnitblog.com/cyberfan/articles/1501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cyberfan/comments/commentRss/1501.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cyberfan/services/trackbacks/1501.html</trackback:ping><description><![CDATA[你在爱机上使用Word编辑了一篇精美文档，当在其他的电脑上打开该篇文档时，看到的却是另外一个样子。因为其他的电脑上可能没有你在文档中使用的字体，于是就用其他的字体将其替代了。由于不同的字体大小是有细微差别，这样就引起了版式的变化。怎么才能要让你的Word文档无论在哪台计算机或打印机上查看或打印时均能保持其原始模样呢，这就需要你创建一个"便携式"Word文档。 <BR><BR>保留版式和分页 <BR>　　在默认情况下，Word 文档的版式取决于字体。就是说，只要字体保持不变，任何人都可以按原始的版式查看并打印该文档。Word97以前的版本中创建的文档的版式由所使用的打印机内置的字体决定。如果希望文档版式与打印机无关，可以使Word按字体决定文档版式，方法是： <BR><BR>　　1.在"工具"菜单上，单击"选项"，然后单击"兼容性"选项卡； <BR><BR>　　2.在"选项"框中，清除"用打印机标准设计文档版式"复选框。 <BR><BR>　　该选项只影响在Word中处理文档时的显示方式，它不会对文档进行永久性修改。如果要恢复文档的原始版式，选中该选项。 <BR><BR>　　嵌入TrueType字体 <BR><BR>　　在创建或编辑文档时，如果使用了TrueType字体(TrueType字体是一种可以任意缩放大小，而不出现锯齿、毛边等失真现象。在Windows中90%的字体都是TrueType字体)，就可将其保存或"嵌入"文档。这样，其他人就能以其原始字体查看、修改和打印文档，即使他们的计算机上没有安装TrueType字体。 <BR><BR>　　有一点需要注意：嵌入字体的许可权由TrueType字体开发商决定。例如，有些字体不可以嵌入，而有些嵌入字体只能够查看和打印但不能修改。在文档中嵌入TrueType字体的方法是： <BR><BR>　　1.在"工具"菜单上单击"选项"，然后单击"保存"选项卡； <BR>　　2.选中"嵌入TrueType字体"复选框，单击"确定"按钮，保存文档。 <BR><BR>　　不过，嵌入TrueType字体会增大文档。同时选中"只嵌入所用字符"复选框，则只嵌入文档中使用的字体样式，这样文档的大小相对会小一些。 <BR>　　注意：选中"只嵌入所用字符"复选框后，编辑时就不能使用没有嵌入的字体字符和样式。 <BR><BR>　　指定替换字体 <BR><BR>　　在某些情况下，文档可能包含除TrueType字体外的其他字体。在查看文档时，如果计算机上未安装这些字体，可用与丢失的字体最接近的字体替换丢失字体： <BR><BR>　　1.打开文档； <BR>　　2.在"工具"菜单上，单击"选项"，然后セ?兼容性"选项卡； <BR>　　3.单击"字体替换"按钮，然后在"文档所缺字体"框中，单击要替换的字体，在"替换字体"框中单击用于替换缺失字体的字体。 <BR><BR>　　Word不替换缺失字体，只是用系统字体暂时替换缺失字体来改变在屏幕上显示和打印时的外观。点击"永久替换"按键就可以将缺失字体永久替换掉。 <BR>　　经过以上操作，"便携式"Word文档创建完毕，无论你在何处浏览或打印该文档，都能够保持其原始外观。 <img src ="http://www.cnitblog.com/cyberfan/aggbug/1501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cyberfan/" target="_blank">cyberfan</a> 2005-08-12 12:51 <a href="http://www.cnitblog.com/cyberfan/articles/1501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Word 长文件死机的处理</title><link>http://www.cnitblog.com/cyberfan/articles/1502.html</link><dc:creator>cyberfan</dc:creator><author>cyberfan</author><pubDate>Fri, 12 Aug 2005 04:51:00 GMT</pubDate><guid>http://www.cnitblog.com/cyberfan/articles/1502.html</guid><wfw:comment>http://www.cnitblog.com/cyberfan/comments/1502.html</wfw:comment><comments>http://www.cnitblog.com/cyberfan/articles/1502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cyberfan/comments/commentRss/1502.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cyberfan/services/trackbacks/1502.html</trackback:ping><description><![CDATA[有时候，当我们在处理Word 长文件时，会遇到这样的情况：文件能够在Word 中打开，但在翻页、浏览时突然死机，这种死机一般是文件代码出现错误引起的。 <BR>遇到这种情况，先用组合键"Ctrl＋ Alt ＋ Del"关闭Word 或重新启动机器，然后用Word 重新打开这份文件，记住，此时不要进行浏览等操作。单击"文件"菜单栏，选择"另存为"命令，在弹出对话框中"保存类型"组合框下拉列表中选"纯文本"，再单击"保存"按钮。另存后，文件原有的格式信息会丢失，但大部分文本内容能够得以保留。 <BR>然后，关闭当前文件，打开刚才保存的"纯文本"文件，利用"格式"工具栏中的"样式"组合框和格式刷等工具，重建文件格式。在处理中，会遇到一些乱码，这就是造成死机的"祸根"，它一般都是表格。这种由表格造成的乱码，一般情况下，用常规技术是很难恢复的，只有删掉之后，重新调整表格方面的格式。 <img src ="http://www.cnitblog.com/cyberfan/aggbug/1502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cyberfan/" target="_blank">cyberfan</a> 2005-08-12 12:51 <a href="http://www.cnitblog.com/cyberfan/articles/1502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PowerPoint中插入Flash动画的方法</title><link>http://www.cnitblog.com/cyberfan/articles/1499.html</link><dc:creator>cyberfan</dc:creator><author>cyberfan</author><pubDate>Fri, 12 Aug 2005 04:50:00 GMT</pubDate><guid>http://www.cnitblog.com/cyberfan/articles/1499.html</guid><wfw:comment>http://www.cnitblog.com/cyberfan/comments/1499.html</wfw:comment><comments>http://www.cnitblog.com/cyberfan/articles/1499.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cyberfan/comments/commentRss/1499.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cyberfan/services/trackbacks/1499.html</trackback:ping><description><![CDATA[PowerPoint因其通俗易懂、容易上手而成为老师们制作课件的常用工具，而Flash是目前比较流行的动画制作软件，有时在PowerPoint课件中为了更形象地说明问题，希望可以插入Flash动画。 <BR><BR>以前看过看在PowerPoint中插入Flash动画的文章，基本方法是选择菜单"工具→控件工具箱→Shockwave Flash Object"，然后在地址栏位置输入Fla <BR>sh动画文件的路径。这种插入Flash动画的方法有一个缺点是在播放幻灯片时，Flash动画会自动播放，不能自主地控制。 <BR>　　近日，发现在PowerPoint中插入Flash动画的另一种方法，可以避免出现自动播放动画的情况。 <BR>　　1、先打开一幻灯片，选择"插入→对象"，在出现的对话框中选择单选框"由文件创建"，这时对话框要求填入文件的位置，单击[浏览]，选中需要插入的Flash动画文件，最后单击[确定]返回幻灯片。 <BR>　　2、这时，在幻灯片上就出现了一个Flash文件的图标，我们可以更改图标的大小或者移动它的位置，然后在这图标上右击鼠标，选中"动作设置"。在"单击鼠标时的动作"中选中"超级链接到"，然后在下拉列表中选择"其他文件"。 <BR>　　3、这时在出现的超链接对话框中输入与之相对应的动画文件，单击[确定]，设置完成。 <BR><BR>　　现在我们来播放幻灯片，Flash动画没有自动播放，我们需用鼠标点击这个Flash文件图标，这时会出现一个对话框，我们单击[确定]，此时才会播放动画，不需要时直接单击[关闭]按钮即可。 <BR><BR>　　小提示：后来我发现这种方法也有它的缺陷，那就是不能设置它的播放区域，总是一播放就是原文件的大小，有时就把其他的内容给遮住了，所以您要用的时候要看好是不是符合自己的需要。 <img src ="http://www.cnitblog.com/cyberfan/aggbug/1499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cyberfan/" target="_blank">cyberfan</a> 2005-08-12 12:50 <a href="http://www.cnitblog.com/cyberfan/articles/1499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>七招挽回受损WORD文档</title><link>http://www.cnitblog.com/cyberfan/articles/1500.html</link><dc:creator>cyberfan</dc:creator><author>cyberfan</author><pubDate>Fri, 12 Aug 2005 04:50:00 GMT</pubDate><guid>http://www.cnitblog.com/cyberfan/articles/1500.html</guid><wfw:comment>http://www.cnitblog.com/cyberfan/comments/1500.html</wfw:comment><comments>http://www.cnitblog.com/cyberfan/articles/1500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cyberfan/comments/commentRss/1500.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cyberfan/services/trackbacks/1500.html</trackback:ping><description><![CDATA[在你试图打开一个Word文档时，如果系统没有响应，那么可能的原因是该文档已经损坏。此时，请试试以下所述方法，或许能够挽回你的全部或部分损失。 <BR><BR>一、自动恢复尚未保存的修改 <BR>Word提供了"自动恢复"功能，可以帮助用户找回程序遇到问题并停止响应时尚未保存的信息。实际上，在你不得不在没有保存工作成果就重新启动电脑和Word后，系统将打开"文档恢复"任务窗格，其中列出了程序停止响应时已恢复的所有文件。文件名后面是状态指示器，显示在恢复过程中已对文件所做的操作，其中："原始文件"指基于最后一次手动保存的源文件；"已恢复"是指在恢复过程中已恢复的文件，或在"自动恢复"保存过程中已保存的文件。 <BR>"文档恢复"任务窗格可让你打开文件、查看所做的修复以及对已恢复的版本进行比较。然后，你可以保存最佳版本并删除其他版本，或保存所有打开的文件以便以后预览。不过，"文档恢复"任务窗格是Word XP提供的新功能，在以前的版本中，Word将直接把自动恢复的文件打开并显示出来。 <BR><BR>二、手动打开恢复文件 <BR>在经过严重故障或类似问题后重新启动Word时，程序自动任何恢复的文件。如果由于某种原因恢复文件没有打开，你可以自行将其打开，操作步骤如下： <BR>1． 在"常用"工具栏上，单击"打开"按钮； <BR>2． 在文件夹列表中，定位并双击存储恢复文件的文件夹。对于Windows 2000/XP操作系统，该位置通常为"C:\documents and settings\yourname\Application Data\Microsoft\Word"文件夹；对于Windows 98／Me操作系统，该位置通常为"C:\ Windows\Application Data\Microsoft\Word"文件夹； <BR>3． 在"文件类型"框中单击"所有文件"。每个恢复文件名称显示为"‘自动恢复'保存file name"及程序文件扩展名； <BR>4． 单击要恢复的文件名，然后单击"打开"按钮。 <BR><BR>三、"打开并修复"文件 <BR>Word XP提供了一个恢复受损文档的新方法，操作步骤如下： <BR>1． 在"文件"菜单上，单击"打开"命令； <BR>2． 在"查找范围"列表中，单击包含要打开的文件的驱动器、文件夹或Internet位置； <BR>3． 在文件夹列表中，定位并打开包含文件的文件夹； <BR>4． 选择要恢复的文件； <BR>5． 单击"打开"按钮旁边的箭头，然后单击"打开并修复"。 <BR><BR>四、从任意文件中恢复文本 <BR>Word提供了一个"从任意文件中恢复文本"的文件转换器，可以用来从任意文件中提取文字。要使用该文件转换器恢复损坏文件中的文本，操作步骤如下： <BR>1． 在"工具"菜单上，单击"选项"命令，再单击"常规"选项卡； <BR>2． 确认选中"打开时确认转换"复选框，单击"确定"按钮； <BR>3． 在"文件"菜单上，单击"打开"命令； <BR>4． 在"文件类型"框中，单击"从任意文件中恢复文本"。如果在"文件类型"框中没有看到"从任意文件中恢复文本"，则需要安装相应的文件转换器。安装方法不做赘述； <BR>5． 像通常一样打开文档。 <BR>此时，系统会弹出"转换文件"对话框，请选择的需要的文件格式。当然，如果要从受损Word文档中恢复文字，请选择"纯文本"，单击"确定"按扭。不过，选择了"纯文本"，方式打开文档后，仅能恢复文档中的普通文字，原文档中的图片对象将丢失，页眉页脚等非文本信息变为普通文字。 <BR><BR>五、禁止自动宏的运行 <BR>如果某个Word文档中包含有错误的自动宏代码，那么当你试图打开该文档时，其中的自动宏由于错误不能正常运行，从而引发不能打开文档的错误。此时，请在"Windows资源管理器"中，按住Shift键，然后再双击该Word文档，则可阻止自动宏的运行，从而能够打开文档。 <BR><BR>六、创建新的Normal模板 <BR>Word在Normal.dot模板文件中存储默认信息，如果该模板文件被损坏，可能会引发无法打开Word文档的错误。此时，请创建新的Normal模板，操作步骤如下： <BR>1． 关闭Word； <BR>2． 使用Windows"开始"菜单中的"查找"或"搜索"命令找到所有的Normal.dot文件，并重新命名或删除它们。比如，在Windows XP中，请单击"开始"，再单击"搜索"，然后单击"所有文件和文件夹"，在"全部或部分文件名"框中，键入"normal.dot"，在"在这里寻找"列表框中，单击安装Word的硬盘盘符，单击"搜索"按钮。查找完毕，右键单击结果列表中的"Normal"或"Normal.dot"，然后单击"重命名"命令，为该文件键入新的名称，例如"Normal.old"，然后按Enter键； <BR>3． 启动Word <BR>此时，由于Word无法识别重命名后的Normal模板文件，它会自动创建一个新的Normal模板。 <BR><BR>七、显示混乱的解决 <BR>在你使用上述方法打开受损Word文档后，如果文档的内容显示混乱，那么你可以将最后一个段落标记之外的所有内容复制到一个新文档中，或许能够解决乱码问题，操作步骤如下： <BR>1． 选定最后一个段落标记之外的所有内容，方法是：按下Crtl+Home组合键，然后按下Crtl+Shift+End组合键，最后按下Shift+← 组合键； <BR>2． 在"常用"工具栏上，依次单击"复制"、"新建"和"粘贴"按钮。 <BR>实际上，在Word文档中，系统用最后一个段落标记关联各种格式设置信息，特别是节与样式的格式设置。如果将最后一个段落标记之外的所有内容复制到新文档，就有可能将损坏的内容留在原始文档中，而在新文档中，重新应用所有丢失的节或样式的格式设置。 <img src ="http://www.cnitblog.com/cyberfan/aggbug/1500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cyberfan/" target="_blank">cyberfan</a> 2005-08-12 12:50 <a href="http://www.cnitblog.com/cyberfan/articles/1500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>制作Word内置对话框宏</title><link>http://www.cnitblog.com/cyberfan/articles/1498.html</link><dc:creator>cyberfan</dc:creator><author>cyberfan</author><pubDate>Fri, 12 Aug 2005 04:49:00 GMT</pubDate><guid>http://www.cnitblog.com/cyberfan/articles/1498.html</guid><wfw:comment>http://www.cnitblog.com/cyberfan/comments/1498.html</wfw:comment><comments>http://www.cnitblog.com/cyberfan/articles/1498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cyberfan/comments/commentRss/1498.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cyberfan/services/trackbacks/1498.html</trackback:ping><description><![CDATA[如果需要在Word 2000/2002中反复进行某项工作，就可以利用宏来自动完成这项工作。宏是一系列组合在一起的 Word 命令和指令，它们形成了一个命令，以实现任务执行的自动化，也就是说宏就是一条自定义的命令。<BR><BR>　　我们可以创建并执行宏，以替代人工进行的一系列费时而单调的重复性 Word 操作，自动完成任务。我们可以用宏录制器和“Visual Basic 编辑器”两种方法来创建一个宏。 <BR>　　对于一般的宏，只要用宏录制器录制即可。而有VB编程基础的用户还可以用“Visual Basic 编辑器”对已录制好的宏进行修改甚至直接用“Visual Basic 编辑器”创建新宏。 <BR><BR>　　本来宏是用来加速日常操作的，单独的操作步骤没有制作宏的必要。但是现在各种各样的计算机考试会有一些特殊的要求，要求学生创建有一定难度的宏。笔者在辅导学生参加劳动部全国计算机及信息高新技术考试中的《办公软件应用》模块（操作员级）时就碰到了这样的问题，题目要求新建一个名为A8-A.DOC的文件，并在其中用对话框来创建一个名为A8B1的宏，使用“Alt+Shift+Z”作为快捷键，显示选定内容的字数。学生在做这道题时，按以往录制宏的方法，新建文件→录入任意文本→选择文本→录制新宏→选择“工具”的“字数统计”命令→关闭对话框→停止录制宏，一路做下来。本以为已经轻松搞定，可是试运行竟然没有反应，调出“Visual Basic 编辑器”查看宏代码，宏的内容是空的。Word的录制宏操作并不能捕获类似只显示一下对话框这样的操作。 <BR><BR>　　有两种方法可以实现本题的要求，下面分别加以说明。 <BR><BR>　　方法一： <BR><BR>　　1.新建一个文件，在考生文件夹中保存为“A8-A.DOC”，随意录入一些文本并选定； <BR><BR>　　2.单击“工具”菜单→“宏” →“录制新宏”，弹出“录制宏”对话框，如图1<BR>。 <BR><BR>　　3.在“宏名”框中输入“A8B1”，从“将宏保存在”的下拉列表框中选择当前文档“A8-A.DOC”，单击“将宏指定到”栏中的“键盘”按钮，弹出“自定义键盘”对话框； <BR><BR>　　4.从“将修改保存在”的下拉列表中选择当前文档“A8-A.DOC”，在“请按新快捷键”输入框单击，按“Alt+Shift+Z”键，再单击“指定”按钮，单击“关闭”按钮关闭“自定义键盘”对话框，开始录制宏； <BR><BR>　　5.单击菜单“工具” →“宏” →“宏”，弹出“宏”对话框； <BR><BR>　　6.从“宏的位置”下拉列表中选择“Word命令”，然后在上方的列表框中选择“ToolsWordCount”，再单击“运行”按钮，弹出“字数统计”对话框，单击“取消”按钮取消该对话框； <BR><BR>　　7.单击工具栏中的“停止录制”按钮，结束宏的录制； <BR><BR>　　8.测试宏，无误后保存文件。 <BR><BR>方法二： <BR>　　1.按方法一的第1~4步操作； <BR><BR>　　2.按方法一的第7步停止录制宏（这两步是为宏指定快捷键）； <BR><BR>　　3.单击“工具”菜单→“宏” →“宏”，在弹出的宏对话框左边宏列表中选择A8B1，再单击“编辑”按钮，打开“Visual Basic 编辑器”，如图2。<BR><BR>　　4.在“endsub”行之前输入“DialogswdDialogToolsWordCount　.Show”，关闭“Visual Basic 编辑器”窗口； <BR><BR>　　5.测试宏，并保存文件。 <BR><BR>　　总结：从效果来看，这两种方法都达到了题目要求。但是我们查看方法一的VBA代码，其内容是Application.Run MacroName=″ToolsWordCount″，含义是运行名为“ToolsWordCount”的VB宏，其实该宏是一个Word命令，我们在录制此宏时已经看到，还可以运行其它任何Word 命令；方法二的“DialogswdDialogToolsWordCount　.Show”一句是使用Dialogs对象集的Show方法来显示“字数统计”这个Word内置对话框。我们还可用此法显示其它任一Word内置对话框。笔者认为两种方法应该都是正确的。 <img src ="http://www.cnitblog.com/cyberfan/aggbug/1498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cyberfan/" target="_blank">cyberfan</a> 2005-08-12 12:49 <a href="http://www.cnitblog.com/cyberfan/articles/1498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VBA在报表开发中的应用</title><link>http://www.cnitblog.com/cyberfan/articles/1495.html</link><dc:creator>cyberfan</dc:creator><author>cyberfan</author><pubDate>Fri, 12 Aug 2005 04:47:00 GMT</pubDate><guid>http://www.cnitblog.com/cyberfan/articles/1495.html</guid><wfw:comment>http://www.cnitblog.com/cyberfan/comments/1495.html</wfw:comment><comments>http://www.cnitblog.com/cyberfan/articles/1495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cyberfan/comments/commentRss/1495.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cyberfan/services/trackbacks/1495.html</trackback:ping><description><![CDATA[一、引言 <BR><BR>MRPII/ERP（Enterprise Resource Planning）企业资源计划系统，是指建立在信息技术基础上，以系统化的管理思想，为企业决策层及员工提供决策运行手段的管理平台。它在企业资源最优配置的前提下，整合企业所有的资源和所有的经营活动，包括供应与销售、生产计划、物料管理、财务会计等主要模块，以达到高效率经营的目标。<BR><BR>VBA (Visual Basic For Application),一种通用的自动化语言。VBA必须寄生于已有的应用程序(如Excel)。<BR><BR>我公司推行的MRPII/ERP是我公司的重点工程，该项目从立项到实施受到公司领导的高度重视，该项目的实施将增强我公司的企业管理水平和提高企业的竞争力。我们引进的是荷兰BAAN公司 的软件，由于它立足于制造业，特别适合我公司，但它的报表系统是以欧洲的商业需求作为模型，它与中国传统的报表系统具有很大的区别。因此，在实施过程中报表客户化工作显得尤其迫切。由于BAAN提供的报表开发工具在开发某些特殊要求的报表时显得有些欠缺，因此，借助第三方开发工具Excel/VBA灵活方便的特点进行报表开发已是势在必行。它的开发将为公司MRPII/ERP系统的成功实施起着巨大的推动作用。<BR><BR>二、方案选择<BR><BR>在充分满足用户对报表的要求前提下，本着安全可靠、界面友好、操作方便等特点对报表进行开发，制定各种解决方案，确定出报表开发最佳的解决方法。<BR><BR>我们采用了三种方案进行比较： <BR><BR>1、借用BAAN的工具子系统进行报表开发。<BR><BR>2、利用BAAN提供的类和应用对象连接数据查询，通过调用第三方开发工具进行处理。我们采用VBA进行开发。<BR><BR>3、通过ODBC或数据库的专用接口联结数据库，再采用第三方开发工具开发。<BR><BR>下面重点讨论一下各种方案的优缺点：<BR><BR>方案一<BR>方案二<BR>方案三<BR><BR>名称<BR>借用BAAN的工具子系统进行报表开发<BR>借用EXCEL/VBA进行二次开发<BR>ODBC进行二次开发<BR><BR>优点<BR>1、方便、灵活、运行速度快、集成度高、界面友好。 <BR><BR>2、安全可靠。它的安全直接由BAAN的授权决定。<BR>1、报表格式多样。多栏打印宽度无局限。 <BR><BR>2、数据取出后利用EXCEL的方法和功能进行处理。<BR>1、报表格式多样。多栏打印宽度无局限。<BR><BR>2、数据取出后通过第三方工具编码灵活多样。<BR><BR>缺点<BR>报表的宽度有限。对有特殊要求的多栏打印有局限。<BR>1、还要在BAAN中作相关处理，且灵活性差。每个用户都必须重新编码和配置。<BR><BR>2、安全授权要在BAAN中限制，处理速度相对较慢。 <BR>1、用户配置繁琐。<BR><BR>2、安全授权要在后台数据库中限制。且ODBC为安全有隐患。<BR><BR>难点<BR>需要熟悉3GL、4GL语言编程和BAAN报表开发工具<BR>熟悉SQL查询、BAAN相关函数的功能和VBA编程。<BR>需要熟悉SQL查询和相应的第三方开发工具的编程方法。<BR><BR>通过以上几个方案的比较，本着安全、快速、高效的原则。我们决定选择第一、二种方案作为本项目的突破点并进行BAAN的报表系统的开发与客户化工作。<BR><BR>三、实现步骤<BR><BR>本文着重介绍一下采用第二种方案解决问题的实现方法。我们采用目前主流编程工具和BAAN系统提供的DLL库函数将有关数据外接于外部开发。利用 Excel的报表功能强大，内置大量函数，用户对EXCEL界面熟悉等特点，使用VBA编程工具内嵌于EXCEL使其自动化，进行方便灵活地编制各种格式的报表。<BR><BR>1、首先，利用BAAN提供的工具查询，使用SQL语句将所需数据从后台数据库查询出来.<BR><BR>2、然后在EXCEL中打开新工作簿，确认其他工作簿已经关闭。选择“工具“à “宏”à “Visual basic 编辑器”(注：“宏”，指一系列EXCEL能够执行的VBA语句。) <BR><BR>3、在VBA编辑器的左面，可以看到“工程资源管理器”窗口。在工程资源管理器窗口的“Thisworkbook"上单击鼠标右键，选择“插入”--- &gt;“模块”，这样就将一个模块添加到应用程序中了。(如果你没有看见“工程资源管理器”窗口，可以按Ctrl+R),在模块中写入一系列实现报表要求的VBA语句。<BR><BR>首先激活Baan系统的应用程序，然后连接Baan 系统中的工具查询，将数据读出，下面是做一张财务现金流量表的一个例子中的典型语句：<BR><BR>Set BaanObject = CreateObject("Baan4.Application") ‘激活Baan系统的应用程序 ThisWorkbook.Sheets("现金流量表（已）").Activate<BR><BR>Worksheets("现金流量表（已）").Range("a:s").Clear<BR><BR>BaanObject.Timeout = 30<BR><BR>On Error GoTo BaanAutomationError<BR><BR>QueryName = "wlxjllb" ' Baan 系统中的工具查询的名称 (物流现金流量表)<BR><BR>TempFunction = "easysql_to_olesql(" &amp; Chr(34) &amp; QueryName &amp; Chr(34) &amp; ", " &amp; Chr(34) &amp; String(800, " ") &amp; Chr(34) &amp; ")"<BR><BR>BaanObject.ParseExecFunction "ottdllsql_query", TempFunction<BR><BR>TempString = BaanObject.FunctionCall<BR><BR>Query = Mid(TempString, 30, Len(TempString) - 29) ' get query result from functioncall string<BR><BR>TempFunction = "olesql_parse(" &amp; Chr(34) &amp; Query &amp; Chr(34) &amp; ")"<BR><BR>BaanObject.ParseExecFunction "ottdllsql_query", TempFunction<BR><BR>QueryId = BaanObject.ReturnValue<BR><BR>If QueryId = 0 Then<BR><BR>MsgBox "Error: " &amp; Query<BR><BR>GoTo BaanAutomationError<BR><BR>End If<BR><BR>Tempsequent = "tfgld106.leac" '科目<BR><BR>sern1 = String(12, " ")<BR><BR>TempFunction2 = "olesql_getstring(" &amp; Chr(34) &amp; Tempsequent &amp; Chr(34) &amp; "," &amp; Chr(34) &amp; sern1 &amp; Chr(34) &amp; ")"<BR><BR>BaanObject.ParseExecFunction "ottdllsql_query", TempFunction2<BR><BR>TempString = BaanObject.FunctionCall<BR><BR>sern1 = Mid(TempString, 35, 12)<BR><BR>Tempsequent = "tfgld106.dbcr" '借贷<BR><BR>sern2 = String(2, " ")<BR><BR>TempFunction3 = "olesql_getstring(" &amp; Chr(34) &amp; Tempsequent &amp; Chr(34) &amp; "," &amp; Chr(34) &amp; sern2 &amp; Chr(34) &amp; ")"<BR><BR>BaanObject.ParseExecFunction "ottdllsql_query", TempFunction3<BR><BR>TempString = BaanObject.FunctionCall<BR><BR>sern2 = Mid(TempString, 35, 1)<BR><BR>将取出的数据使用worksheets()函数，根据报表要求写入相应的单元格中：<BR><BR>例：For i = 1 To 4 '给各单元格赋值<BR><BR>Worksheets("现金流量表（已）").Cells(Row + i, Column) = flowininter(i) - flowoutinter(i)<BR><BR>Worksheets("现金流量表（已）").Cells(Row + i, Column + 1) = flowinouter(i) - flowoutouter(i)<BR><BR>Worksheets("现金流量表（已）").Cells(Row + i, Column + 2) = flowininter(i) - flowoutinter(i) + flowinouter(i) - flowoutouter(i)<BR><BR>Next I<BR><BR>下图是利用第二种方案将Baan 中数据外接后，再利用Eexcel/Vba 开发成的物流现金流量表报表格式： <BR><BR>四、结束语<BR><BR>利用Excel的报表功能强大，内置大量函数，用户对Excel界面熟悉等特点，使用VBA编程工具内嵌于Excel使其自动化，开发出适合我公司需求的计划、生产、财务各种报表30余种，不仅缩短了开发时间、节约了经费，而且保证了系统的安全可靠。 <img src ="http://www.cnitblog.com/cyberfan/aggbug/1495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cyberfan/" target="_blank">cyberfan</a> 2005-08-12 12:47 <a href="http://www.cnitblog.com/cyberfan/articles/1495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>