使用 vbscript 填充预先存在的 Excel 表单

Posted

技术标签:

【中文标题】使用 vbscript 填充预先存在的 Excel 表单【英文标题】:Filling pre-exisitng Excel form using vbscript 【发布时间】:2016-10-05 15:39:49 【问题描述】:

运行一个旧的经典 ASP 站点,到目前为止,我用 html 制作了自己的“Excel”文件,该文件被发送到我们的会计部门。他们已经修改了他们希望我们使用的 Excel 文件,所以我不能使用我的旧方法。所以我直接连接到excel文件(ADODB),我可以很容易地更新必要的单元格。问题是他们在“表单”底部添加了一些字段,包括一些带有 SUM() 公式的字段,并在中间留下了 34 行条目。我们往往需要更多。

我尝试过“插入”sql,并尝试过“rs.AddNew”,它们都将数据放入我目标范围以下的行中;很公平。但是新行没有添加到文件中 - 数据进入下面的行。这不像在 Excel 中手动插入一行,然后将任何较低的行向下推。有谁知道我如何通过 ADO/SQL 做到这一点?还是根本不可能?

作为最后的手段,我只需要创建一个额外的文档来保存超过 34 个条目的溢出。

谢谢!

我终于找到了reflects my problem的东西,但它是VBA(我认为):

Const xlDown = -4121

Set objExcel = CreateObject(“Excel.Application”)

objExcel.Visible = True


Set objWorkbook = objExcel.Workbooks.Open(“C:\Scripts\Test.xls”)

Set objWorksheet = objWorkbook.Worksheets(1)


Set objRange = objExcel.Range(“A1”)

objRange.End(xlDown).Activate


intRow = objExcel.ActiveCell.Row

intColumn = objExcel.ActiveCell.Column

Set objRange = objWorksheet.Cells(intRow, intColumn).EntireRow


For i = 1 to 10

    objRange.Insert(xlShiftDown)

Next


For i = 1 to 10

    objExcel.Cells(intRow, 1).Value = i

    intRow = intRow + 1

Next


strFormula = “=SUM(A1:A” & intRow – 1 & “)”

objExcel.Cells(intRow, 1).Formula = strFormula

有什么方法可以在 VBscript 中的服务器上进行这项工作??? :-)

【问题讨论】:

ADODB 不会扩展它的行。您可以添加行,但您需要从 new 连接重新查询(即不仅仅是从现有连接重新查询)才能访问它们。见google.com.au/… 我不需要在 Excel 文件中重新查询。我正在创建一个一次性文件,通过电子邮件发送给我们的会计部门,他们使用 SAP 来提取数据。我唯一的问题是,例如,如果我们有 45 个事务要添加到 Excel 文件中,“他们”只为这些数据放入 34 行。现在,如果我手动编辑文件,我可以根据需要插入额外的行。但是我的脚本为 5 个不同的部门执行此操作,并且我正在尝试将其自动化。 ;-) 您可以在末尾插入行,但需要重新查询新连接才能访问它们。 对不起,Noodles,我解释得不对,因为我不需要再次访问它们。我需要插入它们,但我打算插入它们的位置是在其他信息的行中间。会计部门在其“表格”中容纳 34 行;如果我的数据行多于 34 行,我需要在一些具有公式的单元格上方插入(如创建)它们。到目前为止,我还没有找到用 ADODB 做到这一点的方法。而且可能没有办法。我希望清除我不需要再次查询文件。 我明白了。我在说什么是可能的。我正在解释 ADODB 和 Excel 的局限性。如果您想要对文件进行有限控制,请使用 COM。 ADODB 用于访问数据库(表格)而不是电子表格(临时组织),因此它将电子表格视为数据库,因此它们应该只是表格。 【参考方案1】:

由于您无法使用 ADO 执行此操作(最终会覆盖您的公式),您需要直接访问工作簿。您找到的代码很接近,但下面的内容应该适合您的需求。如果您需要任何进一步的解释,请告诉我?

Option Explicit

Const xlDown = -4121
Const xlUp = -4162

Dim objExcel, objWorkbook, objRange, iLastRow, myRecordCount, numInserts, intLoop

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True

Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls")
Set objWorksheet = objWorkbook.Worksheets(1) ' refers to first worksheet

iLastRow = objWorksheet.Cells(objWorksheet.Rows.Count, 1).End(xlUp).Row

Set objRange = objWorksheet.Cells(iLastRow, 1).EntireRow

' myRecordCount will need to hold the number of records you have
If myRecordCount > 34 Then 
    numInserts = myRecordCount - 34 ' get the number of rows to be inserted
Else
    numInserts = 0
End If

For intLoop = 1 to numInserts
    ' for as many rows as we need, insert above the formula
    objRange.Insert(xlShiftDown)
Next

' insert your data into the worksheet here

objWorkbook.Save
objWorkbook.Close
objExcel.Quit

' send the file out however you're sending it

【讨论】:

谢谢,戴夫。我会试试看 - 我想知道 CreateObject("Excel.Application"),因为代码在我的学校董事会运行的网络服务器上,如果没有安装 Excel,我不会感到惊讶。

以上是关于使用 vbscript 填充预先存在的 Excel 表单的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何将 LoopBack 框架应用程序连接到预先存在的/数据填充的 MySQL 数据库/数据源?

使用Springboot进行表单管理 - 当用户选择预先输入时自动填充表单

vbscript 使用节点根据模板批量生成文件并使用VBScript自动填写excel

如何将预先存在的 sqlite 文件放入 <Application_Home>/Library/?

MS Access VBA 修改 Excel 工作表而不写入 Drive

如何最好地使用 php 预先填充单选按钮选择?