Страницы: 1
RSS
Работа с командной строкой cmd из VBA
 
Добрый день.
Допустим, что в ячейках столбца А есть такие данные.
sqlplus system/123
drop user test1 cascade;
create user test1 identified by 123;
grant connect, resource, create view   to  test1;
disconnect
connect test1/123
Первая команда - подключение к базе данных Oracle, а дальше работа в системе.
Как правильно всё это запустить?
Вот как не получается, потому что команды, начиная со 2-ой, не для cmd а для Oracle:

Код
Sub sqlplus()
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
whatToDo = Range("A1")
    For i = 2 To 6
        whatToDo = whatToDo & "&" & Range("A" & i)
    Next i
wsh.Run whatToDo
Set wsh = Nothing
End Sub
 
Gekan, курите CreateObject("WScript.Shell").Exec , начать можно отсюда: http://script-coding.com/WSH/WshShell.html#3.5.
По идее, эта штука позволяет посылать команды стороннему приложению и получать ответы.
 
Спасибо за ссылку. Скорее всего надо будет использовать SendKeys.
 
Доброе время суток
А почему бы это не записать в пакетный файл и выполнить sqlplus с указанием этого пакетника? Что за странная идея таким образом издеваться над Oracle?
 
Это был просто как бы пример. Интересно узнать, как правильно послать нажатие клавиш в стороннее приложение. Вот пример по ссылке выше, но он почему-то не работает, по крайней мере у меня.

Код
Sub test()
Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("notepad")
WshShell.AppActivate WshExec.ProcessID
WshShell.SendKeys "0123456789"
End Sub
 
Код
Sub test()
Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("notepad")
WshShell.AppActivate WshExec.ProcessID
Application.Wait (Now + TimeValue("0:00:02"))
WshShell.SendKeys "0123456789"
End Sub

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Спасибо, с задержкой работает, только вместо английских букв посылаются русские.
 
Gekan, раскладка по умолчанию какая?

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
А почему вы не хотите использовать WshExec.StdId, как советовал вам Казанский? Да и посылать команды Oracle всё же лучше через ADODB.Connection
 
Нужен универсальный вариант, просто пару строк послать, работать с Oracle через SendKeys нет необходимости,  ADODB.Connection тоже не особо нужен, данные из базы в Excel не передаются.
Цитата
JayBhagavan написал: Gekan, раскладка по умолчанию какая?
Раскладка по умолчанию русская, поменял на английскую заработало. Не знаю, как поменять это программно, нашёл функцию для смены раскладки, но она не помогает, видимо SendKeys использует раскладку по умолчанию, а не текущую.
Код
Declare Function LoadKeyboardLayout Lib "user32" Alias _
"LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long 
'' Переключение на английскую раскладку
Function KBDToENG()
Call LoadKeyboardLayout("00000409", &H1)
End Function 

'' Переключение на русскую раскладку
Function KBDToRUS()
Call LoadKeyboardLayout("00000419", &H1)
End Function
 
Gekan, наверное эта функция работает внутри экселя, а не для запущенного приложения. Точно не скажу, т.к. я её понимаю поверхностно. Возможно стоит воспользоваться глобальным макрорекордером, например, ДжитБит.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
Gekan написал:
Нужен универсальный вариант
А чем ADODB.Connection не универсальный вариант по вашему мнению? Использовать WinAPI - это куда универсальнее :D  (гланды, автогеном, через одно место)? Ну, ну...
Цитата
Gekan написал:
ADODB.Connection тоже не особо нужен, данные из базы в Excel не передаются
А причём тут передача данных? Кроме DML доступны и DDL, DCL, TCL. В примитивном варианте - ваш случай.
Код
Public Sub test()
    Dim pConn As New ADODB.Connection
    pConn.CursorLocation = adUseClient
    pConn.Open "Driver={Microsoft ODBC for Oracle};Server=OraServerName:1521/SIDName;Uid=system;PWD=123"
    pConn.Execute "drop user test1 cascade"
    pConn.Execute "create user test1 identified by 123"
    pConn.Execute "grant connect, resource, create view,select any table to test1"
    pConn.Close
    pConn.Open "Driver={Microsoft ODBC for Oracle};Server=OraServerName:1521/SIDName;Uid=test1;PWD=123"
    Set pRSet = pConn.Execute("Select Field1 From Schema1.Table1")
    Debug.Print pRSet(0).Value
    pRSet.Close: pConn.Close
End Sub

Успехов.
Изменено: Андрей VG - 20.11.2015 06:22:27
 
Это отличный вариант для работы с Oracle, спасибо.
Но вопрос о программном переключении раскладки по умолчанию ещё актуален.
Страницы: 1
Читают тему
Наверх