Заполнение существующей формы Excel с помощью vbscript

#sql #excel #vbscript #adodb #jscript

#sql #excel #vbscript #adodb #jscript

Вопрос:

Запуск старого классического сайта ASP, и до сих пор я создавал свой собственный файл «Excel» с HTML, который отправляется в наш бухгалтерский отдел. Они пересмотрели файл Excel, который они хотят, чтобы мы использовали, поэтому я не могу использовать свой старый метод. Итак, я подключаюсь к файлу Excel напрямую (ADODB), и я могу достаточно легко обновить необходимые ячейки. Проблема в том, что они добавили некоторые поля в нижней части «формы», в том числе некоторые с формулами SUM (), и оставили 34 строки для записей в середине. Нам часто нужно больше, чем это.

Я пробовал «вставить в» sql и пробовал «rs.AddNew», и оба они помещают данные в строку ниже диапазона, на который я ориентируюсь; достаточно справедливо. Однако НОВАЯ СТРОКА не добавляется в файл — данные переходят в строку ниже. Это не то же самое, что вручную вставить строку в Excel и переместить все нижние строки дальше вниз. Кто-нибудь знает, как я могу это сделать через ADO / SQL? Или это просто невозможно?

В качестве последнего средства мне просто нужно будет создать дополнительный документ для хранения переполнения после 34 записей.

Спасибо!

Я наконец нашел что-то, что отражает мою проблему, но это VBA (я думаю):

 Const xlDown = -4121

Set objExcel = CreateObject(“Excel.Application”)

objExcel.Visible = True


Set objWorkbook = objExcel.Workbooks.Open(“C:ScriptsTest.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” amp; intRow – 1 amp; “)”

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

Есть ли способ заставить это работать на сервере в VBScript ??? 🙂

Комментарии:

1. ADODB не будет расширять свои строки. Вы можете добавлять строки, но Вам нужно запрашивать из нового соединения (т. Е. Не Просто Запрашивать из существующего), чтобы иметь к ним доступ. См. google.com.au /…

2. Мне не нужно будет запрашивать в файле Excel. Я создаю одноразовый файл, который отправляется по электронной почте в нашу бухгалтерию, и они используют SAP для извлечения данных. Моя единственная проблема заключается в том, что если, например, у нас есть 45 транзакций для добавления в файл Excel, «они» помещают только 34 строки для этих данных. Теперь, если бы я редактировал файл вручную, я мог бы вставлять дополнительные строки по мере необходимости. Но мой скрипт делает это для 5 разных отделов, и я пытаюсь его автоматизировать. 😉

3. Вы можете вставлять строки в конце, но для доступа к ним необходимо запросить новое соединение.

4. Извините, Лапша, я неправильно это объясняю, потому что мне не нужно обращаться к ним снова. Мне нужно вставить их, но там, где я должен их вставить, находится в середине строк с другой информацией. Бухгалтерия вмещает 34 строки в своей «форме»; если у меня больше строк данных, чем 34, мне нужно вставить (как в create) их НАД некоторыми ячейками, в которых есть формулы. До сих пор я не нашел способа сделать это с помощью ADODB. И может не быть способа. Я надеюсь, что это прояснит, что мне не нужно снова запрашивать файл.

5. Я понимаю. Я говорю, что возможно. Я объясняю ограничения ADODB и Excel. Используйте COM, если вам нужен более чем ограниченный контроль над файлом. ADODB предназначен для доступа к базам данных (таблицам), а не к электронным таблицам (организация adhoc), поэтому он обрабатывает электронные таблицы как базы данных, поэтому они должны быть ТОЛЬКО таблицами.

Ответ №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:ScriptsTest.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
  

Комментарии:

1. Спасибо, Дэйв. Я попробую это сделать — мне интересно CreateObject("Excel.Application") , поскольку код находится на веб-сервере, которым управляет мой школьный совет, и я не удивлюсь, если Excel не установлен.