Как выполнить запрос, автоматизировать с помощью VBA Macro и Excel, сделать функцию «загрузки» при согласовании? - PullRequest
1 голос
/ 09 июля 2009

Я создаю инструмент согласования через VBA, который автоматизирует запросы из моей базы данных оракула и рабочего листа. Когда я запускаю запрос, я хочу, чтобы пользователь указал, какой элемент (в данном случае конвейер) запрашивать (на листе много элементов) и даты окончания / начала. У меня проблемы с выяснением следующего:

1) Это запрос - если значение равно NULL, как я могу сказать ему распечатать "ДАННЫЕ НЕ ДОСТУПНЫ"
2) Как очистить старый вывод из конвейера A, когда я запрашиваю конвейер B?
3) Мои даты сохраняются как строки в Oracle - как я могу преобразовать это в дату?
Спасибо!

Вот что у меня есть:

Option Explicit 
Option Base 1

Dim cnnObject As ADODB.Connection
Dim rsObject As ADODB.Recordset
Dim strGPOTSConnectionString As String

Dim startDate As Date
Dim endDate As Date
Dim strPipelineName As String
Dim strQuery As String

Sub ClickButton2()

Debug.Print ("Button has been clicked")
Dim Pipeline As String
Dim DateStart As Date
Dim DateEnd As Date

Pipeline = InputBox("Enter PipeLine", "My Application", "Default Value")
DateStart = InputBox("Enter Start Date", "My Application", DateTime.Date)
DateEnd = InputBox("Enter End Date", "My Application", DateTime.Date + 1)

Pipeline = Range("B1").Value
DateStart = Range("B2").Value
DateEnd = Range("B3").Value

strQuery = "select pipelineflow.lciid lciid, ldate, volume, capacity, status, " & _
"pipeline, station, stationname, drn, state, county, owneroperator, companycode, " & _
"pointcode, pottypeind, flowdirection, pointname, facilitytype, pointlocator, " & _
"pidgridcode from pipelineflow, pipelineproperties " & _
"where pipelineflow.lciid = piplineproperties.lciid " & _
"and pipelineflow.audit_active = 1 " & _
"and pipelineproperties.audit_active =1 " & _
"and pipelineflow.ldate >= '" & Format(DateStart, "dd-MMM-yyyy") & "' and pipelineflow.ldate < '" & Format(DateEnd, "dd-MMM-yyyy") & "' " & _
"and pipelineflow.ldate >= '" & DateStart & "' and pipelineflow.ldate < '" & DateEnd & "' " & _
"and pipelineproperties.pipeline = '" & Pipeline & "' "


    Call PullZaiNetData(strQuery)

    Call TieOut

End Sub

Sub PullZaiNetData2(ByVal strQry As String)
Set cnnObject = New ADODB.Connection
Set rsObject = New ADODB.Recordset

strGPOTSConnectionString = "DRIVER={Microsoft ODBC for Oracle}; SERVER=hhh; PWD=hhhh; UID=hhh"


cnnObject.Open strGPOTSConnectionString

rsObject.Open strQry, cnnObject, adOpenStatic
Worksheets("ZaiNet Data").Cells(1, 1).CopyFromRecordset rsObject


rsObject.Close
cnnObject.Close

Set rsObject = Nothing
Set cnnObject = Nothing

End Sub

Sub TieOut()

End Sub

Ответы [ 2 ]

2 голосов
/ 10 июля 2009

Поскольку вы изменили свои вопросы, я добавлю еще один ответ.

1) Это запрос - если значение равно NULL, как я могу сказать ему распечатать «ДАННЫЕ НЕ ДОСТУПНЫ»

Какое значение? Я подозреваю, что вы имеете в виду, когда запрос не возвращает записей. Чтобы проверить это, проверьте для rsObject.RecordCount = 0:

Dim ws As Worksheet
Set ws = Worksheets("ZaiNet Data")

ws.UsedRange.Clear '' remove results of previous query if any

If rsObject.RecordCount = 0 Then
  ws.Cells(1, 1) = "DATA NOT AVAILABLE"
Else
  ws.Cells(1, 1).CopyFromRecordset rsObject
End If

Вы также можете проверить наличие одного или обоих из rsObject.BOF или rsObject.EOF («Начало файла» или «Конец файла» соответственно).

При разработке вещей в VBA, особенно при использовании новых функций, с которыми я не знаком, я провожу много тестов, которые выводят вещи в Immediate Window. Чтобы помочь с этим, я использую следующую небольшую процедуру:

Sub Say(s as String)
  Debug.Print s
End Sub

Это немного облегчает генерацию результатов тестирования, которые постоянно вводят "Debug.Print" (даже немного легче, чем вводить "Debug.P" + Enter с помощью Intellisense).

Поэтому, когда вы открываете свой набор записей, показывайте количество записей после него:

rsObject.Open strQry, cnnObject, adOpenStatic
Say rsObject.RecordCount & " records"

Делайте что-то подобное в любое время, когда хотите проверить значение.

Позже, если вы хотите записать свои операторы отладки в текстовый файл, вам просто нужно изменить операцию подпрограммы Say ().

2) Как очистить старый вывод из конвейера A, когда я запрашиваю конвейер B?

Как показано в контексте выше:

ws.UsedRange.Clear '' remove results of previous query if any

3) Мои даты сохраняются как строки в Oracle - как я могу преобразовать это в дату?

Технически вам не нужно преобразовывать результирующие строки даты в значения даты, вы можете обнаружить, что просто поместив их в ячейку, Excel будет обрабатывать их как значения даты.

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

Строка запроса в том виде, в каком она стоит выше, все еще показывает две строки, включающие даты пользователя. Тот, который использует Format () для преобразования их в формат "dd-MMM-yyyy", это тот, который вы хотите сохранить. Удалите вторую строку, убедившись, что синтаксис объединения строк по-прежнему правильный.

Чтобы фактически преобразовать строку даты в значение даты, вы должны использовать функцию CDate ():

Sub DateTest()
  Dim sDate As String
  Dim dDate As Date

  sDate = "09-Jul-2009"
  dDate = CDate(sDate)

  Say "sDate = " & sDate
  Say "dDate = " & dDate

  dDate = dDate + 1
  Say "dDate = " & dDate
End Sub


Immediate Window output:
sDate = 09-Jul-2009
dDate = 7/9/2009
dDate = 7/10/2009

Мы можем убедиться, что она преобразовала строку в значение даты, потому что она отображается в формате даты по умолчанию для моего компьютера и отвечает на математическую дату (добавление 1 дня).

0 голосов
/ 09 июля 2009

Ответы на предыдущие вопросы (перефразировано):

1) «как убедиться, что дата окончания - после даты начала»:

Допустимые значения даты - числа с плавающей запятой, поэтому DateEnd должен быть> = DateStart. Часть целого числа - это количество дней с 1900-01-01. Дробная часть - это текущее время дня (например, 12 часов дня = 0,5).

2) «использовать необычные элементы управления записями календаря для дат»

Посмотрите элементы управления, доступные в меню «Вставка»> «Объект» (в Excel 2003 и более ранних версиях - тоже в 2007 году, но в другом месте). Одним из них является элемент управления Calendar. Двойной щелчок по нему в списке «Объекты» вставит его в текущую ячейку и переведет лист в режим «Дизайн». Щелкните правой кнопкой мыши элемент управления и выберите «Свойства». Введите адрес ячейки в поле LinkedCell. Затем нажмите кнопку «Выйти из режима дизайна» на маленькой панели инструментов, которая должна была появиться. Теперь, когда вы выбираете дату в элементе управления, она будет показывать значение в ячейке, с которой вы ее связали.

Аналогично, есть элемент управления раскрывающегося списка, который вы можете использовать для выбора типов конвейера.

3) "почему я получаю сообщение об ошибке в DateEnd = Range (" B3 "). Значение?"

Ошибка DateEnd, вероятно, связана с отсутствием или недопустимым значением в указанной вами ячейке, как я и просил в комментарии.

В какой версии Excel вы это делаете? Excel 2003

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...