#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 не установлен.