powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Создание цикла
25 сообщений из 33, страница 1 из 2
Создание цикла
    #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
Создание цикла
    #36400829
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hum_iЯ могу создать Recordset и просто вытащить данные по этому запросу в Excel. Но мне нужно, чтобы тут работал цикл, где сначала будет браться один prcl_prcl_id=10109. Данные по нему вытаскиваются. Потом следующий и т. д..Откуда "данные вытаскиваются"?
...
Рейтинг: 0 / 0
Создание цикла
    #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
Создание цикла
    #36402913
hum_i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо большое, с этим понятно. Мне вот еще что нужно вместо даты and t.navi_date like '07.01.10'
использовать параметр, т.е. при открытии Excel запрашивался временной диапазон. Нужно сделать форму, а в коде как прописать не подскажите?
...
Рейтинг: 0 / 0
Создание цикла
    #36402940
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Именно форму надо? Можно просто в начале Вашего макроса
Код: plaintext
1.
2.
dt = InputBox("Введите дату в формате дд.мм.гг", "Ввод даты", "дд.мм.гг")

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

Код: plaintext
1.
2.
Private Sub Workbook_Open()
dt = InputBox("Введите дату в формате дд.мм.гг", "Ввод даты", "дд.мм.гг")
End Sub
...
Рейтинг: 0 / 0
Создание цикла
    #36403246
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только dt надо Public сделать в таком случае.
Я думал инпутбокс в начало имеющегося кода вставить. Ну а на открытие книги весь тот код, или команду запуска того кода из модуля (я так предпочитаю делать). В любом случае как-то ведь тот код запускать будут...
...
Рейтинг: 0 / 0
Создание цикла
    #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
Создание цикла
    #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
Создание цикла
    #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
Создание цикла
    #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
Создание цикла
    #36405071
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя нет, datS всё равно строка, поторопился, не проверил.
...
Рейтинг: 0 / 0
Создание цикла
    #36405148
hum_i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увы ну опять та же ошибка (((
...
Рейтинг: 0 / 0
Создание цикла
    #36405161
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это отключили?
Код: plaintext
1.
2.
Dim dt As Date

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

И вот это я бы написал всё же так:
Код: plaintext
and t.navi_date like '" & dt & "'
...
Рейтинг: 0 / 0
Создание цикла
    #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
Создание цикла
    #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
Создание цикла
    #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
Создание цикла
    #36406650
hum_i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ни кто ни может помочь?
...
Рейтинг: 0 / 0
Создание цикла
    #36406742
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понятно, что означает чтобы данные не в строчку выводились а в столбец

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

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Создание цикла
    #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
Создание цикла
    #36407480
hum_i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я не совсем понятно объяснила. в моем запросе 2 поля: кол-во и сумма. и при выгрузке значения этих полей записываются в строчку Cells(3,2) Cells(3,3). но мне нужно сделать чтобы эти значения выводились в столбик Cells(3,2) Cells(4,2), как нужно заказчику. конечно можно это сделать 2-мя запросами, но это увеличивает код. можно ли как то это обойти, используя один запрос?
...
Рейтинг: 0 / 0
Создание цикла
    #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
Создание цикла
    #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
Создание цикла
    #36408836
hum_i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot а сколько записей возвращает рекордсет?

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


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