Страницы: 1
RSS
Вставить данные на лист Excel без преобразования (xlSet)
 
Моё почтение, джентльмены!
Инструмент для вставки данных на лист Excel без преобразования.
т.е. "1" так и вставится как текст, а не как число.

Не нужен апостроф, не нужен формат ячейки.
Нужна надстройка BedvitXLL(бесплатная).

Так же быстро заполняет диапазон одним значением.

Использована функция xlSet из Excel C API.

Функция/Метод XLLcmdE12xlSet(XCHAR * param, LPXLOPER12 param2, LPXLOPER12 pxReference, LPXLOPER12 pxValue)
param - командная строка XLL API - см. "XLL API":
   1й параметр - Режим диалога для комманд меню XLL - см. "Диалог"
param2 – зарезервирован

pxReference - Прямоугольная ссылка (адрес), описывающая целевую ячейку или ячейки. Адрес должен описывать смежные ячейки.

pxValue - Значение или значения, помещаемые в ячейку или ячейки.

Аргумент pxValue
pxValue может быть значением или массивом. Если это значение, этим значением заполняется весь диапазон назначения. Если это массив, элементы массива помещаются в соответствующие расположения в прямоугольнике.

Если для четвертого аргумента используется горизонтальный массив, он дублируется вниз, чтобы заполнить весь прямоугольник. Если используется вертикальный массив, он дублируется вправо для заполнения всего прямоугольника. Если вы используете прямоугольный массив, и он слишком мал для прямоугольного диапазона, в который вы хотите его поместить, этот диапазон заполняется исходными данными размером с массив, а остальной диапазон заполняется #Н/Д.

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

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

Ограничения
Невозможно отменить xlSet . Кроме того, он удаляет все сведения об отмене, которые могли быть доступны ранее.
XlSet может помещать в ячейки только константы, а не формулы. Максимальная длина помещаемой строки 8190 символов.


Возвращает код ошибки: 0 - команда выполнена успешно и Error 2036, #NUM!, #ЧИСЛО! - если ошибка.


Пример использования:
Код
Option Explicit

Sub TestXLLcmdE12xlSet()
    Dim i, testSize As Long: testSize = 2
    Dim arrOrValue: ReDim arrOrValue(1 To testSize, 1 To 1)
    
    For i = 1 To testSize
        arrOrValue(i, 1) = Str(i) 'MAX количество символов для ячейки: 8190
    Next
    
    'Варианты использования:
    '1.Выводим массив или значение по указанному диапазону на лист Excel
    Debug.Print Application.RUN("XLLcmdE12xlSet", "", 0, Range("a1:a2").Address, arrOrValue)
    
    '2. Помещаем в диапазон значение "1"
    Debug.Print Application.RUN("XLLcmdE12xlSet", "", 0, Range("b1:b2").Address, "1")
    
    '3. Выводим массив по указанному диапазону на лист Excel, первый элемент = Empty
    arrOrValue(1, 1) = Empty 'первый элемент Empty
    Debug.Print Application.RUN("XLLcmdE12xlSet", "", 0, Range("c1:c2").Address, arrOrValue)
    
    '4 Очищаем заданный диапазон от данных
    [d1:d5] = 2 'заполняем данными (2) диапазон для теста
    Debug.Print Application.RUN("XLLcmdE12xlSet", "", 0, Range("d1:d2").Address) ' очищаем в заданном диапазоне

End Sub
Изменено: bedvit - 18.04.2024 11:31:00
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, отличный инструмент! Большое спасибо!  :idea:
Цитата
bedvit:Не нужен апостроф, не нужен формат ячейки.Нужна надстройка  BedvitXLL(бесплатная).
:D
Про вставку в скрытые не упомянул.
Цитата
bedvit:Чтобы очистить элемент прямоугольника назначения, используйте элемент массива типа xltypeNil в исходном массиве.
про xltypeNil непонятно.
Цитата
bedvit:Чтобы очистить весь прямоугольник назначения, опустите второй аргумент.
у тебя 5 аргументов в Run. Скорректируй в соответствии с этим фактом и приведи примеры, пожалуйста.
Изменено: Jack Famous - 17.04.2024 18:16:01
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Виталий, добрый день! По моему что-то интересное и своевременное. В то время как в соседней теме постановили, что "Эксель себя исчерпал". Это конечно все шутки. Вы как я понимаю сделали быструю выгрузку налист, как раз то чего не хватает. Не моглибы просветить темный народ, что значит тип LPXLOPER12. LP вроде понятно - указатель, а XLOPER12 это что-то вроде бейсикового Variant?
Изменено: testuser - 17.04.2024 18:14:50
 
Цитата
Jack Famous написал:
у тебя 5 аргументов в Run. Скорректируй в соответствии
Спасибо за замечание, переписывал из справки Microsoft, у меня значит 4й в методе и 5 в Run.
Цитата
Jack Famous написал:
xltypeNil непонятно
это пустой XLOPER12, в VBA не смотрел какой это тип. Надо проверить, можете потестировать, возможно Empty.

testuser, да похож на Variant, только немного попроще.
Данный инструмент XLLcmdE12xlSet() по скорости обгоняет .Value2 на 15%
XLOPER12 используется в Excel C API, так же как Variant в VBA. Собственно это основной тип (структура) данных. Для VBA, Excel трансформирует  XLOPER12 в Variant и наоборот. В XLL я делаю это сам (ранее руками, теперь написал свой класс XloperX, даже в новостях от 7.04.24 отметил.)
Изменено: bedvit - 17.04.2024 18:47:49
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
возможно Empty.
Empty это пустой вариант, есть еще Null тоже пустой но единичка в начале (тип)
Изменено: testuser - 17.04.2024 18:40:20
 
Цитата
bedvit написал:
Собственно это основной тип (структура) данных. Для VBA, Excel трансформирует  XLOPER12 в Variant и наоборот
Ну тут понятно, там где какое-нибуь трансформирование, наверняка тупое копирование, а в вашем классе это наверное релизовано как-то поумней. Такой вопрос, а нельзя ли передать в vba указатель непосредственно на массивы данных в ячеек, чтоб непосредстенно из vba можно было работать с этими данными?
 
Думаю, что в моем классе всё то же самое)
Цитата
testuser написал:
непосредственно на массивы данных в ячеек
- нет такого. Есть данные на "сейчас" пересчитанные или сырые. Хочешь в динамике? Получай ещё раз (см. xlcoerce).
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
Jack Famous написал:
про xltypeNil непонятно.
Это Empty.

Добавил варианты использования в первое сообщение.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: XlSet может помещать в ячейки только константы, а не формулы.
то есть, если в качестве очередного элемента массива будет "=СУММ(A1:A:5)", то так строкой и вставится?
Думаю, последующее преобразование в реальную формулу не составит труда. Ну, или, тогда уж проще и быстрее использовать штатную Range().Formula = arr

Цитата
Jack Famous: Про вставку в скрытые не упомянул.
всё ещё не упомянул  :)
Изменено: Jack Famous - 18.04.2024 09:49:36
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
del
Изменено: Jack Famous - 18.04.2024 09:49:25
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
будет "=СУММ(A1:A:5)", то так строкой и вставится?
Да.
Цитата
Jack Famous написал:
Jack Famous : Про вставку в скрытые не упомянул
А может быть по другому? Работает так же, как и обычная вставка - вставляется в указанный диапазон, неважно скрыт он или нет. Штатная работает так же.
Изменено: bedvit - 18.04.2024 10:01:42
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: А может быть по другому? Работает так же, как и обычная вставка - вставляется в указанный диапазон, неважно скрыт он или нет. Штатная работает так же.
вы, молодой человек, путаете ВСТАВКУ в ячейки и ВЫГРУЗКУ массива.
Твой инструмент гораздо ближе к ВЫГРУЗКЕ (практически ей и является), а у неё заполнение скрытых ячеек, как раз, не осуществляется.

И вообще — почему опять такое неуважение к конечным пользователям? Какого лешего нам опять нужно что-то додумывать и домысливать?
Сложно написать "в отличие от обычной выгрузки массива на лист, НЕ игнорирует скрытые ячейки и успешно в них вставляет"???
Изменено: Jack Famous - 18.04.2024 10:31:53
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
ВЫГРУЗКЕ (практически ей и является), а у неё заполнение скрытых ячеек, как раз, не осуществляется.
Напиши код, когда ОБЫЧНАЯ выгрузка не заполняет скрытые ячейки.

У меня ОБЫЧНАЯ выгрузка все заполняет.
Код
  Range("a4:a8") = ArrV1
Изменено: bedvit - 18.04.2024 10:37:30
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, отфильтруй и повтори. Также, с умной таблицей.
Цитата
bedvit: У меня ОБЫЧНАЯ  выгрузка все заполняет
Range("a4:a8") = ArrV1
просто великолепный пример  :D
Изменено: Jack Famous - 18.04.2024 10:41:31
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Что отфильтровать? При чем здесь умная таблица? Если ты про свое, то я говорю про обычную выгрузку и про копи-паст. Все они вставляют в скрытый диапазон. А про то, о чем ты говоришь - я без кода не понимаю.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: А про то, о чем ты говоришь - я без кода не понимаю.
1. отфильтруй диапазон
2. вставь в него массив размером с ВИДИМУЮ часть
3. сними фильтр
4. посмотри, вставилось ли
5. повтори всё с умной таблицей
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
bedvit, а вы не могли бы добавить опцию, чтобы передавать/получать данные непосредственно по указателю массива типа XLOPER12?? (речь о передаваче указателя как целочисленного знчения)
Изменено: testuser - 18.04.2024 12:57:22
 
Цитата
testuser написал:
передавать/получать данные непосредственно по указателю массива типа XLOPER12??
передавать куда, и получать откуда? XLOPER12 это Си-шная структура, кто будет управлять памятью, когда я вам передам указатель на массив? Кто будет освобождать память занятую элементами массива? Каковы границы жизни указателя на массив и данных в нем (связан с первыми вопросами)?
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
кто будет управлять памятью, когда я вам передам указатель на массив?
Вы передадите указатель мне и отпустите у себя указатель, а я разименую его на safearray-массив структуры типа XLOPER12. Попутно конечно хотелось бы знать эту структуру, на MS почему-то нет по ней информации.
Да скорее всего придется в VBA коде сделать освобождение указателя на массив, но это не проблема.
Изменено: testuser - 18.04.2024 13:27:05
 
Цитата
testuser написал:
MS почему-то нет по ней информации

Скрытый текст


Цитата
testuser написал:
освобождение указателя на массив, но это не проблема.
уверен, что вы не до конца понимаете с чем столкнетесь. Зачем вам это? Как вы с этими данными будете работать?
Не будет там никакого safearrey, это СОМ, не путайте.

Советую к ознакомлению. Memory Management in Excel
Изменено: bedvit - 18.04.2024 13:43:59
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, можно сделать просто в vba получить указатель разименовать, поработать с данными, и отпустить указатель,  как буд-то ни чего не был,  а менеджер памти Excel пусть делает что хочет. В общем на VBa все это не проблемма, главное знать структуру  данных. Структура конечно не очен понятна, со всеми этими юнитами, нельзя ли ее привести к какому-то такому виду?
Код
Private Type tpVariant
    vt As Integer
    r1 As Integer
    r2 As Integer
    r3 As Integer
    pt As LongPtr
    r4 As LongPtr
End Type
 
Цитата
testuser написал:
в vba получить указатель разименовать, поработать с данными, и отпустить указатель,  как буд-то ни чего не был,  а менеджер памти Excel пусть делает что хочет. В общем на VBa все это не проблемма
Теперь все прояснилось, благодарю.
Цитата
testuser написал:
нельзя ли ее привести к какому-то такому виду?
Уверен, что после указателей, вам не составит труда справится и с этой проблемой!
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1
Наверх