Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Создание цикла / 25 сообщений из 33, страница 1 из 2
08.01.2010, 15:36
    #36400625
hum_i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Добрый день! Я первый столкнулась с VBA. Не могли бы вы помочь?
Мне нужно сделать отчет в Excel. Я там создала макрос, прописала соединение с Oracle. У меня есть вот такой запрос

select pl.def, count(t.chrg_id), sum(t.amount_$)
from charges t, price_list pl where t.prcl_prcl_id=pl.prcl_id
and t.prcl_prcl_id in (10109,10112,10114,10116,10118) and t.del_user is null
and t.navi_date like '07.01.10'
group by pl.def

Я могу создать Recordset и просто вытащить данные по этому запросу в Excel. Но мне нужно, чтобы тут работал цикл, где сначала будет браться один prcl_prcl_id=10109. Данные по нему вытаскиваются. Потом следующий и т. д..
...
Рейтинг: 0 / 0
08.01.2010, 17:50
    #36400829
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
hum_iЯ могу создать Recordset и просто вытащить данные по этому запросу в Excel. Но мне нужно, чтобы тут работал цикл, где сначала будет браться один prcl_prcl_id=10109. Данные по нему вытаскиваются. Потом следующий и т. д..Откуда "данные вытаскиваются"?
...
Рейтинг: 0 / 0
08.01.2010, 21:00
    #36401037
m
m
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
hum_iЯ первый столкнулась с VBA.
Вы точно не первая, кто столкнулся с VBA

По существу вопроса:
Запрос у Вас оформлен в виде строки, правильно? Тогда просто каждый раз, при его использовании, просто меняйте какую-либо его часть, в вашем случае, если я правильно понял, будет так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
aMyArray = Array(''10109'',''10112'',''10114'',''10116'',''10118'') 'это для примера

For i =  1  to ubound(aMyArray)
sMyQuery = "select pl.def, count(t.chrg_id), sum(t.amount_$)" & _ 
" from charges t, price_list pl where t.prcl_prcl_id=pl.prcl_id" & _ 
" and t.prcl_prcl_id in (" & aMyArray(i) & ") and t.del_user is null" & _ 
" and t.navi_date like '07.01.10'
" group by pl.de"
...
Next

Вместо IN как Вы понимаете также можно использовать =, при этом убрать ненужные скобки.
...
Рейтинг: 0 / 0
11.01.2010, 08:55
    #36402913
hum_i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Спасибо большое, с этим понятно. Мне вот еще что нужно вместо даты and t.navi_date like '07.01.10'
использовать параметр, т.е. при открытии Excel запрашивался временной диапазон. Нужно сделать форму, а в коде как прописать не подскажите?
...
Рейтинг: 0 / 0
11.01.2010, 09:21
    #36402940
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Именно форму надо? Можно просто в начале Вашего макроса
Код: plaintext
1.
2.
dt = InputBox("Введите дату в формате дд.мм.гг", "Ввод даты", "дд.мм.гг")

и затем в запросе
Код: plaintext
" and t.navi_date like '" & dt & "'
...
Рейтинг: 0 / 0
11.01.2010, 11:41
    #36403169
m
m
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Мне тоже кажется лучше сделать как предлагает Hugo121 , тоесть использовать форму Inputbox. Если форма должна появлятся при каждом отркрытии книги, вешаете код Hugo121 на событие открытия книги (не в модуле, а в ЭтаКнига):

Код: plaintext
1.
2.
Private Sub Workbook_Open()
dt = InputBox("Введите дату в формате дд.мм.гг", "Ввод даты", "дд.мм.гг")
End Sub
...
Рейтинг: 0 / 0
11.01.2010, 12:14
    #36403246
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Только dt надо Public сделать в таком случае.
Я думал инпутбокс в начало имеющегося кода вставить. Ну а на открытие книги весь тот код, или команду запуска того кода из модуля (я так предпочитаю делать). В любом случае как-то ведь тот код запускать будут...
...
Рейтинг: 0 / 0
12.01.2010, 09:31
    #36404621
hum_i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Я не совсем поняла. Я вот сделала

Код: plaintext
1.
2.
Public Sub Workbook_Open()
dt = InputBox("Введите дату в формате дд.мм.гг", "Ввод даты")
End Sub

Потом вы пишите авторЯ думал инпутбокс в начало имеющегося кода вставить. Ну а на открытие книги весь тот код, или команду запуска того кода из модуля (я так предпочитаю делать).

Не подскажите где именно инпутбокс в имеющемся коде вставить?

Вот кусочек кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Public Sub Workbook_Open()
dt = InputBox("Введите дату в формате дд.мм.гг", "Ввод даты")
End Sub
Sub Pri_Call()
Dim con As ADODB.Connection:    Set con = New ADODB.Connection

con.Open "Provider=MSDAORA.1;Password=pwd;User ID=user;Data Source=mybd;Persist Security Info=True"

Cells( 1 ,  2 ).Value = dt
------
Dim rspricall1 As ADODB.Recordset:         Set rspricall1 = New ADODB.Recordset
Set rspricall1.ActiveConnection = con

Sql = " select count(t.chrg_id), sum(t.amount_$) "
Sql = Sql & " from bis.charges t"
Sql = Sql & " where t.prcl_prcl_id=10109"
Sql = Sql & " and t.amount_$=0"
Sql = Sql & " and t.del_user is null"
'Sql = Sql & " and t.navi_date like '09.01.10'"
Sql = Sql & " and t.navi_date like '" + dt + "'"

rspricall1.Open Sql, con
Sheets("Лист1").Select
Cells( 3 ,  2 ).CopyFromRecordset rspricall1
Cells( 4 ,  2 ).CopyFromRecordset rspricall1
rspricall1.Close
...
Рейтинг: 0 / 0
12.01.2010, 09:50
    #36404644
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Не совсем понятно, зачем при открытии файла запрашивать дату, если далее ничего не следует?
Я думаю, дату надо запрашивать перед её использованием (при открытии запускаем макрос (если конечно надо сразу его запускать), а в нём запрашиваем дату)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Public Sub Workbook_Open()
Pri_Call
End Sub

Sub Pri_Call()
Dim con As ADODB.Connection:    Set con = New ADODB.Connection

dt = InputBox("Введите дату в формате дд.мм.гг", "Ввод даты")

con.Open "Provider=MSDAORA.1;Password=pwd;User ID=user;Data Source=mybd;Persist Security Info=True"

Cells( 1 ,  2 ).Value = dt
------
Dim rspricall1 As ADODB.Recordset:         Set rspricall1 = New ADODB.Recordset
Set rspricall1.ActiveConnection = con

Sql = " select count(t.chrg_id), sum(t.amount_$) "
Sql = Sql & " from bis.charges t"
Sql = Sql & " where t.prcl_prcl_id=10109"
Sql = Sql & " and t.amount_$=0"
Sql = Sql & " and t.del_user is null"
'Sql = Sql & " and t.navi_date like '09.01.10'"
Sql = Sql & " and t.navi_date like '" + dt + "'"

rspricall1.Open Sql, con
Sheets("Лист1").Select
Cells( 3 ,  2 ).CopyFromRecordset rspricall1
Cells( 4 ,  2 ).CopyFromRecordset rspricall1
rspricall1.Close



Примерно так. Только объявление переменных не отслеживал, может надо Dim dt$ в Pri_Call, если она ранее Public не объявлена.
И ещё - Cells(1, 2).Value = dt вставит строку в ячейку, а эксель её наверняка преобразует в дату (если формат ячейки Общий, вроде так, не проверяю). Я бы это на самотёк не пускал - надо в коде задать нужный формат этой ячейке.
...
Рейтинг: 0 / 0
12.01.2010, 12:36
    #36404992
hum_i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Я указала формат dt = Format(Date, "DD.MM.YY")

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Sub Workbook_Open()
Pri_Call
End Sub

Sub Pri_Call()
Dim con As ADODB.Connection:    Set con = New ADODB.Connection

Dim dt As Date

dt = Format(Date, "DD.MM.YY")

dt = InputBox("Введите дату в формате дд.мм.гг", "Ввод даты")

con.Open "Provider=MSDAORA.1;Password=pwd;User ID=user;Data Source=mybd;Persist Security Info=True"

Cells( 1 ,  2 ).Value = dt

А при запуске все равно дает ошибку Type mismatch в этой части Sql = Sql & " and t.navi_date like '" + dt + "'"

Помогите пожалуйста
...
Рейтинг: 0 / 0
12.01.2010, 12:56
    #36405060
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
InputBox выдаёт строку, потом уже надо этой переменной менять тип.
Но в Вашем случае ведь строку и надо подставлять в запрос? Вроде так в начале затевалась вся эта бодяга...
А преобразовывать в дату тогда есть смысл перед вставкой в ячейку.
Может так:
Код: plaintext
1.
2.
dt = InputBox("Введите дату в формате дд.мм.гг", "Ввод даты")

Cells( 1 ,  2 ).Value = CDate(dt)
или вот нашёл пример
Код: plaintext
1.
datS = InputBox("- в формате (гггг мм дд):", "Дата выдачи:", Format(Date, "yyyy mm dd"))
Тогда перед запросом что-то вроде dt = CStr(datS) надо сделать... но проследить за синтаксисом, на выходе надо like '07.01.10' получить.
...
Рейтинг: 0 / 0
12.01.2010, 13:00
    #36405071
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Хотя нет, datS всё равно строка, поторопился, не проверил.
...
Рейтинг: 0 / 0
12.01.2010, 13:23
    #36405148
hum_i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Увы ну опять та же ошибка (((
...
Рейтинг: 0 / 0
12.01.2010, 13:29
    #36405161
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Это отключили?
Код: plaintext
1.
2.
Dim dt As Date

dt = Format(Date, "DD.MM.YY")

И вот это я бы написал всё же так:
Код: plaintext
and t.navi_date like '" & dt & "'
...
Рейтинг: 0 / 0
12.01.2010, 13:33
    #36405174
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Вот так проверяю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Sub tt()

dt = InputBox("Введите дату в формате дд.мм.гг", "Ввод даты", "дд.мм.гг")
vvv = " and t.navi_date like '" & dt & "'  "

MsgBox vvv

End Sub
В мессидже нужная строка должна получиться.
...
Рейтинг: 0 / 0
12.01.2010, 13:34
    #36405175
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
учитывая
авторпрописала соединение с Oracle
в ORACLE для дат, по крайней мере я, использую ф-цию БД to_date

т.е в Вашем случае должно получится, что-то вроде этого
Код: plaintext
Sql = Sql & " and t.navi_date = to_date('" + Format(dt, "yyyymmdd") + "', 'yyyymmdd')"

вопрос: а почему а Вас дата сравнивается по LIKE ? Это все-таки поле типа дата или текстовое?


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
12.01.2010, 14:13
    #36405275
hum_i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
автор HandKot вопрос: а почему а Вас дата сравнивается по LIKE? Это все-таки поле типа дата или текстовое?

Не ну можно конечно и ='дата', а можно и like 'дата'. Это не принципиально и то и то работает.

Еще у меня такой вопрос. Вот я указала, чтобы данные не в строчку выводились а в столбец

Код: plaintext
1.
2.
3.
4.
rspricall1.Open Sql, con
Sheets("Лист1").Select
Cells( 3 ,  2 ).CopyFromRecordset rspricall1
Cells( 4 ,  2 ).CopyFromRecordset rspricall1
rspricall1.Close

Но они все равно в строчку выводятся, почему?
...
Рейтинг: 0 / 0
13.01.2010, 07:10
    #36406650
hum_i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Ни кто ни может помочь?
...
Рейтинг: 0 / 0
13.01.2010, 09:13
    #36406742
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
не понятно, что означает чтобы данные не в строчку выводились а в столбец

метод CopyFromRecordset выводит рекордсет с указанного адреса и при выводе каждая строка рекордсета будет в новой строке на листе, а каждый столбец рекордсета в столбце листа

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
13.01.2010, 09:50
    #36406781
hum_i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
автор HandKot метод CopyFromRecordset выводит рекордсет с указанного адреса и при выводе каждая строка рекордсета будет в новой строке на листе, а каждый столбец рекордсета в столбце листа

Ну так и получается
Код: plaintext
1.
2.
3.
4.
5.
Sql = " select count(t.chrg_id), sum(t.amount_$)"
Sql = Sql & " from bis.charges t"
Sql = Sql & " where t.prcl_prcl_id=10109"
Sql = Sql & " and t.amount_$=0"
Sql = Sql & " and t.del_user is null"
Sql = Sql & " and t.navi_date like '" & dt & "'"
что каждый столбец рекордсета в столбце листа. а нельзя сделать чтобы значение следующего столбца рекордсета записывалось в не в следующий столбец листа а строчкой ниже?
...
Рейтинг: 0 / 0
13.01.2010, 13:59
    #36407480
hum_i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Может я не совсем понятно объяснила. в моем запросе 2 поля: кол-во и сумма. и при выгрузке значения этих полей записываются в строчку Cells(3,2) Cells(3,3). но мне нужно сделать чтобы эти значения выводились в столбик Cells(3,2) Cells(4,2), как нужно заказчику. конечно можно это сделать 2-мя запросами, но это увеличивает код. можно ли как то это обойти, используя один запрос?
...
Рейтинг: 0 / 0
13.01.2010, 14:18
    #36407528
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
а сколько записей возвращает рекордсет?

если одну, то тогда лучше отказатся от CopyFromRecordset и просто вывести
Код: plaintext
1.
Cells( 3 ,  2 ) rspricall1.Field( 1 ).Value
Cells( 4 ,  2 ) rspricall1.Field( 2 ).Value

если же несколько строк, то можно поменять местами столбцы и строки (см. Transparent)
если не просто поменять, а одни результат по другим, то тогда, скорее всего, лучше переписать запрос

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
13.01.2010, 22:03
    #36408547
m
m
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
У Вас по тех заданию должно быть происвоение кучу раз одной и той же переменной вместо одного как? Как мне кажется, было бы правильнее один раз... Имеется ввиду:
Код: plaintext
1.
2.
sMyQuery = "select pl.def, count(t.chrg_id), sum(t.amount_$)" & _ 
" from charges t, price_list pl where t.prcl_prcl_id=pl.prcl_id" & _
...
Вместо Вашего:
Код: plaintext
1.
2.
3.
Sql = " select count(t.chrg_id), sum(t.amount_$)"
Sql = Sql & " from bis.charges t"
Sql = Sql & " where t.prcl_prcl_id=10109"
...
Может я не совсем понятно объяснила. в моем запросе 2 поля: кол-во и сумма. и при выгрузке значения этих полей записываются в строчку Cells(3,2) Cells(3,3). но мне нужно сделать чтобы эти значения выводились в столбик Cells(3,2) Cells(4,2), как нужно
Учитывая что у Вас нет в запросе GROUP BY, предположительно тогда всего одна запись в рекордсете. Делайте как предложил HandKot . Если когда-нибудь записей будет много, используйте в запросе UNION ALL:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select count(t.chrg_id)
from bis.charges t"
where t.prcl_prcl_id=10109"
...
UNION ALL
select sum(t.amount_$)
from bis.charges t"
where t.prcl_prcl_id=10109"
...
...
Рейтинг: 0 / 0
14.01.2010, 09:05
    #36408836
hum_i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
HandKot а сколько записей возвращает рекордсет?

Запрос возвращает одну запись. Я попробовала как вы написали
Код: plaintext
1.
Cells( 3 ,  2 ).rspricall1.Field( 1 ).Value
Cells( 4 ,  2 ).rspricall1.Field( 2 ).Value
При запуске дает ошибку. Может в этой записи чего то не хватает?
...
Рейтинг: 0 / 0
14.01.2010, 13:16
    #36409625
m
m
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание цикла
Так
Код: plaintext
1.
Cells( 3 ,  2 ).value = rspricall1.Field( 1 ).Value
Cells( 4 ,  2 ).value = rspricall1.Field( 2 ).Value
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Создание цикла / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]