powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Данные из диапазона - в цикл для ADO
8 сообщений из 33, страница 2 из 2
Данные из диапазона - в цикл для ADO
    #34736991
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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]

Спасибо. Я , по-моему, как раз поэтому стал записывать как Application.Trim(), потому что IsError() отловить можно было. Только почему то у меня этот факт нигде не отложился, теперь то запомню (надеюсь). Ещё раз спасибо.
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34737171
LeCrunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
Только опять момент - виноват, не описал нюанс шаблона таблицы, формируемой на втором листе.

Мне необходимо добавить в начало этой таблицы четыре пустых столбца, чтобы потом их заполнять вычисляемыми данными из других столбцов рекордсета.

Поступил так:

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

    Dim rng, rng_used, rng_0 As Range
    Dim row As Integer
    
    oSheet2.Range("A1:D1").EntireColumn.Insert
    
    Set rng_used = oSheet2.UsedRange
    Set rng_0 = oSheet2.Range(Cells( 1 ,  1 ), Cells(rng_used.Rows.Count,  4 ))
    Set rng = Union(rng_used, rng_0)


    For row =  1  To rng.Rows.Count

	...

Но непонятно - при пошаговом выполнении макроса - всё нормально, при автоматическом - тихая остановка на первой выборке, после вставки этих пустых столбцов!

На всяк. случай - критично ли этой процедуры, если для некоторые рекордсеты содержат пустые столбцы? Может сразу превращать(именовать) их в диапазоны, чтобы воспринимались как единое целое?...

Ещё вопросики:

1. Как результат этого выражения: rng(row, 1) = Format(rng(row, 5), "000") & Format(rng(row, 6), "000")
превратить в текст? (нельзя терять лидирующих нулей).

2. Как правильно надо превращать число в ячейке, сохранённое как текст, обратно в число?

И на перспективу - есть какие-нибудь готовые примеры реализации только в коде (памяти), без вспомогательного листа нахождения значения в табличке на перекрестье названий строки столбца?
Будет время - хочу попробовать)
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34737190
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeCrunch
И на перспективу - есть какие-нибудь готовые примеры реализации только в коде (памяти), без вспомогательного листа нахождения значения в табличке на перекрестье названий строки столбца?
Будет время - хочу попробовать)


Ты же уже спрашивал, ты что не читаешь ответы?

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

Поступил так:...

Но непонятно - при пошаговом выполнении макроса - всё нормально, при автоматическом - тихая остановка на первой выборке, после вставки этих пустых столбцов!

На всяк. случай - критично ли этой процедуры, если для некоторые рекордсеты содержат пустые столбцы? Может сразу превращать(именовать) их в диапазоны, чтобы воспринимались как единое целое?...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Public Sub NN_result()

    Dim rng, rng_used, rng_0 As Range
    Dim row As Integer
    
    With oSheet2
        .Columns("A:D").Insert
        With .UsedRange
            Set rng = .Offset( , - 4 ).Resize( , .Columns.Count +  4 )
        End With
    End With

    For row =  1  To rng.Rows.Count

	...

LeCrunch1. Как результат этого выражения: rng(row, 1) = Format(rng(row, 5), "000") & Format(rng(row, 6), "000")
превратить в текст? (нельзя терять лидирующих нулей).
Код: plaintext
rng(row,  1 ) = "'" & Format(rng(row,  5 ), "000") & Format(rng(row,  6 ), "000")

LeCrunch2. Как правильно надо превращать число в ячейке, сохранённое как текст, обратно в число?
Код: plaintext
1.
2.
    With [A1]
        .Value = .Value 
    End With

LeCrunchИ на перспективу - есть какие-нибудь готовые примеры реализации только в коде (памяти), без вспомогательного листа нахождения значения в табличке на перекрестье названий строки столбца?
Например так:
Код: 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.
Sub test()
    Dim arrDate() As Variant
    Dim arrCurrency() As Variant
    Dim arrExchange( 1  To  3 ,  1  To  5 ) As Double
    
    arrDate = Array( _
        DateSerial( 2007 ,  1 ,  1 ), _
        DateSerial( 2007 ,  2 ,  1 ), _
        DateSerial( 2007 ,  3 ,  1 ), _
        DateSerial( 2007 ,  4 ,  1 ), _
        DateSerial( 2007 ,  5 ,  1 ))
    
    arrCurrency = Array( _
        "USD", _
        "EUR", _
        "RUR")
    
    arrExchange( 1 ,  1 ) =  0 . 22 
    arrExchange( 1 ,  2 ) =  0 . 24 
    arrExchange( 1 ,  3 ) =  0 . 21 
    arrExchange( 1 ,  4 ) =  0 . 23 
    arrExchange( 1 ,  5 ) =  0 . 26 
    
    arrExchange( 2 ,  1 ) =  0 . 3 
    arrExchange( 2 ,  2 ) =  0 . 34 
    arrExchange( 2 ,  3 ) =  0 . 36 
    arrExchange( 2 ,  4 ) =  0 . 33 
    arrExchange( 2 ,  5 ) =  0 . 32 
    
    arrExchange( 3 ,  1 ) =  0 . 0012 
    arrExchange( 3 ,  2 ) =  0 . 0021 
    arrExchange( 3 ,  3 ) =  0 . 0018 
    arrExchange( 3 ,  4 ) =  0 . 0017 
    arrExchange( 3 ,  5 ) =  0 . 0021 
    
    MsgBox arrExchange(Application.Match("EUR", arrCurrency,  0 ), Application.Match(Date, arrDate))
End Sub
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34737210
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeCrunchСпасибо!


Ещё вопросики:

1. Как результат этого выражения: rng(row, 1) = Format(rng(row, 5), "000") & Format(rng(row, 6), "000")
превратить в текст? (нельзя терять лидирующих нулей).

2. Как правильно надо превращать число в ячейке, сохранённое как текст, обратно в число?



Можно ещё формат сделать текстовым в ячейке

Код: plaintext
1.
2.
3.
Sub Макрос3()
    ActiveCell.NumberFormat = "@"
    ActiveCell.Value = Format("5", "000") & Format("10", "000")
End Sub

Назад в число

Код: plaintext
1.
2.
3.
Sub Макрос4()
    ActiveCell.NumberFormat = "0"
    ActiveCell.Formula = ActiveCell.Formula
End Sub

А если нули нужны только для визуального отображения, то можнотолько формат числа поменять

Код: plaintext
1.
2.
3.
Sub Макрос2()
    ActiveCell.NumberFormat = "000000"
    ActiveCell.Value = Format("5", "000") & Format("10", "000")
End Sub
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34737211
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, еще две вещи забыл:

1)
Код: plaintext
Dim rng, rng_used, rng_0 As Range

не означает, что все три переменные задекларированы как тип Range. На самом деле, первые две - Variant, а последняя - Range. Правильно было бы:

Код: plaintext
Dim rng As Range, rng_used As Range, rng_0 As Range

2)
Код: plaintext
Dim row As Integer

В Excel2003 макс. число строк на листе 65536, а макс. число типа Integer - 32767. Т.ч. может нехватить (я уже не говорю про Excel2007). Так что лучше:

Код: plaintext
Dim row As Long

Да, и еще небольшая чистка моей версии кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Public Sub NN_result()
    Dim rng As Range, row As Long
    
    With oSheet2
        .Columns("A:D").Insert
        With .UsedRange
            Set rng = .Offset( , - 4 ).Resize( , .Columns.Count +  4 )
        End With
    End With

    For row =  1  To rng.Rows.Count

	...


KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Данные из диапазона - в цикл для ADO
    #34737414
LeCrunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё раз большущее спасибо всем участникам темы, самому форуму и отдельно Most Valuable Professional'у! ;)

Успел до конца отпуска - здорово облегчив работу на будущее!

Однако тему прошу не закрывать, ибо, войдя во вкус, планирую понемножку улучшать макрос и дальше. :)
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Данные из диапазона - в цикл для ADO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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