powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Данные из диапазона - в цикл для ADO
25 сообщений из 33, страница 1 из 2
Данные из диапазона - в цикл для ADO
    #34725060
LeCrunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица в БД 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.
   Dim UserRange As Range
   Dim i As Integer, j As Integer
   Dim x As Variant
   Dim NN As Variant

   ' Ввод номеров   
   On Error GoTo Canceled
   Set UserRange = Application.InputBox _
      (Prompt:="Выделите диапазон с перечнем №№:", _
      Title:="SQL", _
      Type:= 8 ) ' <- код типа "ссылка на ячейки" как объект диапазона
   UserRange.Select
   
   
   ' Определение размера массива (всего номеров)
   x = UserRange.Value
	   
   If IsArray(x) Then
      For i =  1  To UBound(x,  1 )
         For j =  1  To UBound(x,  2 )

		   'Последовательные номера из перечня
            NN = x(i, j)

    ' Здесь будет БОЛЬШУЩЕЕ тело цикла  по обработке каждого запроса
    ' со своим номером NN
 
         Next j
      Next i
      
    Else
   ' Случай, когда обрабатывается только один номер
   ' (выделена только одна ячейка), т.е. она - не массив
            NN = x
            
     '?Здесь тоже придётся повторить тот же БОЛЬШОЙ объём кода,
     ' только из-за одного номера?..:(
     
    End If
    

Т.е. вопрос к мастерам VBA - как устранить получающуюся неоптимальность из-за возможного случая с единственным номером?...

В дополнение - несмотря на то, что данные (NN) предполагается располагать в одном столбце (одномерный непрерывный массив) - возможно ли предусмотреть расширенный их ввод путём:

1) или объединения двух или более выделяемых диапазонов

2) или полного прерывающегося диапазона ячеек в столбце, но чтобы автоматически исключались пустые ячейки?
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34725088
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первое, что приходит на ум - чтобы не повторять "тот же БОЛЬШОЙ объём кода" запиши "тело цикла по обработке каждого запроса" в виде функции (или Sub) с параметром NN.

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34725093
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второе:
Используй цикл For Each ... Next , это гораздо удобнее в этом случае (не нужно проверять на массив) и наверное правильнее!

напр

Код: plaintext
1.
2.
3.
4.
5.
6.
Dim myRng As Range
Dim iCel As Range
Set myRng = UserRange

For Each iCel In myRng
 NN = iCel.Value
Next
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34725094
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобще не очень понятен смысл превращения диапазона в массив в данном случае. Похоже на потерю времени, тем более, что потом нужно проверять не пустая ли ячейка или использовать многообластные диапазоны. По-моему проще сразу делать перебор ячеек и не надо будет повторять рутину дважды:

Код: plaintext
1.
2.
For Each cell In UserRange.Cells
    If IsNumeric(cell) Then 'и т.д.
Next cell

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34725095
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обогнал меня Deggasad со вторым пунктом :D

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34725097
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гы :) Доброй ночи сЭнсЭй!
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34725124
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
взаимно :-)

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34725134
LeCrunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги - большущее спасибо - сняли груз! :)
(Всё гениальное просто - ответ сразу на все пожелания!))

кропаю код дальше...
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34730938
LeCrunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь застрял на втором этапе - экспорт с помощью 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.
Option Explicit

Dim NN As Variant

' Объекты новой книги Excel
Dim oBook, oSheet1, oSheet2 As Object


Public Sub NN_selection()

' Создание новой книги Excel и листов
Set oBook = Workbooks.Add
Set oSheet1 = oBook.Worksheets( 1 )
Set oSheet2 = oBook.Worksheets( 2 )
oSheet1.Name = "index_ADO"
oSheet2.Name = "temp_sheet"

' Сохранить эту новую книгу
 oBook.SaveAs "D:\ADO\ADO.xls"
 oBook.Close
 
Dim UserRange, myRng, iCel As Range
   
   ' Ввод номеров
   On Error GoTo Canceled
   Set UserRange = Application.InputBox _
      (Prompt:="Выделите диапазон(ы) с перечнем №№:", _
      Title:="SQL", _
      Type:= 8 )
   
   If UserRange Is Nothing Then
      MsgBox "Операция отменена"
   Else
      UserRange.Select
   End If

   'и перебор ячеек с данными
   Set myRng = UserRange

   For Each iCel In myRng
      
      NN = iCel.Value
      
      ' Подпрограмма обработки каждого номера
      Call NN_calculation
      
   Next
       
Canceled:
End Sub



Public Sub NN_calculation()

   Dim rsData As ADODB.Recordset
   Dim sPath, sConnect, sSQL As String
    

   ' Путь к базе данных
   sPath = _
      "C:\База данных" & _
      "\"
    
    ' Строка подключения
   sConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & sPath & "База данных.mdb;" & _
            "Persist Security Info=False"
    
    ' SQL-запрос
   sSQL = "SELECT " & _
            "[Поле 1], [Поле 2], [Поле 3], [Поле 4]" & _
      "FROM [Таблица 1] " & _
      "WHERE [Поле 5] Like '%" & NN & "%' " & _
      "ORDER BY [Поле 1]"
           
   ' Извлечение данных с помощью ADO
   Set rsData = New ADODB.Recordset
   rsData.Open sSQL, sConnect, _
            adOpenForwardOnly, adLockReadOnly, adCmdText
   
   ' Удостовериться, что все данные получены
   If Not rsData.EOF Then
   
      ' Копирование полученных записей на лист 2   <- не переносится...:(
      oBook.Open
      oSheet2.Range("A1").CopyFromRecordset rsData
      
      
      ' Вызов процедуры для обработки данных на втором листе
      ' и перенос для группировки на первый
      Call NN_result
    
   
   Else
      Debug.Print "Данные не получены!" '<- хорошо бы в этом случае,
      'не прерывая макрос, записывать на первый лист между группами
      'обработанных данных извещение об этой ошибке с номером NN...:)
      
   End If
    
    ' Удалить объект Recordset, если он ещё существует
    If (rsData.State And ObjectStateEnum.adStateOpen) Then rsData.Close
    Set rsData = Nothing
    
   
End Sub

Или я опять что-то не так делаю?

Помогите пожалуйста, а то учиться приходиться на этой практической задаче.
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34730967
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Либо не закрывайте книгу (проще)
Либо придётся и к вашей книге через ADO подключаться, так же, как и к базе аксесса
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34730974
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeCrunchИли я опять что-то не так делаю?Ну дык! Фигню написал потому что. Сначала закрываешь книгу (в начале NN_Selection) а потом пытаешься использовать.
Ее не надо закрывать (и потом открывать), оставь ее в памяти на все время работы макроса.

LeCrunchПомогите пожалуйста, а то учиться приходиться на этой практической задаче.Это самый лучший метом обучения.
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34731123
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeCrunchПомогите пожалуйста, а то учиться приходиться на этой практической задаче.Это самый лучший метом обучения.[/quot]

+1
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34733849
LeCrunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал, как советовали, не закрывая - но при этом, похоже, макрос не может правильно воспринять передаваемый ему диапазон в 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 - это хорошо, но со знающими людьми, кроме этого форума, и посоветоваться не с кем; так что не обижайтесь на вопросы начинающего ;)
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34733870
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeCrunchи выявилось - Run-time error '1004' Метод Select из класса Range завершен неверно а ты не делай UserRange.Select. Это совершенно бессмысленная операция.

LeCrunchIMHO в этом случае метод InputBox не может правильно передать расположение выделяемой области, если она принадлежит другой книге.Нет. InputBox выдает совершенно правильную область. С ней и надо работать. Но работать, а не визуально выделять. Если ты хочешь сделать Select на каком-то листе, ты сначала должен переключится (Activate) на книгу и на лист которые содержат нужную область. А если показывать эту область пользователю необязательно то и выделять не нужно.
Кстати и копировать UserRange в MyRng тоже бессмысленно. Пустая трата времени и ресурсов.

LeCrunchПараллельно вопросик - у меня нет ошибок в синтаксисе с объявлением ADO.xls и её листов и с записью туда рекордсетсета?..вроде нет.
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34736716
LeCrunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за поправки - извлечение в цикле теперь проходит успешно!

Осталась третья процедура - обработка каждой группы отфильтрованных данных.
Делаю это построчно в цикле, вычисляя значения для каждой колонки.

Дополнительная трудность - приходится преобразовывать ранее существовавшие для этой автоматизируемой задачи обычные формулы в код 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.
Public Sub NN_result

Dim r As Range       	'r - ячека(и) в текущей строке
Dim row As Integer   	'row - текущая строка
Dim r2max As Integer  	'rmax - кол-во строк

' работаем со вторым листом
oSheet2.Activate

r2max = oSheet2.UsedRange.Rows.Count

   ' Цикл по всем строкам второго листа
   For row =  1  To r2max

      ' - в колонке "A" нужно объединить содержимое E и F, как ранее по формуле 
      '=ТЕКСТ(E1;"000")&ТЕКСТ(F1;"000")    
      r.Cells("A:A").Value = WorksheetFunction.Text(r.Cells("E:E").Value, "000") & _
                           WorksheetFunction.Text(r.Cells("F:F").Value, "000")

      ' простановка в колонке "С" порядковых номеров
      r.Cells("C:C").Value = r
           
      ' для колонки "G" - если в начале ячейки нет слова "док", 
      ' добавить в начало "документ № ", иначе - пропустить
      ' =СЖПРОБЕЛЫ(ЕСЛИ(ЛЕВСИМВ(G1;3)<>"док";("документ № "&G1);(G1)))

      r.Cells("G:G").Value = Trim(IIf(WorksheetFunction.Left(r.Cells("G:G").Value, 3 ) <> "док", _
         ("документ № " & r), _
         r)))
              
      ' и т.д. и т.п...

   Next row
   
End Sub

Но похоже, что-то опять путаюсь в диапазонах и формулах, подскажите плз...
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34736728
LeCrunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вдогонку - есть ли в VBA оптимальное решение для поиска значений в диапазоне, для примера:

Существует вспомогательная заполненная табличка 16Rx6C, плюс слева и сверху названия строк и столбцов.

Раньше, вручную, значения из неё извлекались по запросу строк (G1) и столбцов (V1) формулой типа:

=ИНДЕКС(form!$A$1:$G$17; ПОИСКПОЗ(G1;Ку!$A$1:$A$17;); ПОИСКПОЗ(V1;Ку!$A$1:$G$1;))

Посоветуйте - как бы это поизящней описать в VBA (комбинацией массивов - но как?), и без необходимости держать вспомогательную таблицу на листе Excel?
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34736731
LeCrunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
к последнему - опечатка - везде лист называется form!
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34736735
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не уверен, что понял откуда что берется, но может так?:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Public Sub NN_result()
    Dim rng As Range
    Dim row As Integer
    
    Set rng = oSheet2.UsedRange

    For row =  1  To rng.Rows.Count
        rng(row,  1 ) = Format(rng(row,  5 ), "000") & Format(rng(row,  6 ), "000")
        rng(row,  3 ) = rng(row,  1 )
        rng(row,  7 ) = Application.Trim(IIf(Left(rng(row,  7 ),  3 ) <> "док", ("документ № " & rng(row,  1 )), rng(row,  1 )))
    Next row
End Sub


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]
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34736738
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeCrunchдостаточно указания WorksheetFunction."название функции" или правильно нужно полностью, Application.WorksheetFunction. ?...

да, в ответ на твой вопрос:
если код запускается из-под Excel, то любой из след. синтаксисов должен работать:

Application.WorksheetFunction.Trim()
WorksheetFunction.Trim()
Application.Trim()


(!) Не все функции листа доступны из VBA
(!) Некоторые функции листа имеют полные или частичные эквиваленты в VBA
(!) Cинтаксис Application.Trim() несколько иначе работает со значениями ошибки, чем первые два.

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34736744
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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]
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34736781
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.
Dim iCel As Range
With Sheets("form")
 Set iCel = Intersect(.Range("A1:A17").Find(Range("G1").Value).EntireRow, _
                        .Range("A1:G1").Find(Range("V1").Value).EntireColumn)
End With
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34736782
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)
(!) Cинтаксис Application.Trim() несколько иначе работает со значениями ошибки, чем первые два.


Привет, не пояснишь ли эту фразу? а то интересно стало. Я всегда именно так использую функции рабочего листа.
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34736783
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
Dim iCel As Range
With Sheets("form")
 Set iCel = Intersect(.Range("A1:A17").Find(Range("G1").Value).EntireRow, _
                        .Range("A1:G1").Find(Range("V1").Value).EntireColumn)
End With


Даже так наверное

Код: plaintext
1.
2.
3.
4.
 With Sheets( 1 ).Range("A1:G17")
  Set iCel = Intersect(.Columns( 1 ).Find(Range("G1").Value).EntireRow, _
                       .Rows( 1 ).Find(Range("V1").Value).EntireColumn)
 End With
 Debug.Print iCel.Address
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34736784
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sheets("form") вместо Sheets(1)
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34736971
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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]
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Данные из диапазона - в цикл для ADO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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