|
|
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Есть таблица в БД Access. Из неё необходимо, используя заранее подготовленный перечень номеров (одномерный массив) на листе Excel, путем автоматической последовательности SQL-запросов (по этим номерам) к БД, получить в новой книге Excel соответствующее количество групп отфильтрованных и обработанных данных, отделённых один от другого парой-тройкой пустых строк (для того, чтобы потом вручную пронумеровать каждый список в особом порядке). Методом ADO данные каждого запроса переносятся сначала на второй лист, там обрабатываются, и в окончательном виде группируются на первом листе этой новой книги Excel. Возникла трудность с извлечением самих этих номеров из перечня для передачи каждого из них в качестве переменной для сформированного SQL-запроса. На основе готовых примеров скомпилировал следующее: Код: 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. 32. 33. 34. 35. 36. 37. 38. 39. 40. Т.е. вопрос к мастерам VBA - как устранить получающуюся неоптимальность из-за возможного случая с единственным номером?... В дополнение - несмотря на то, что данные (NN) предполагается располагать в одном столбце (одномерный непрерывный массив) - возможно ли предусмотреть расширенный их ввод путём: 1) или объединения двух или более выделяемых диапазонов 2) или полного прерывающегося диапазона ячеек в столбце, но чтобы автоматически исключались пустые ячейки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 22:22:47 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Первое, что приходит на ум - чтобы не повторять "тот же БОЛЬШОЙ объём кода" запиши "тело цикла по обработке каждого запроса" в виде функции (или Sub) с параметром NN. KL [MVP - Microsoft Excel] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 23:21:59 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Второе: Используй цикл For Each ... Next , это гораздо удобнее в этом случае (не нужно проверять на массив) и наверное правильнее! напр Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 23:34:18 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Вобще не очень понятен смысл превращения диапазона в массив в данном случае. Похоже на потерю времени, тем более, что потом нужно проверять не пустая ли ячейка или использовать многообластные диапазоны. По-моему проще сразу делать перебор ячеек и не надо будет повторять рутину дважды: Код: plaintext 1. 2. KL [MVP - Microsoft Excel] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 23:35:40 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
обогнал меня Deggasad со вторым пунктом :D KL [MVP - Microsoft Excel] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 23:37:59 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Гы :) Доброй ночи сЭнсЭй! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 23:43:24 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
взаимно :-) KL [MVP - Microsoft Excel] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2007, 00:16:11 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Коллеги - большущее спасибо - сняли груз! :) (Всё гениальное просто - ответ сразу на все пожелания!)) кропаю код дальше... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2007, 00:34:32 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Теперь застрял на втором этапе - экспорт с помощью ADO в новую книгу. Причём, экспериментируя отдельно с этой процедурой (когда сначала сначала объявлялись объекты новой книги, затем методом ADO переносились данные на лист и потом книга сохранялась) - всё нормально; сейчас же, - объявив объекты книги и заранее её сохранив, и закрыв (чтобы не мешала выбирать "Выделите диапазон(ы) с перечнем №№:") - рекордсет в эту закрытую книгу не переносится... Код: 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. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. Или я опять что-то не так делаю? Помогите пожалуйста, а то учиться приходиться на этой практической задаче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2007, 23:32:27 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Либо не закрывайте книгу (проще) Либо придётся и к вашей книге через ADO подключаться, так же, как и к базе аксесса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2007, 00:09:41 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
LeCrunchИли я опять что-то не так делаю?Ну дык! Фигню написал потому что. Сначала закрываешь книгу (в начале NN_Selection) а потом пытаешься использовать. Ее не надо закрывать (и потом открывать), оставь ее в памяти на все время работы макроса. LeCrunchПомогите пожалуйста, а то учиться приходиться на этой практической задаче.Это самый лучший метом обучения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2007, 00:18:52 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
LeCrunchПомогите пожалуйста, а то учиться приходиться на этой практической задаче.Это самый лучший метом обучения.[/quot] +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2007, 07:41:22 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Попробовал, как советовали, не закрывая - но при этом, похоже, макрос не может правильно воспринять передаваемый ему диапазон в InputBox; новая книга ADO.xls закрывает собой книгу LIST_with_NN.xls с номерами, и когда я перехожу к LIST_with_NN и выбираю на ней ячейки, ссылка в окне ввода принимает расширенный вид '[LIST_with_NN.xls]Лист1'!$D$2 вместо ранее простого 'Лист1'!$D$2 Чтобы убедится в ошибке, закомментировал в макросе команду 'On Error GoTo Canceled и выявилось - Run-time error '1004' Метод Select из класса Range завершен неверно До процедуры Public Sub NN_calculation() дело и не доходит... IMHO в этом случае метод InputBox не может правильно передать расположение выделяемой области, если она принадлежит другой книге. Параллельно вопросик - у меня нет ошибок в синтаксисе с объявлением ADO.xls и её листов и с записью туда рекордсетсета?.. Это самый лучший метод обучения. Согласен, много интересного узнал, да только это медленный процесс, а время поджимает... Книжки и Help - это хорошо, но со знающими людьми, кроме этого форума, и посоветоваться не с кем; так что не обижайтесь на вопросы начинающего ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2007, 01:18:10 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
LeCrunchи выявилось - Run-time error '1004' Метод Select из класса Range завершен неверно а ты не делай UserRange.Select. Это совершенно бессмысленная операция. LeCrunchIMHO в этом случае метод InputBox не может правильно передать расположение выделяемой области, если она принадлежит другой книге.Нет. InputBox выдает совершенно правильную область. С ней и надо работать. Но работать, а не визуально выделять. Если ты хочешь сделать Select на каком-то листе, ты сначала должен переключится (Activate) на книгу и на лист которые содержат нужную область. А если показывать эту область пользователю необязательно то и выделять не нужно. Кстати и копировать UserRange в MyRng тоже бессмысленно. Пустая трата времени и ресурсов. LeCrunchПараллельно вопросик - у меня нет ошибок в синтаксисе с объявлением ADO.xls и её листов и с записью туда рекордсетсета?..вроде нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2007, 02:17:41 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Спасибо за поправки - извлечение в цикле теперь проходит успешно! Осталась третья процедура - обработка каждой группы отфильтрованных данных. Делаю это построчно в цикле, вычисляя значения для каждой колонки. Дополнительная трудность - приходится преобразовывать ранее существовавшие для этой автоматизируемой задачи обычные формулы в код VBA. (Сразу вопрос - достаточно указания WorksheetFunction."название функции" или правильно нужно полностью, Application.WorksheetFunction. ?) Код: 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. 32. 33. 34. 35. Но похоже, что-то опять путаюсь в диапазонах и формулах, подскажите плз... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2007, 00:22:10 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Вдогонку - есть ли в VBA оптимальное решение для поиска значений в диапазоне, для примера: Существует вспомогательная заполненная табличка 16Rx6C, плюс слева и сверху названия строк и столбцов. Раньше, вручную, значения из неё извлекались по запросу строк (G1) и столбцов (V1) формулой типа: =ИНДЕКС(form!$A$1:$G$17; ПОИСКПОЗ(G1;Ку!$A$1:$A$17;); ПОИСКПОЗ(V1;Ку!$A$1:$G$1;)) Посоветуйте - как бы это поизящней описать в VBA (комбинацией массивов - но как?), и без необходимости держать вспомогательную таблицу на листе Excel? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2007, 00:50:50 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
к последнему - опечатка - везде лист называется form! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2007, 00:53:19 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Не уверен, что понял откуда что берется, но может так?: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 1) для работы с листом oSheet2, нет нужды его активировать 2) переменная r совсем непонятно откуда берется и почему так используется 3) синтаксис r.Cells("A:A") предположительно это попытка сделать r(row,"A") или r(1) [если это диапазон равный строке][???] 4) если r - это диапазон могущий содержать более одной ячейки, то непонятно след. его использование: Trim(IIf(WorksheetFunction.Left(r.Cells("G:G").Value,3) <> "док", _ ("документ № " & r ), _ r ))) 5) функции листа TEXT() в VBA соответствует функция Format() 6) функция VBA Trim , в отличие от одноименной функции листа, только убирает пробелы в начале и конце текстовой строки KL [MVP - Microsoft Excel] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2007, 01:01:57 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
LeCrunchдостаточно указания WorksheetFunction."название функции" или правильно нужно полностью, Application.WorksheetFunction. ?... да, в ответ на твой вопрос: если код запускается из-под Excel, то любой из след. синтаксисов должен работать: Application.WorksheetFunction.Trim() WorksheetFunction.Trim() Application.Trim() (!) Не все функции листа доступны из VBA (!) Некоторые функции листа имеют полные или частичные эквиваленты в VBA (!) Cинтаксис Application.Trim() несколько иначе работает со значениями ошибки, чем первые два. KL [MVP - Microsoft Excel] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2007, 01:11:03 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
LeCrunchВдогонку - есть ли в VBA оптимальное решение для поиска значений в диапазоне, для примера: Существует вспомогательная заполненная табличка 16Rx6C, плюс слева и сверху названия строк и столбцов. Раньше, вручную, значения из неё извлекались по запросу строк (G1) и столбцов (V1) формулой типа: =ИНДЕКС(form!$A$1:$G$17; ПОИСКПОЗ(G1;Ку!$A$1:$A$17;); ПОИСКПОЗ(V1;Ку!$A$1:$G$1;)) Посоветуйте - как бы это поизящней описать в VBA (комбинацией массивов - но как?), и без необходимости держать вспомогательную таблицу на листе Excel? 1) Оптимальней этой формулы в VBA ничего нет 2) табличку размером в 16Rx6C иначе как полностью расписывать в коде и присваивать каждый раз переменной не знаю как еще хранить вне листа (она врядли поместится в виде константы массива в объекте Name иза ограничения в 255 символов для проперти RefersTo). Ну а это вместо листа будет юзать память . 3) функции ИНДЕКС() и ПОИСКПОЗ() доступны из под VBA например ввиде: Application.Index() и Application.Match() . А функция ИНДЕКС() еще и эквивалентна прямому использованию диапазона, например Range("A1:D10")(8,2) или Range("A1:D10").Cells(8,2) или даже Range("A1")(8,2) , или массива, например arrMyArray(8,2) KL [MVP - Microsoft Excel] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2007, 01:29:54 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
LeCrunchВдогонку - есть ли в VBA оптимальное решение для поиска значений в диапазоне, для примера: Существует вспомогательная заполненная табличка 16Rx6C, плюс слева и сверху названия строк и столбцов. Раньше, вручную, значения из неё извлекались по запросу строк (G1) и столбцов (V1) формулой типа: =ИНДЕКС(form!$A$1:$G$17; ПОИСКПОЗ(G1;Ку!$A$1:$A$17;); ПОИСКПОЗ(V1;Ку!$A$1:$G$1;)) Посоветуйте - как бы это поизящней описать в VBA (комбинацией массивов - но как?), и без необходимости держать вспомогательную таблицу на листе Excel? Если в коде, то более всего наверное подходит метод Find, примерно так Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2007, 05:41:33 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
KL (XL) (!) Cинтаксис Application.Trim() несколько иначе работает со значениями ошибки, чем первые два. Привет, не пояснишь ли эту фразу? а то интересно стало. Я всегда именно так использую функции рабочего листа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2007, 05:45:43 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Deggasad LeCrunchВдогонку - есть ли в VBA оптимальное решение для поиска значений в диапазоне, для примера: Существует вспомогательная заполненная табличка 16Rx6C, плюс слева и сверху названия строк и столбцов. Раньше, вручную, значения из неё извлекались по запросу строк (G1) и столбцов (V1) формулой типа: =ИНДЕКС(form!$A$1:$G$17; ПОИСКПОЗ(G1;Ку!$A$1:$A$17;); ПОИСКПОЗ(V1;Ку!$A$1:$G$1;)) Посоветуйте - как бы это поизящней описать в VBA (комбинацией массивов - но как?), и без необходимости держать вспомогательную таблицу на листе Excel? Если в коде, то более всего наверное подходит метод Find, примерно так Код: plaintext 1. 2. 3. 4. Даже так наверное Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2007, 05:50:43 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Sheets("form") вместо Sheets(1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2007, 05:52:07 |
|
||
|
Данные из диапазона - в цикл для ADO
|
|||
|---|---|---|---|
|
#18+
Deggasad KL (XL) (!) Cинтаксис Application.Trim() несколько иначе работает со значениями ошибки, чем первые два. Привет, не пояснишь ли эту фразу? а то интересно стало. Я всегда именно так использую функции рабочего листа. В случае с Application.WorksheetFunction.Trim() или WorksheetFunction.Trim() ошибка приводит к прерыванию кода с Run-Time Error , и должна отлавливаться с пом On Error Resume Next: Debug.Print Err.Number или чем-то подобным. Application.Trim() молча возвращает значение номера ошибки (в этом случае, тип переменной должен быть Variant, чтобы не возникла ошибка Type-Mismatch Error с прерыванием кода). Здесь ошибка отлавливается с пом. функции IsError() . KL [MVP - Microsoft Excel] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2007, 14:44:33 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=34725124&tid=2182440]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 207ms |
| total: | 341ms |

| 0 / 0 |
