Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 02.12.2008, 14:12   #1
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
Смущение Три вопроса по VBA

УВажаемые господа!
ПРи написании одной задачи возникло три вопроса:
Вопрос 1:
ПРи чтении из БД часто встречается пустая запись (поле =NULL). Как подправить следующую строчку
ot = oRes.Fields(4).Value
nm(j) = RTrim(fio) + " " + Left(im, 1) + ". " + Left(ot, 1) + "."
чтобы в случае если oRes.Fields(4).value=NULL выполнялась другая операция
nm(j) = RTrim(fio) + " " + Left(im, 1) + ". "
структуру типа IF oRes.fields(4).value=NULL then или IF oRes.fields(4).value iS NULL не работают
Вопрос 2:
При формировании страницы для печати (режим разметки страниц) в макросе
Rows("1:41").Select
k = (j - 1) * 41 / 13 + 1
Selection.Copy
Range("a" & k).Select
ActiveSheet.Paste
Rows("" & ((j - 1) * 41 / 13 + 8) & ":" & (((j - 1) / 13 + 1) * 41 - 8)).Select
Range("a" & ((j - 1) * 41 / 13 + 8) & ":" & "IU" & (((j - 1) / 13 + 1) * 41 - 8)).Select
Selection.ClearContents
With ActiveSheet.PageSetup
.PrintTitleRows = ""
.PrintTitleColumns = ""
End With
ActiveSheet.PageSetup.PrintArea = "$1:$" & (((j - 1) / 13 + 1) * 41)
With ActiveSheet.PageSetup
.PrintHeadings = False
.PrintGridlines = False
.Zoom = 100
.PrintErrors = xlPrintErrorsDisplayed
End With
Range("a" & k).Activate
Set ActiveSheet.HPageBreaks(1).Location = Range("A" & k)
Достаточно часто возникает ошибка и прога заканчивает работу. Но на листе разметка произведена.
Повторный запуск программы уже этой ошибки не дает. Все листы находятся в состоянии разметки страниц.

Вопрос 3:
читаем данные из базы стандартным способом VBA
Dim Conn As ADODB.Connection
Dim oRes As ADODB.Recordset
Dim oCmd As ADODB.Command
...
Set Conn = CreateObject("ADODB.Connection")
Set oRes = CreateObject("ADODB.Recordset")
Set oCmd = CreateObject("adodb.command")

Conn.Open "Provider=SQLOLEDB.1;Password=Proje ct2;Persist Security Info=True;User ID=Project2;Initial Catalog=e6work;Data Source=172.18.12.6"
...
oCmd.ActiveConnection = Conn
str = "ep_Askvtidata @cmd='List',@idvti=" & idVTI & ", @idreq=" & rndval & ", @TimeStart='" & Dtn & " 20:00' , @TimeEnd='" & Dtk & " 20:00'"
oCmd.CommandText = str
oCmd.Execute
...
str = "select sum(valuefl), sum(idVTI) from vtidatalist where valuefl>4 and idvti=" & idVTI & " and idreq=" & rndval
oRes.Open str, Conn
Вопрос сумирование выполняется на компьютере где запущена прога VBA vs Excel или на MS SQL сервере. Если на своем компе то как заставить производить операцию сервер (подозрительно долго считает ~ 0,5 сек)

Заранее балгодарен за ответы.
Юнлинг вне форума
Старый 02.12.2008, 14:27   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вопрос 1.

Попробуйте так: If IsNull(oRes.fields(4).Value) Then

Вопрос 2:

Возможно, ошибка возникает при попытке установить позицию для несуществующего разделителя страниц:
ActiveSheet.HPageBreaks(1).Location = Range("A" & k)

тогда используйте перед этой строкой метод HPageBreaks.Add

Какая ошибка возникает? Номер, описание ошибки?
На какой строке останавливается выполнение кода?
EducatedFool вне форума
Старый 02.12.2008, 15:19   #3
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
Смех

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Вопрос 1.

Попробуйте так: If IsNull(oRes.fields(4).Value) Then
Сработало спасибо!
Юнлинг вне форума
Старый 02.12.2008, 15:30   #4
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение

Вопрос 2:

Возможно, ошибка возникает при попытке установить позицию для несуществующего разделителя страниц:
ActiveSheet.HPageBreaks(1).Location = Range("A" & k)

тогда используйте перед этой строкой метод HPageBreaks.Add

Какая ошибка возникает? Номер, описание ошибки?
На какой строке останавливается выполнение кода?
Не работает ошибка RunTime 1004
добавив рекомендованную ВАМИ строку возникает такая же ошибка
Юнлинг вне форума
Старый 02.12.2008, 15:46   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
добавив рекомендованную ВАМИ строку возникает такая же ошибка
Имелся ввиду вариант типа такого:
ActiveSheet.HPageBreaks.Add Range("A" & k)

тогда строка ActiveSheet.HPageBreaks(1).Location = Range("A" & k) не нужна

Напимер, можете использовать такой код:
Код:
Sub test2()
    ' сначала убираем все имеющиеся на данный момент разделители страниц
    For i = 1 To ActiveSheet.HPageBreaks.Count
        ActiveSheet.HPageBreaks(1).Delete
    Next
    ' а потом уже ставим разделители страниц как надо:
    ActiveSheet.HPageBreaks.Add Range("A" & 12)
    ActiveSheet.HPageBreaks.Add Range("A" & 25)
End Sub

Последний раз редактировалось EducatedFool; 02.12.2008 в 15:50.
EducatedFool вне форума
Старый 02.12.2008, 15:56   #6
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Имелся ввиду вариант типа такого:
ActiveSheet.HPageBreaks.Add Range("A" & k)

тогда строка ActiveSheet.HPageBreaks(1).Location = Range("A" & k) не нужна

Напимер, можете использовать такой код:
Код:
Sub test2()
    ' сначала убираем все имеющиеся на данный момент разделители страниц
    For i = 1 To ActiveSheet.HPageBreaks.Count
        ActiveSheet.HPageBreaks(1).Delete
    Next
    ' а потом уже ставим разделители страниц как надо:
    ActiveSheet.HPageBreaks.Add Range("A" & 12)
    ActiveSheet.HPageBreaks.Add Range("A" & 25)
End Sub
УРАААА! сработало.

Остался последний третий вопрос.
По первому сам ошибся. Все работает!!!
Юнлинг вне форума
Старый 03.12.2008, 11:03   #7
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Уважаемый EducatedFool!

Если вчера все работало. То сегодня вновь возникла ошибка
Run-time error "1004"
Application-defined or object-defined error
Юнлинг вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
черный ящик, на три входа и на три выхода Shanson Помощь студентам 7 30.01.2008 09:45
Три вопроса по клавиатуре Никки Общие вопросы Delphi 14 20.12.2007 22:07
три вопроса по ListView Scorpeon Компоненты Delphi 1 05.11.2007 22:40
Три вопроса по Ассемблеру Elm0 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 27.05.2007 15:43